2014-07-18 17 views
2

說我有一個下面的代碼,可能不是很好的例子,但我只是想到了它;)。這是在java中,更改對象狀態並返回void的函數是一種最佳實踐?

void saveData(Person person) 
{ 
    .... 
    changePerson(person); 
    .... 
    personDAO.save(person); 

} 

void changePerson(Person person) 
{ 
    person.setName("abc"); 
    .... 
} 

我上面的代碼,人有一些數據和changePerson正在改變Person對象的狀態。 這是一個有效的代碼或一個良好的做法?

+1

你在問什麼?它看起來很合理,可能會返回Person,因此它可以被鏈接。 –

回答

2

我認爲最好的答案是「它取決於」。我不能說從你提供的代碼來看它是一種好的還是壞的做法。無論如何,我會和你分享我的看法。 :-)

一般來說,我儘量避免突變(改變)作爲參數傳遞的對象。當你沒有想到它的時候,一個方法改變你的參數,這是令人沮喪的。它可能很難調試。儘可能多的對象應該負責管理自己的狀態。對象不應暴露超過必要的狀態。

但是,他們使用這種技術的軟件模式。請參閱「訪客模式」(http://en.wikipedia.org/wiki/Visitor_pattern)或「雙派」(http://en.wikipedia.org/wiki/Double_dispatch)。

我不認爲返回void或任何其他值是慣用的或甚至有助於解釋參數將會發生變化。

0

我不是判斷你,我的答案可能不是基於某些設計模式或正確的。但是,我在日常工作中編碼時遇到了這種情況,因爲我正在保留我的答案。

根據指南和建議,一個方法應該有一個單一的目標作爲自我描述的名稱。而且你的代碼應該像團隊中的其他人或團隊中的其他人一樣可以重複使用並且易於使用。如果是saveData(「...」),表示它將保存傳遞給此方法的內容。讓其他人不必在方法內部探索你的整個代碼,然後只有他們才知道它實際上在做什麼。如果確實需要使用changePerson()來更改對象,則可以在調用saveData(「...」)之前完成此操作,然後將突變對象傳遞給saveData(「...」)。我並不是說這是一種最佳做法,但是在將來再次使用舊代碼或調試任何問題/錯誤時,這對其他人和您也會有所幫助。