2011-01-14 8 views
1

はのは、私は次のクラスがあるとしましょう。これを実現する方法は2つあります。自分のゲッターを使用したクラス/セッター

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

または:

より良い練習と見なされ
bool DataIsZero() const 
{ 
    return GetData() == 0; 
} 

?変数自体を使用するだけで可読性が向上することがわかりますが、ゲッターを使用するとコードを簡単に保守することができます。

+2

メンバ関数を小文字にする必要があります。大文字小文字は、通常、静的メンバーに予約されています – JohnMcG

答えて

4

私はここには行かない理由のためにゲッター/セッターが本当に好きではありません。彼らは他の質問で覆われています。しかし、あなたがそれらについて尋ねてきたので、私の答えはゲッター/セッターを使うと仮定します。それはすべての可能な選択肢を訪れることはありません。

あなたが暗示するメンテナンス上の理由から、ゲッタを使用したいと思います。実際、抽象化は最初にゲッターを持つことの目的の半分(アクセス制御をわずかに厳密にすることに伴い)です。

変数を使用する方がゲッターを使用するより読みやすい場合は、ゲッター関数名が不良であり、再考する必要があります。

他にも、メンバーを初期化し、事実の後でコンストラクター本体に割り当てないのが最善です。あなたにも今起動して、一貫性を維持する可能性があるので、実際には、あなたは、定数であることを行うにはを持っている

class MyClass 
{ 
private: 
    int Data; 

public: 

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

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

は、コンストラクターがどのように変化したかを参照してください。

+0

値を取得するコードが変更されると、そのメンバーに直接アクセスするすべてのメソッドも変更する必要があるため、* getter *を使用する必要があります。メンテナンスの悪夢。また、多くのコンパイラは、単純なゲッタとセッタをインライン化して、作業がタイピスト(プログラマ)上にあるようにします。 –

+0

@ThomasMatthews:言い換えれば、「あなたが言及したメンテナンス上の理由から、ゲッターを使用します。 :) –

2

getterを使用する必要があります。これは、クラスがゲッターのより複雑なロジックに移動すると、変更から隔離されるためです。しかし、あなたのクラスがパブリックゲッターを提供しているなら、私はこのメソッドを作るロジックに疑問を抱いています。

+1

2番目の文については、必ずしもあなたに同意しているわけではありませんが、2つのことに注意する価値があります。(a)OPの例*は単純化された人為的なコードサンプルです。実際のユースケースはあまり工夫されていない可能性があります。 (b) 'std :: string :: empty()'は、 'std :: string :: length()'と '0'を比較するのは本当に簡単ですが、むしろ良いです。したがって、メンバー関数を作成するための論理的根拠があり、そうでなければ少し意味がないように見えることもあります。 –

1

です。

前者は単純なクラスで十分です。

後者は実装を隠し、メソッドが仮想の場合は多態性をサポートできます。

+0

+1いい回答ですが、評価が低いと思います! –

関連する問題