NIC 发表于 2013-1-28 09:27:27

请教傻孩子一个更精简的代码思路

下面的函数都是对同一个设备的功能设置,但函数太多,各个函数内部有共同点也有不同点,我的想法是

把全部函数能够合在一起用一个函数来代替,这样就显得很精简了,但问题的难点就在于每个函数都有不

同点,想不到什么好的办法来实现这个,所以特来请教傻孩子有什么好的代码思路,下面提供了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:04

从黑盒子的角度,假设不看这个设备的逻辑和手册,也不看应用需求,单从已有的逻辑看来这几个函数只是看起来类似,实际上彼此逻辑相差太多...没有分开的必要。最多用函数指针做个消息地图,可以方便扩展和分门别类就行了。
如果真觉得要提取公共部分,现在的代码很难,需要详细的需求文档和设备手册。也就是说,你原有的代码已经吧坑挖好了,并且已经跳下去了...

NIC 发表于 2013-1-29 13:43:08

Gorgon_Meducer 发表于 2013-1-28 23:18 static/image/common/back.gif
从黑盒子的角度,假设不看这个设备的逻辑和手册,也不看应用需求,单从已有的逻辑看来这几个函数只是看起来 ...

不是很理解你说的消息地图,能否根据上面三个函数演示下消息地图的代码例子??


“如果真觉得要提取公共部分,现在的代码很难,需要详细的需求文档和设备手册。也就是说,你原有的代码已经吧坑挖好了,并且已经跳下去了...”

那我再看一下能不能增强函数之间的相似度

Gorgon_Meducer 发表于 2013-1-29 13:49:48

本帖最后由 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:38:02

本帖最后由 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:32:26

本帖最后由 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]
查看完整版本: 请教傻孩子一个更精简的代码思路