打印

编程之隔离变化之我见

[复制链接]
2359|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfuchi|  楼主 | 2011-9-16 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 linfuchi 于 2011-9-17 11:04 编辑

先贴一段代码
typedef enum{
4To20,   //4-20ma
0To20   //0-20ma
}CurOptType;
typedef struct cur_output CurOutput;
typedef u32 (*pFuncCalCur)( void* pVal );
typedef void (*pFuncCurInit)( void );
typedef void (*pFuncWriteToDev)(void);
typedef u32 (*pFuncCalDaVal)( u32 CurVal );
struct cur_output{
Coordinates*    pCurMapo;
Line*     pCurToDaVall;
CurOptType    Type;

extern pFuncCurInit  pIint;
extern pFuncCalCur   pCalCur;
extern pFuncWriteToDev pWriteToDev;
extern pFuncCalDaVal  pCalDaVal;
};
CurOutput CurOutPutBlk;

相关帖子

沙发
linfuchi|  楼主 | 2011-9-16 17:54 | 只看该作者
本帖最后由 linfuchi 于 2011-9-16 18:32 编辑

这段代码,类似于伪代码,我写代码的时候,一旦有一个思路,就会以较快的速度一气写下个轮廓,不管语法,有时候甚至逆语法而行。所以大家看得时候不要细究语法了。这里我讲下我的思路吧。我要在某个仪表里面写电流输出的功能,范围电流输出被映射成某个范围物理量。
开始的时候我是这么写的:
Adj();
cur = MapToCur(); //物理量映射成电流
daval = caldaval();//转化成DA值,压控的横流源
writetodev();//写到设备,DA芯片
有这些函数,大家应该知道我的思路了。
今天下午纠结了一下午,写出了上面奇怪的代码,过程感觉很是恶心,很是纠结,其间真的是“柔肠百转”,哈哈,写完回头一看,这是什么代码呢,没这么写过!自己也没见过(我刚写代码一年多,又是自己做硬件,花在软件上的心思没多少,也没时间看别人代码)。
接下来说说我是出于啥原因修改这些代码的,然后又怎样生出那些我认为的怪物来的。
看MapToCur()函数,它的输入参数必然是对应的物理量的值咯,生成方法是这样的:
用户会设置物理量跟电流的映射关系,在软件里面根据两点一下的原理,可以计算出任意物理量对应的电流大小,好,请先记住“用户设置”四个字,再看caldaval(),生成方法是如此:单片机输出到DA芯片的数值和电流输出是线性的关系(假设电路符合设计目的的话),先回由Adj函数校出这个线性关系,然后根据MapToCur()得到的电流值,就知道该输出多少DA值咯,请各位先记住“线性关系”,再看writetodev(),实现方法是这样的,调用底层驱动,写到相应的设备咯。请留意下“底层驱动”和“设备”

使用特权

评论回复
板凳
liang7143| | 2011-9-16 18:13 | 只看该作者
不懂LZ在搞什么?

typedef enum{
4To20,   //4-20ma 数字居然可以作为前缀
0To20   //0-20ma
}CurOptType;

使用特权

评论回复
地板
linfuchi|  楼主 | 2011-9-16 18:46 | 只看该作者
本帖最后由 linfuchi 于 2011-9-16 18:50 编辑

再把上面加引号的字眼抠出来,“用户设置”,“线性关系”,“底层驱动”和“设备”。你想想,假设要将这个电流模块的代码移植到另一套仪表上,会出现什么问题呢?用户设置需要**,并且有随时更改的可能性,它必然会存储在某个内存单元(效率)及掉电不丢失的外部或者内部存储单元中,那么移植到另外一台设备上之后,应该要修改这个地址。再看下“线性关系”,线性关系是电路特性的语言描述,它在某个时间范围内事相对固定的,为了使用方便,没必要每次上电都重新校准,也会占据某个内存单元及某个掉电不丢失测存储介质的空间。同理,移植到另一台设备之后,它也是易变的。再分析下”“底层驱动”和“设备”,底层驱动,在不同的平台上接口可能会不一致,除了你们的代码接口规范到了一定的程度,另外,换个设备呢,设备的通讯方式都改变了呢?您又将修改这部分的代码,总之,为了移植到另一台仪表,您必须不停的修改这些代码,而且修改的部分遍及代码的每一部分,甚至大量的是在模块的实现内部,这是很低效的,如果你的代码可读性极差,那么后面维护您代码的人可能会选择重写!这是多么糟糕的事情!

使用特权

评论回复
5
linfuchi|  楼主 | 2011-9-16 19:01 | 只看该作者
本帖最后由 linfuchi 于 2011-9-16 19:27 编辑

好了,上面分析了原因,也同时把易变的部分抽了出来。个人吸收下来的观点:可重复使用---要求可以应对变化和稳定---是良好设计软件的基本要求之一。那么我们接下来要做的就是把这些易变的隔离出来。我的笨拙实现方法是,提供一个Init方法(如下),把这些容易变化的东西交给更高的应用逻辑层来做,由它们实现并且注册,那么,你想想,我们要更改的部分是不是更少了,稳定的部分所占的份额是不是更大了?
void CUR_Init( Coordinates* pCurMapo, Line* pDaValToCurl, pFuncWriteToDev WriteToDev )
{
        CurOutPutBlk.pCurMapo = pCurMapo;
        CurOutPutBlk.pCurToDaVall = pDaValToCurl;
        CurOutPutBlk.pWriteToDev = WriteToDev;
}
那么使用这个模块的人,只需调用该方法,注册下即可用了,使用范例如下:
void CurOutputPoll( void* pVal  ) //对应的物理量可能不会数据都一致,所以船只真
{
        u32 CurVal;
        u32 DaValToWrite;
        
        CurVal = CurOutPutBlk.pCalCur(pVal);
        if( CurVal > 2000 )
        {
                CurVal = 2010;//这值能到多少?
        }
        DaValToWrite = CurOutPutBlk.pCalDaVal( CurVal );
        CurOutPutBlk.pWriteToDev();
}

使用特权

评论回复
6
linfuchi|  楼主 | 2011-9-16 19:07 | 只看该作者
本帖最后由 linfuchi 于 2011-9-16 19:35 编辑

我在这边写的仅仅是一个纠结于很多细节的过程,也写出了修改代码的原因。我想,不管我的实现方式是如何的低劣,我的目的总是好的吧,希望各位拍砖时下手轻点,我也是年轻人呐,还忘各位老鸟别过分摧残,留点火种,但也希望各位指点迷津,(我不知道这样的纠结是否有利于我的发展,也不知道这样的纠结是否有益处)这是我写这篇帖子的目的之一。

使用特权

评论回复
7
linfuchi|  楼主 | 2011-9-16 19:17 | 只看该作者
本帖最后由 linfuchi 于 2011-9-17 10:46 编辑

还没吃饭,5:30下班,一直写到现在,脑子晕晕的,也没心情回头看了,不知道敲错了多少字,就此搁键盘。回家吃饭,晚上下象棋,最近新手我迷上象棋了,建乐一个QQ群,欢迎喜欢编程的新手,痴迷代码的老鸟,喜欢模拟的新手,精通电子的老鸟加入进来,大家玩,学习两不误。很愤愤的是我在模拟版块发了个邀请加入我QQ群的帖子,被删除了,实在想不明白,难道21IC还不让平民说话了,比天朝还文明,这都和谐!天朝还有小偷,jnv,我只不过再这边举聚众娱乐下,就遭此横祸,不知道模拟板块的版主是怎么想的,希望匠人主持公道!如果匠人等觉得我这个行为违背了21IC的哪条律法,还望指明,敢当受罚!21IC象棋爱好者群(175381365)
送给他们:绝对的权力——绝对的腐败!你手里的大刀很大,威力也很大!

使用特权

评论回复
8
linfuchi|  楼主 | 2011-9-16 19:26 | 只看该作者
#3楼,请看我第一句话
我写代码的时候,一旦有一个思路,就会以较快的速度一气写下个轮廓,不管语法,有时候甚至逆语法而行。所以大家看得时候不要细究语法了。
我喜欢第一遍记录思路,跟说话一样写,写小说一样写!不过还是谢谢您的提醒

使用特权

评论回复
9
liang7143| | 2011-9-17 09:07 | 只看该作者
有点明白这个帖子了
建议LZ改个标题  以吸引更多的观众

使用特权

评论回复
10
linfuchi|  楼主 | 2011-9-17 09:59 | 只看该作者
9# liang7143
该改成啥名字呢?

使用特权

评论回复
11
liang7143| | 2011-9-17 16:44 | 只看该作者
9# liang7143  
该改成啥名字呢?
linfuchi 发表于 2011-9-17 09:59

还是没人来顶
O(∩_∩)O哈哈~

使用特权

评论回复
12
linfuchi|  楼主 | 2011-9-17 17:50 | 只看该作者
11# liang7143
哈哈,菜鸟写的,无人问津当属正常了

使用特权

评论回复
13
NE5532| | 2011-9-17 21:25 | 只看该作者
还没吃饭,5:30下班,一直写到现在,脑子晕晕的,也没心情回头看了,不知道敲错了多少字,就此搁键盘。回家吃饭,晚上下象棋,最近新手我迷上象棋了,建乐一个QQ群,欢迎喜欢编程的新手,痴迷代码的老鸟,喜欢模拟的 ...
linfuchi 发表于 2011-9-16 19:17


说明几点:
a. 21IC版主非网站雇员,属义务劳动,删帖无奖金,故无腐败之嫌疑
b. 技术版面请勿发表非技术问题,鉴于还没有任何一家半导体公司生产“象棋”,故偶个人判断“象棋”不属于模拟电路范围。
c. 21IC BBS为大家提供了非技术版面供交流,请参看左侧“非技术讨论区”栏目,咱这里不能搞成猫扑了是吧。
d. 如认为帖子管理不当,请在21IC发展大家谈内投诉,若总斑竹认为判罚不当,偶会道歉。

谢谢支持!

使用特权

评论回复
14
linfuchi|  楼主 | 2011-9-17 22:55 | 只看该作者
13# NE5532
21IC BBS为大家提供了非技术版面供交流,请参看左侧“非技术讨论区”栏目,咱这里不能搞成猫扑了是吧。
原来我的不是,这边道歉,还望大侠勿介怀!

使用特权

评论回复
15
NE5532| | 2011-9-18 08:01 | 只看该作者
没关系,你又不是恶意发广告哪种,你看以后不是都知道去那里发了三。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

474

帖子

1

粉丝