2010-05-27 57 views
0

類成員變量應該如何與類方法結合使用?類成員變量,方法及其狀態

比方說,我有一個類'C'與成員變量'someData'。

  1. 我打電話C.getData(),它沒有返回值,而是把數據C.someData。實例化'C'的類首先調用C.getData,然後通過訪問成員變量C.someData來使用數據。

  2. 我在實例化'C'的類中調用C.getData(),它是一個返回數據的函數。

我自己更喜歡第二種方式。但這也取決於情況,這是一個小小的差異。具有依賴於類內部狀態的類方法是'壞'嗎?什麼是最好的約定?

回答

1

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"; 
    } 
} 
3

大家對此有看法,但我在經驗上看到的是國家是邪惡的。國家強制你在理解一個階級的行爲方式時需要考慮更多的信息,因爲它的行爲現在已經受到國家的隱含影響。避免它像你的表現讓你一樣多。我強烈支持你提到的第二種方式。第一種方式可能會導致錯誤和頭痛。

一般來說,我見過的一些最糟糕的方法有如void DoSomething()這樣的簽名:它不需要參數並且不返回任何值。該方法的全部重點在於其副作用,如果該方法命名不當,則可能不明顯。

第一種方式對別人有多明顯?有沒有什麼有意義的東西叫getData,實際上並沒有返回任何數據? getData是否有意義操縱對象的狀態?有時,是的,爲了緩存而操縱對象是合理的。但是操縱這個對象來存儲你實際應該返回的值是在尋求麻煩。

如果你真的覺得你必須與第一個版本去,至少把它的東西更準確的像void calculateValue()甚至void calculateCachedValue()這說明它真的不應該返回任何東西,它的全部目的是計算別的東西。

+0

說得好。 @CodeMonky:由其他開發人員進行代碼審查,並將重構插件重構到VS IDE,比如DevExpress CodeRush可以幫助識別最佳方法並減少快速更改代碼所需的工作量。好的命名和一致的編碼是持續支持代碼庫的關鍵。 – 2010-05-27 11:38:43