lewlee的博客

lewlee的博客

导航

代码重构案例-提取switch case语句

在做项目的时候,经常会遇到switch case语句。其中有个问题就是其中的case太多,在部门经常提到被广泛应用,故在此总结出来。

比如:看到之前的报表界面上的菜单上的按钮都是通过这样来实现,代码可能的示例如下

View Code
private static void doSome(string mnuName)
{
switch (mnuName.ToUpper())
{
case "OPEN":
//todo
break;
case "NEW":
//todo
break;
case "COPY":
//todo
break;
case "PASTE":
//todo
break;
case "UNDO":
//todo
break;
case "REDO":
//todo
break;
default:
//todo
break;
}
}


这里的每个case中做了很复杂的逻辑处理,一屏幕是显示不完个case完整代码的,但经过重构后,即将每个case的语句封装成一个个方法。就是下面的如下样例:

View Code
private static void doSome(string mnuName)
{
switch (mnuName.ToUpper())
{
case "OPEN":
Open();
break;
case "NEW":
New();
break;
case "COPY":
Copy();
break;
case "PASTE":
Paste();
break;
case "UNDO":
Undo();
break;
case "REDO":
Redo();
break;
default:
//todo
break;
}
}

 

经过这样就清晰多了,但case同样太多,于是发现每个函数都有共性:无参且无返回值,就将他们定义成相同签名的委托Action。

故将其存入到字典中

private static Dictionary<string, Action> dctAction = new Dictionary<string, Action>();
dctAction.Add("open".ToUpper(), Open);
dctAction.Add("new".ToUpper(), New);
dctAction.Add("copy".ToUpper(), Copy);
dctAction.Add("paste".ToUpper(), Paste);
dctAction.Add("undo".ToUpper(), Undo);
dctAction.Add("redo".ToUpper(), Redo);

于是doSome的方法到如下:

        private static void doSome(string mnuName)
{
Action action = null;
if (dctAction.TryGetValue(mnuName.ToUpper(), out action))
{
action();
}
}



此方法既简单又明了。

posted on 2012-01-04 23:25  lewlee  阅读(829)  评论(1)    收藏  举报