日期:2014-05-17  浏览次数:21924 次

关于switch case怎么优化代码啊
大家都知道一个语句代码太多,维护会不方便,且难以理解。这个时候我们就要用到重构,请问switch case语句怎么重构呢,怎么优化这样的代码,给个链接也可以,要有效才行,立即给分。
下面是一个例子
int i;
switch(i)
{
case 0;
DoResult(i);
break;

case 1:
Doresult(i);
break;

case 2:
DoResult(i);
break;

.....
下面有一百个这样的case语句
}
//DoResult()是一个函数,其实这里应该有一个返回值吧,简单点,大家懂就行。


当case太多的时候,显然不合理。这里的重复代码太多,麻烦大家想一下,怎么能去掉这个switch case,换做其他的语句代替它。
switch 重构 性能优化

------解决方案--------------------
《代码大全2》 中说可以使用字典来代替N多If else
.NET还有linq 是非常爽歪歪的事情
Dictionary<int,委托> dic=new Dictionary<int,委托>()
dic.Add(1,DoResult);
dic.Add(2,DoResult);

var fun=dic.Single(x=>x.Key==N);
var result = fun(arg);

没有试过,你自己试试~
------解决方案--------------------
 这个我觉得得用函数表什么的解决吧
 wireshark内部有好多表,用来解析协议。
 比如,tcp的端口字段,每个端口可能代表一种应用层协议
 它就不是switch/case的
 而是维护一张表(应该是hash吧),每个上层协议将它的端口值和对应的解析函数地址注册到此表中。


------解决方案--------------------
我8楼说法的简单模拟:


// action声明
typedef void (*Action) (void);

// action 1, case 1时执行
void do_1()
{
    cout << "action 1" << endl;
}

// action 2, case 2时执行
void do_2()
{
    cout << "action 2" << endl;
}

// action选择器
void do_action(Action table[], int i)
{
    table[i-1]();
}


int main()
{
    // action表
    Action table[2];
    // 各case值注册到action表
    table[0] = do_1;
    table[1] = do_2;

    // 根据值执行相应的action
    do_action(table, 1);

    return 0;