最近,我正在與另一位程序員討論重構一個充滿「if」語句的巨大(1000行)方法的最佳方式。責任鏈與類列表的優點是什麼?
該代碼是用Java編寫的,但我想這個問題也可能發生在其他語言中,例如C#。
爲了解決這個問題,他建議使用責任鏈模式。 他建議有一個「Handler」類的基礎。然後,「Handler1」,「Handler2」等將擴展「Handler」。
然後,處理程序將有一個「getSuccessor」方法,它將返回null(如果它是鏈的最後一個)或鏈的下一個Handler。
然後,一個「handleRequest(Request)」函數可以處理Request,或者將它傳遞給下一個鏈,如果以前的解決方案都沒有工作,它將返回null或拋出異常。
要添加一個新的處理程序到鏈中,編碼器將轉到鏈的最後一個元素,並告訴它有一個新的元素。要做一些事情,他只需要在鏈的第一個元素上調用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
或者,以防止代碼重複,一「的parseRequest(請求)」方法可以加入到集合類。 要添加一個新的處理程序,可以使用集合構造函數(或靜態{}塊或其他等價物),只需添加代碼「addHandler(new Handler3());」。
確切地說,我錯過了這種方法的責任鏈究竟有哪些優勢?哪種方法最好(假設有是最好的方法)?爲什麼?每種設計方法會產生哪些潛在的錯誤和問題?
對於那些誰需要語境,這裏看起來像原來的代碼是什麼:
if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.
非常深的遞歸不應該是一個問題。它相對較小(遠不止堆棧溢出系統所需的數千個方法調用)。 – luiscubal 2009-06-28 18:22:39