请教傻孩子一个更精简的代码思路
下面的函数都是对同一个设备的功能设置,但函数太多,各个函数内部有共同点也有不同点,我的想法是把全部函数能够合在一起用一个函数来代替,这样就显得很精简了,但问题的难点就在于每个函数都有不
同点,想不到什么好的办法来实现这个,所以特来请教傻孩子有什么好的代码思路,下面提供了3个函数
,这3个函数有共同点也有不同点
u8 fun1(u8 n,u8 m)
{
switch(step)
{
case 0:
if(Manu==0)
SetData(SetAuto,0); //发送串口数据设置设备
else
{
Mode=3;
WriteFlash(Mode_Adr,1,&Mode); //写Flash
SendData(ModeSet,Mode);
}
break;
case 1:
if(Manu==0)
{
if(ReciveData==3 || ReciveData==11)
SendData(n,m); //发送串口数据设置设备
else
return 1;
}
else
SendData(n,m); //发送串口数据设置设备
break;
case 2:
return 1;
default:
return 0;
}
step++;
return 3;
}
u8 fun2(u8 m,u8 n)
{
uint8_t i;
switch(step)
{
case 0:
SendData(size,m);
break;
case 1:
SendData(high,0);
if(Cause)
{
if(Mode==0) step++;
}
else
step++;
break;
case 2:
Mode=0;
WriteFlash(Mode_Adr,1,&Mode);
SendData(ModeSet,Mode);
break;
case 3:
SendData(pic,0);
break;
case 4:
Level=ReciveData;
Flash=1;
return 1;
default:
return 0;
}
step++;
return 3;
}
u8 fun3(u8 n,u8 m)
{
switch(step)
{
case 0:
if(far)
SendData(Far,3);
else
SendData(Far,2);
break;
case 1:
if(far)
{
SendData(n,m);
}
else
return 1;
break;
case 2:
return 1;
default:
return 0;
}
step++;
return 3;
}
....................
u8 funn(u8 n,u8 m)
{
....................
} 从黑盒子的角度,假设不看这个设备的逻辑和手册,也不看应用需求,单从已有的逻辑看来这几个函数只是看起来类似,实际上彼此逻辑相差太多...没有分开的必要。最多用函数指针做个消息地图,可以方便扩展和分门别类就行了。
如果真觉得要提取公共部分,现在的代码很难,需要详细的需求文档和设备手册。也就是说,你原有的代码已经吧坑挖好了,并且已经跳下去了... Gorgon_Meducer 发表于 2013-1-28 23:18 static/image/common/back.gif
从黑盒子的角度,假设不看这个设备的逻辑和手册,也不看应用需求,单从已有的逻辑看来这几个函数只是看起来 ...
不是很理解你说的消息地图,能否根据上面三个函数演示下消息地图的代码例子??
“如果真觉得要提取公共部分,现在的代码很难,需要详细的需求文档和设备手册。也就是说,你原有的代码已经吧坑挖好了,并且已经跳下去了...”
那我再看一下能不能增强函数之间的相似度 本帖最后由 Gorgon_Meducer 于 2013-1-29 13:51 编辑
NIC 发表于 2013-1-29 13:43 static/image/common/back.gif
不是很理解你说的消息地图,能否根据上面三个函数演示下消息地图的代码例子??
因为缺乏进一步信息,所以我只能用一个u8型的变量来作为消息——就是起到一个例子作用,希望我表述的足够清楚。
有问题继续交流。
typedef u8 HANDLER(u8 n,u8 m)
typedef struct {
u8 chMSG;
HANDLER *fnHandler;
} msg_item_t;
const msg_item_t c_tMSGMap[] = {
{0x01, &fun1},
{0x02, &fun2},
...
};
HANDER *search_msg_map(u8 chMSG)
{
HANDLER *ptHandler = NULL;
u8 n;
for (n = 0;n < UBOUND(c_tMSGMap); n++) {
if (chMSG == c_tMSGMap.chMSG) {
ptHandler = c_tMSGMap.fnHandler;
break;
}
}
return ptHandler;
}
....
本帖最后由 NIC 于 2013-1-29 14:43 编辑
Gorgon_Meducer 发表于 2013-1-29 13:49 static/image/common/back.gif
因为缺乏进一步信息,所以我只能用一个u8型的变量来作为消息——就是起到一个例子作用,希望我表述的足够 ...
你这部分代码就是将消息变量chMSG通过search_msg_map(u8 chMSG)函数在c_tMSGMap[]这个表中来获取功能函数,但我不知道怎么用的,消息变量chMSG这个值是怎么得到的? 本帖最后由 Gorgon_Meducer 于 2013-1-29 15:33 编辑
NIC 发表于 2013-1-29 14:38 static/image/common/back.gif
你这部分代码就是将消息变量chMSG通过search_msg_map(u8 chMSG)函数在c_tMSGMap[]这个表中来获取功能函数 ...
这里的消息值只是一个例子……告诉你,你可以产生一些消息,根据不同的消息选择不同的处理函数……
例子啊!例子!领会精神啊!说到这个份上了……你居然问我消息的值怎么得到的……5555555555
你要知道,文档、应用和需求都只有你有,你问我消息怎么得到的……我就是神也不知道啊……
页:
[1]