類成員變量應該如何與類方法結合使用?類成員變量,方法及其狀態
比方說,我有一個類'C'與成員變量'someData'。
我打電話C.getData(),它沒有返回值,而是把數據C.someData。實例化'C'的類首先調用C.getData,然後通過訪問成員變量C.someData來使用數據。
我在實例化'C'的類中調用C.getData(),它是一個返回數據的函數。
我自己更喜歡第二種方式。但這也取決於情況,這是一個小小的差異。具有依賴於類內部狀態的類方法是'壞'嗎?什麼是最好的約定?
類成員變量應該如何與類方法結合使用?類成員變量,方法及其狀態
比方說,我有一個類'C'與成員變量'someData'。
我打電話C.getData(),它沒有返回值,而是把數據C.someData。實例化'C'的類首先調用C.getData,然後通過訪問成員變量C.someData來使用數據。
我在實例化'C'的類中調用C.getData(),它是一個返回數據的函數。
我自己更喜歡第二種方式。但這也取決於情況,這是一個小小的差異。具有依賴於類內部狀態的類方法是'壞'嗎?什麼是最好的約定?
C.someData應該是一個只有公共獲取的屬性。第一次調用C.someData時,可以將值延遲加載到someData中。
public class C
{
public C() { }
string someData = string.Empty;
public string SomeData
{
get
{
if (string.IsNullOrEmpty(someData))
this.LoadSomeData();
return someData;
}
}
private void LoadSomeData()
{
this.someData = "Hello world";
}
}
大家對此有看法,但我在經驗上看到的是國家是邪惡的。國家強制你在理解一個階級的行爲方式時需要考慮更多的信息,因爲它的行爲現在已經受到國家的隱含影響。避免它像你的表現讓你一樣多。我強烈支持你提到的第二種方式。第一種方式可能會導致錯誤和頭痛。
一般來說,我見過的一些最糟糕的方法有如void DoSomething()
這樣的簽名:它不需要參數並且不返回任何值。該方法的全部重點在於其副作用,如果該方法命名不當,則可能不明顯。
第一種方式對別人有多明顯?有沒有什麼有意義的東西叫getData
,實際上並沒有返回任何數據? getData
是否有意義操縱對象的狀態?有時,是的,爲了緩存而操縱對象是合理的。但是操縱這個對象來存儲你實際應該返回的值是在尋求麻煩。
如果你真的覺得你必須與第一個版本去,至少把它的東西更準確的像void calculateValue()
甚至void calculateCachedValue()
這說明它真的不應該返回任何東西,它的全部目的是計算別的東西。
說得好。 @CodeMonky:由其他開發人員進行代碼審查,並將重構插件重構到VS IDE,比如DevExpress CodeRush可以幫助識別最佳方法並減少快速更改代碼所需的工作量。好的命名和一致的編碼是持續支持代碼庫的關鍵。 – 2010-05-27 11:38:43