2011-01-14 61 views
1

比方說,我有下面的類:類中使用自己的getter/setter方法

class MyClass 
{ 
    private: 

    int Data; 

    public: 

    MyClass(int Init) 
    { 
     Data = Init; 
    } 

    int GetData() const 
    { 
     return Data; 
    } 
}; 

現在,讓我們說,我想補充一點,檢查是否Data等於零的方法。有兩種方法來實現:

bool DataIsZero() const 
{ 
    return Data == 0; 
} 

或者:

bool DataIsZero() const 
{ 
    return GetData() == 0; 
} 

這被認爲是更好的做法?我可以看到如何使用變量本身可以提高可讀性,但使用getter可能會使代碼更容易維護。

+2

一個文體筆記是,你應該有你的小寫成員函數。大寫通常保留給靜態成員。 – JohnMcG 2011-01-14 14:55:05

回答

4

我不太喜歡getter/setter,因爲我不會在這裏進入。他們涉及其他問題。但是,既然你問了他們,​​我的答案會假設我使用getters/setter;它不會訪問所有可能的選擇。

我會使用getter,因爲您提到的維護原因。事實上,抽象是讓吸氣者處於第一位的一半目的(以及稍微嚴格的訪問控制)。

如果使用變量比使用getter更清晰,那麼你的getter函數名稱很差,應該重新考慮。另外,最好初始化成員,不要在事實之後將它們賦值給構造函數體。事實上,你這樣做與常數,所以你還不如現在就開始,並保持一致:

class MyClass 
{ 
private: 
    int Data; 

public: 

    MyClass(int Init) : Data(Init) {} 

    int GetData() const { 
     return Data; 
    } 
}; 

瞭解如何構造發生了變化。

+0

應該使用* getter *,因爲當獲取值的代碼改變時,所有直接訪問該成員的方法都必須改變。維護噩夢。另外,許多編譯器將內聯簡單的getter和setter,所以這些工作在打字員(程序員)上。 – 2011-01-14 20:49:12

+0

@ThomasMatthews:換句話說,「我會使用吸氣劑,因爲你提到的維護原因」。 :) – 2011-01-15 01:19:18

2

您應該使用getter,因爲如果您的類在getter中移動到更復雜的邏輯,那麼您將與變化隔離。然而,如果你的類提供了一個公共的getter,我會質疑創建這個方法的邏輯。

+1

關於你的第二句話,雖然我不一定不同意你的意見,但值得注意的是兩件事情:(a)OP的例子*可能是一個簡化的,人爲的代碼示例;實際的使用案例可能不太方便; (b)儘管將std :: string :: length()與'0'進行比較是非常簡單的,但std :: string :: empty()是非常好的選擇。所以有時候會有一些理由讓會員功能看起來有點沒有意義。 – 2011-01-14 14:02:05

1

這取決於。

前者對簡單的類是足夠的。

後者隱藏了實現並且可以支持多態,如果該方法是虛擬的。

相關問題