我有一个要重构的“遗留”代码。
该代码基本上对服务器进行远程调用并返回回复。然后根据回复相应执行。
代码框架示例:
public Object processResponse(String responseType, Object response) {
if(responseType.equals(CLIENT_REGISTERED)) {
//code
//code ...
}
else if (responseType.equals(CLIENT_ABORTED)) {
//code
//code....
}
else if (responseType.equals(DATA_SPLIT)) {
//code
//code...
}
etc
问题是有很多很多 if/else 分支,每个 if 里面的代码都不是微不足道的。
所以它变得很难维护。
我想知道最好的模式是什么?
我的一个想法是创建一个方法名称与 responseType 相同的对象,然后在 processResponse 中使用反射调用与 responseType 名称相同的方法。
这将清理 processResponse 但它会将代码移动到具有许多/许多方法的单个对象,我认为反射会导致性能问题。
有没有好的设计方法/模式来解决这个问题?
最佳答案
两种方法:
- 策略模式 http://www.dofactory.com/javascript/strategy-design-pattern
- 创建字典,其中键是元数据(在您的例子中元数据是 responseType),值是一个函数。
例如:
把它放在构造函数中
responses = new HashMap<string, SomeAbstraction>();
responses.Put(CLIENT_REGISTERED, new ImplementationForRegisteredClient());
responses.Put(CLIENT_ABORTED, new ImplementationForAbortedClient());
哪里ImplementationForRegisteredClient
和 ImplementationForAbortedClient
实现 SomeAbstraction
并通过
responses.get(responseType).MethodOfYourAbstraction(SomeParams);
如果你想遵循DI的原则,你可以在你的客户端类中注入(inject)这个Dictionary。
关于java - 一长串 if/else/execute 代码分支的最佳设计模式/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916857/