搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 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[2]==3 || ReciveData[2]==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)
{
   ....................

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入296汤圆

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

出0入0汤圆

 楼主| 发表于 2013-1-29 13:43:08 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-28 23:18
从黑盒子的角度,假设不看这个设备的逻辑和手册,也不看应用需求,单从已有的逻辑看来这几个函数只是看起来 ...

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


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

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

出0入296汤圆

发表于 2013-1-29 13:49:48 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-1-29 13:51 编辑
NIC 发表于 2013-1-29 13:43
不是很理解你说的消息地图,能否根据上面三个函数演示下消息地图的代码例子??


因为缺乏进一步信息,所以我只能用一个u8型的变量来作为消息——就是起到一个例子作用,希望我表述的足够清楚。
有问题继续交流。

  1. typedef u8 HANDLER(u8 n,u8 m)

  2. typedef struct {
  3.      u8 chMSG;
  4.      HANDLER *fnHandler;
  5. } msg_item_t;

  6. const msg_item_t c_tMSGMap[] = {
  7.         {0x01, &fun1},
  8.         {0x02, &fun2},
  9.         ...
  10.         
  11.     };


  12. HANDER *search_msg_map(u8 chMSG)
  13. {
  14.     HANDLER *ptHandler = NULL;
  15.     u8 n;
  16.     for (n = 0;n < UBOUND(c_tMSGMap); n++) {
  17.         if (chMSG == c_tMSGMap[n].chMSG) {
  18.              ptHandler = c_tMSGMap[n].fnHandler;
  19.              break;
  20.         }
  21.     }

  22.     return ptHandler;
  23. }
  24. ....

复制代码

出0入0汤圆

 楼主| 发表于 2013-1-29 14:38:02 | 显示全部楼层
本帖最后由 NIC 于 2013-1-29 14:43 编辑
Gorgon_Meducer 发表于 2013-1-29 13:49
因为缺乏进一步信息,所以我只能用一个u8型的变量来作为消息——就是起到一个例子作用,希望我表述的足够 ...


你这部分代码就是将消息变量chMSG通过search_msg_map(u8 chMSG)函数在c_tMSGMap[]这个表中来获取功能函数,但我不知道怎么用的,消息变量chMSG这个值是怎么得到的?

出0入296汤圆

发表于 2013-1-29 15:32:26 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-1-29 15:33 编辑
NIC 发表于 2013-1-29 14:38
你这部分代码就是将消息变量chMSG通过search_msg_map(u8 chMSG)函数在c_tMSGMap[]这个表中来获取功能函数 ...


这里的消息值只是一个例子……告诉你,你可以产生一些消息,根据不同的消息选择不同的处理函数……
例子啊!例子!领会精神啊!说到这个份上了……你居然问我消息的值怎么得到的……5555555555

你要知道,文档、应用和需求都只有你有,你问我消息怎么得到的……我就是神也不知道啊……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 01:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表