毫無疑問,輸入輸出參數會導致代碼混淆,因爲它們可能會增加意外/不可預測的副作用。總是避免Java中的輸入輸出參數?
所以,很多優秀的程序員說:
避免在出參數變化的可變方法的參數。傾向於保持參數不變。
對於期望他的代碼是最乾淨和可理解的完美主義程序員來說,這個「規則」是否必須適用於所有情況?
例如,假設一個基本的方法將元素添加到一個簡單的列表,有兩種方式:
第一種方式(與IN-OUT參數):
private void addElementsToExistingList(List<String> myList){
myList.add("Foo");
myList.add("Bar");
}
,主叫方是:
List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
addElementsToExistingList(myList);
沒有out參數方式二:
private List<String> addElementsToExistingList(List<String> originalList){
List<String> filledList = new ArrayList<String>(originalList); //add existing elements
filledList.add("Foo");
filledList.add("Bar");
return filledList;
}
和呼叫者的存在:
的第二方式List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
myList.addAll(addElementsToExistingList(myList));
優點:
參數不被修改=>無的意想不到的副作用爲一個新的代碼讀取器的危險。
缺點的第二種方式:
非常詳細,非常不易閱讀...
當然,你會告訴我,因爲這樣做有一個簡單代碼,第一種方式是真的方便多了。但是,如果我們不考慮任何概念/代碼的難度,我會對任何讀者(不管是否是初學者)的第二種方式更合乎邏輯和明顯。
但是,它違反了CQS原則,認爲具有返回類型且沒有副作用的具有無效返回潛在(但允許,因爲它是約定)副作用的「命令」方法和「查詢」方法。
那麼,一個激勵程序員應該採用什麼?兩種符合代碼情況的混合?或者保持「法律」期望始終避免輸入參數...
(當然,添加元素的方法是爲了解釋示例而命名的,並且在實際代碼中是錯誤的名稱選擇)。
我非常同意你的看法,但它代表了一些非常受歡迎的方法(非實驗總是這樣做):)事實上,我讀了很多類似的方法, – Mik378 2012-03-12 19:54:55