首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于switch case如何优化代码

2013-08-04 
关于switch case怎么优化代码啊大家都知道一个语句代码太多,维护会不方便,且难以理解。这个时候我们就要用

关于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,换做其他的语句代替它。
[解决办法]
 这个我觉得得用函数表什么的解决吧
 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;


}


[解决办法]
如果只是想便于维护的话就用工厂模式,给你个案例吧,我也是重网上看的
public partial class Optimization : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Employee emp = Employee.GetEmployee(EmployeeType.ENGINEER);
            label_Show.Text += emp.GetDescription();
            label_Show.Text += emp.PayAmount().ToString();
        }
    }


    public enum EmployeeType
    {
        ENGINEER,
        SALESMAN,
        MANAGER
    }

    public abstract class Employee
    {
        protected int basicSalary;
        protected int commission;
        public static Employee GetEmployee(EmployeeType empType)
        {
            switch (empType)
            {
                case EmployeeType.ENGINEER:
                    return new Enginessr();
                case EmployeeType.SALESMAN:
                    return new SalesMan();
                case EmployeeType.MANAGER:
                    return new Manager();
                default:
                    throw new Exception("no such employee type!");


            }
        }

        public abstract int PayAmount();
        public abstract string GetDescription();
    }

    public class Enginessr : Employee
    {
        public override int PayAmount()
        {
            return basicSalary;
        }
        public override string GetDescription()
        {
            return "Coding, Debug, Optimization";
        }
    }

    public class SalesMan : Employee
    {
        public override int PayAmount()
        {
            return basicSalary + commission;
        }
        public override string GetDescription()
        {
            return "Getting contranct";
        }
    }

    public class Manager : Employee
    {
        public override int PayAmount()
        {
            return 2 * basicSalary;
        }
        public override string GetDescription()
        {
            return "Analysis, Scheduling, Reporting";
        }
    }


[解决办法]
http://roshanca.com/switch-case-considered-harmful/

楼主看看这个。command模式重构switch case 代码块


[解决办法]
建议lz用上泛型和反射机制可以解决……
[解决办法]
建议使用查表法

热点排行