我搜索了很多关于重构大型 switch 的文章陈述。

但他们不做我想做的事。问题我要去要运行的是有一个巨大的 switch 语句,它根据两个不同的值调用不同的方法,比如说 type和一个 code .

目前,我会处理这样的情况:

switch (type) 
{ 
    case Types.Type1: 
        handleType1(code); 
        break; 
 
    case Types.Type2: 
        handleType2(code); 
        break; 
} 
 
void handleTypeN(code) 
{ 
    switch (code) 
    { 
       ... 
    } 
} 

也许结合工厂和命令模式的东西会帮助我?我一定遗漏了一些明显的东西。

你会如何重构这段代码?

我可能需要更具体地了解我面临的情况。

我正在从服务器接收数据包。一个数据包包含一个类型和一个代码以及一些特定的信息。

数据一到达我就检索 typecode数据包,它进入 switch type 声明,在弄清楚 type 之后调用特定方法对 code进行切换的数据包。

处理代码的方法现在进一步解码数据包并完成该过程。
+----------+                +----------+ 
|          |     Packet     |          | 
|  Server  | -------------> |  Client  | 
|          |                |          | 
+----------+                +----------+ 
                                  | 
                                  | 
         (Switch on the type of the packet and call a specific method) 
                                  | 
                                  | 
         (Switch on the code of the packet and call a specific method) 
                                  | 
                                  | 
                    (Respond to the server or not) 

请您参考如下方法:

2 模式进入脑海:命令和访问者:
http://en.wikipedia.org/wiki/Command_pattern
http://en.wikipedia.org/wiki/Visitor_pattern

Abstract Class Command { 
 
 executeSomething(); 
 
} 
Class typeN extends command { 
 
   executeSomething() { 
    //... 
   } 
} 
 
Class typeM extends command { 
 
   executeSomething() { 
    //... 
   } 
} 
 
replace your switch by : 
//my old switch 
class commandManager { 
 
processCommand() { 
for listOf command in a command buffer 
{  
 onCommand(listOfcommand.command) 
} 
} 
 onCommandPoped(command type) { 
  type.executeSomething() 
 } 
 
} 
 
you can pass parameters to executeSomething, and you can pass another command 
 
 
the client code :  
 
{ 
 commandN = new CommandN() 
 commandManager.postCommand( commandN) 
} 

阅读您的数据包服务器用例后,我认为您可以使用策略模式的变体
http://www.oodesign.com/strategy-pattern.html
您选择在数据包到达时调用的策略
你可以用工厂来 build 它。

但你不会杀死你的开关盒

请记住,一个服务器可以为多个客户端提供服务。如果可能是您的 switch case 比对象实例化更快。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!