最近,我与另一个程序员讨论重构一个巨大的(1000线)方法十足的“if”语句的最佳途径。
该代码是用Java编写的,但我想这个问题可以在其他语言如C#中发生为好。
为了解决这个问题,他建议使用链的责任模式。 他提出了具有一基地“处理程序”类。 那么, “Handler1”, “Handler2” 等将扩大 “处理程序”。
然后,处理程序将有一个“getSuccessor”方法,它要么返回null(如果它是最后一个链的)或链的下一个处理程序。
然后,“的handleRequest(请求)”功能,要么处理请求,或者将它传递给下一个链条,如果没有以前的解决方案的工作,它将返回空值只是或抛出异常。
若要将新处理器加入连锁,编码器会去链条的最后一个元素,并告诉它有一个新的元素。 做一些事情,他只需要调用的handleRequest链的第一个元素。
为了解决这个问题,我建议用不同的方法。
我有一个基地“处理程序”类为好,以“Handler1”,“Handler2”,就像前面提到的方法。
然而,就没有“getSuccessor”的方法。 相反,我有一个集合类的处理程序列表(矢量,一个ArrayList,或什么是最好在这种情况下)。
这个handleRequest功能仍然存在,但它不会传播调用next处理程序。 它只是处理请求或返回null。
为了处理一个请求,一个会用
for(Handler handle : handlers){
result = handle.handleRequest(request);
if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach
或者,为了防止代码重复,一“的parseRequest(请求)”方法可以加入到集合类。 要添加新的处理程序,一个会去收集构造函数(或静态{}块,或某事equivaleng),只需添加代码“addHandler操作(新Handler3());”。
究竟是什么优势链方面的责任,我会用这种方法缺少什么? 哪种方法最好(假设有一个最好的方法)? 为什么? 有什么潜在的bug,并可以各自设计方法造成的问题?
对于那些谁需要语境,这里看上去像什么的原代码:
if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.