关于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";
}
}
[解决办法]
建议lz用上泛型和反射机制可以解决……
[解决办法]
建议使用查表法