最近,我正在与另一个程序员讨论重构一个充满"if"语句的巨大(1000行)方法的最佳方法.
代码是用Java编写的,但我想这个问题也可能发生在C#等其他语言中.
为了解决这个问题,他建议使用责任链模式.他建议有一个基础"处理程序"类.然后,"Handler1","Handler2"等将扩展"Handler".
然后,处理程序将具有"getSuccessor"方法,该方法将返回null(如果它是链的最后一个)或链的下一个Handler.
然后,"的handleRequest(请求)"功能,要么处理请求,或者将它传递给下一个链条,如果没有以前的解决方案的工作,它将返回空值只是或抛出异常.
要向链中添加新的Handler,编码器将转到链的最后一个元素并告诉它有一个新元素.要做某事,他只需要在链的第一个元素上调用handleRequest.
为了解决这个问题,我建议使用不同的方法.
我还有一个基础"Handler"类,带有"Handler1","Handler2",就像之前提到的方法一样.
但是,没有"getSuccessor"方法.相反,我有一个Collection类,其中包含一个处理程序列表(Vector,一个ArrayList,或者在这种情况下最好的).
handleRequest函数仍然存在,但它不会将调用传播给下一个处理程序.它只会处理请求或返回null.
要处理请求,可以使用
for(Handler handle : handlers){
result = handle.handleRequest(request);
if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach
Run Code Online (Sandbox Code Playgroud)
或者,为了防止代码重复,可以将"parseRequest(request)"方法添加到集合类中.要添加一个新的处理程序,可以转到集合构造函数(或static {}块,或者等价物)并简单地添加代码"addHandler(new Handler3());".
对于这种方法,我错过了什么样的责任链优势?哪种方法最好(假设是一个最好的方法)?为什么?每种设计方法可能导致哪些潜在的错误和问题?
对于那些需要上下文的人来说,这是原始代码的样子:
if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.
Run Code Online (Sandbox Code Playgroud)