一个判断,大家怎么写?
[解决办法]
欲减少代码,使代码简洁清晰,通常的做法是提高抽象层次,有个著名的FTSE原则,就是软件开发遇到的任何问题,都可以通过增加一层封装去解决。封装的方法有很多种,可以通过模板、函数等,但对于楼主的情况,比较适合的方法是用宏进行封装,我写个例子:
#define IF_GOTO( A, B ) do{ if( A == parm1 && B == parm2 ) goto A##_##B; }while(0)
使用的时候可以这样:
IF_GOTO( 0, 0 );
IF_GOTO( 0, 1 );
……
这样就清晰简洁得多了。
[解决办法]
void jump(int parm1, int parm2)
{
if ( 0 == parm1 && 0 == parm2)
// ... jump1_0()
else if ( 1 == parm1 && 2 == parm2)
// ... jump1_2();
else if ( 100 == parm1 && 1000 == parm2)
// ... jump100_1000();
// ...很长,100多条判断,而且数字大小不定
}
自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK! [推荐] [C/C++ C语言]
http://bbs.csdn.net/topics/380157851
[解决办法]
你们都太不靠谱了.....
当量很大的时候 居然还用switch .....疯了
我一般的做法
谨以29个函数的调用来做个示范
#include <stdint.h>
#include <stdio.h>
uint32_t jump00(){return 0;}//par1 =0 par2=0
uint32_t jump01(){return 1;}
uint32_t jump02(){return 2;}
uint32_t jump03(){return 3;}
uint32_t jump04(){return 4;}
uint32_t jump05(){return 5;}
uint32_t jump06(){return 6;}
uint32_t jump07(){return 7;}
uint32_t jump08(){return 8;}
uint32_t jump09(){return 9;}//par1=0 par2=9
uint32_t jump10(){return 10;} //par1=1 par2=0
uint32_t jump11(){return 11;}
uint32_t jump12(){return 12;}
uint32_t jump13(){return 13;}
uint32_t jump14(){return 14;}
uint32_t jump15(){return 15;}
uint32_t jump16(){return 16;}
uint32_t jump17(){return 17;}
uint32_t jump18(){return 18;}
uint32_t jump19(){return 19;}//par1=1 par2=9
uint32_t jump20(){return 20;}//par1=2 par2=0
uint32_t jump21(){return 21;}
uint32_t jump22(){return 22;}
uint32_t jump23(){return 23;}
uint32_t jump24(){return 24;}
uint32_t jump25(){return 25;}
uint32_t jump26(){return 26;}
uint32_t jump27(){return 27;}
uint32_t jump28(){return 28;}
uint32_t jump29(){return 29;}//par1=2 par2=9
//以30个函数为例子
typedef uint32_t (*jumpfun)();
struct jumpTable
{
int32_t par1;
int32_t par2;
//通过参数一和参数二 来调用相应函数
jumpfun fun;
};
jumpTable jumpTables[]=
{
{0,0,jump00},
{0,1,jump01},
{0,2,jump02},
{0,3,jump03},
{0,4,jump04},
{0,5,jump05},
{0,6,jump06},
{0,7,jump07},
{0,8,jump08},
{0,9,jump09},
{1,0,jump10},
{1,1,jump11},
{1,2,jump12},
{1,3,jump13},
{1,4,jump14},
{1,5,jump15},
{1,6,jump16},
{1,7,jump17},
{1,8,jump18},
{1,9,jump19},
{2,0,jump20},
{2,1,jump21},
{2,2,jump22},
{2,3,jump23},
{2,4,jump24},
{2,5,jump25},
{2,6,jump26},
{2,7,jump27},
{2,8,jump28},
{2,9,jump29},
};
#define ARRAY_SIZE(Array) (sizeof(Array)/sizeof(Array[0]))
#define JUMP_MAX_SIZE ARRAY_SIZE(jumpTables)
//方法一 遍历大法
//优点 简单..易用
//缺点 慢
uint32_t jump(int par1,int par2)
{
for (int i=0;i!=JUMP_MAX_SIZE;i++)
{
if (jumpTables[i].par1==par1&&jumpTables[i].par2==par2)
{
return jumpTables[i].fun();
}
}
return 0xffffffff;
}
int main()
{
int i,j;
printf("请输入2个调用函数的参数");
scanf("%d%d",&i,&j);
uint32_t result=jump(i,j);
if (result==0xffffffff)
{
printf("not find fun");
return 0xffffffff;
}
printf("%u",result);
//突然有一天你需要加入新的参数 100 100
//只需要改下那个表的源代码内容 以及关联的函数
//头文件不变
//而且你再也不用手工写if switch了 ...
//再也不用改实现代码了
}