2011-01-14 279 views
3

編寫不帶參數且有副作用,改變對象狀態或帶參數並處理它的單參數方法的方法會更好嗎?如果第二種方法更可取,那麼最好是顯式地返回輸入參數還是僅僅處理它,因爲調用者應該有一個對它的引用。輸入輸出參數與不帶副作用的參數

更確切地說:我正在處理XML並閱讀了第一章的Clean Code book我試圖將大處理方法拆分爲許多小方法,因此這種方法可以像故事那樣讀取:

cleanHeader(); 

extractMetaInfo(); 

appendStuff(); 

等等,其中這些方法都是對作爲成員存儲的XML文檔進行操作。

恕我直言,減少參數計數與沒有副作用的最佳做法似乎在這裏相互矛盾。如下寫作會更好嗎?

doc = cleanHeader(doc); 

doc = extractMetaInfo(doc); 

doc = appendStuff(doc); 

在這個問題上是否有明確的「正確」?一個明確的答案依賴於多少上下文?還是有第三種選擇我沒有想過?

編輯:發現一個related question與矛盾的答案。謹慎闡述?

+1

副作用是所有邪惡的母親。甚至沒有得到接近。 – leppie 2011-01-14 09:11:06

+0

謝謝你,leppie。這是相當明確:)並且似乎非常合理。你能否提供一個鏈接/其他信息來支持你的判斷?最好是返回原始的論點還是改變它的「功能風格」,即,含蓄? – kostja 2011-01-14 09:17:59

+0

我強烈推薦閱讀Joshua Bloch撰寫的「有效的Java」一書 - 他在這個具體問題中投票反對(使用參數)。在一般布洛赫prefere無國籍班不同的原因(性能和可用性)。 @kostja - 你可以用它作爲leppie語句的參考 – Ralph 2011-01-26 16:26:09

回答

1

如果您的algothimen可以被多個線程並行使用,那麼在乾淨的代碼簿(statfull但沒有參數)中推薦的方式將不起作用。在這種情況下,您必須使用參數方式!

0

我會從面向對象的設計角度來討論這一點。如果你有一大堆方法對doc這樣的對象進行操作,那麼你可能需要一個包裝該對象的類,並將行爲封裝到一個bigProcessingMethod()中,該對象調用更小的處理方法,以便進一步分解任務。

public class DocUtil { private String doc;

public DocUtil(String doc) 
{ 
    this.doc = doc; 
} 

public bigProcessingMethod() 
{ 
    cleanHeader(doc); 

extractMetaInfo(doc); 

appendStuff(doc); 

} 

//等。 }

我誤解了你的問題。我沒有意識到你已經在像DocUtil這樣的包裝類中。

無論您是否將doc變量顯式傳遞給每個處理方法,您都在同一個內存位置上處理同一個對象。我每次通過它的唯一原因是明確表示這些是可變文檔工作的方法。

這取決於你。