Item 22:データメンバーはプライベートEffective C++ノートとして宣言する

5669 ワード

Item 22: Declare data members private
データ・メンバー宣言は、プライベートで一貫したインタフェース・構文を提供し、細粒度のアクセス制御を提供し、クラスの不変性を維持しやすく、著者らの実現をより柔軟にすることができます.さらに、protectedは、publicよりもパッケージ化に有利ではないことがわかります.
構文の一貫性
あなたもこのような困惑に遭遇したことがあるに違いありません.カッコをつけるべきですか?
obj.length  //    obj.length()?
obj.size    //    obj.size()?

このプロパティを取得する方法は常に覚えられません.getterを呼び出します.それとも直接値を取りますか?すべてのデータをプライベートと宣言すると、呼び出し構文でカッコを統一すればいいです.
アクセス制御
データ・メンバーにgetterとsetterを提供すると、読み取り専用のプロパティを実装するなど、データに対するより詳細なアクセス制御を実現できます.
class readOnly{
  int data;
public:
  int get() const { return data; }
}

実際、C#にはアクセサ(属性とも呼ばれる)の概念が用意されており、各データ・メンバーはsetterとgetterを含む一連のアクセサを定義することができ、アクセサを使用するにはカッコを使用する必要はありません.
public class readWrite{
  private string _Name;
  public string Name{
    set { this._Name = value; }
    get { return this._Name; }
  }
}
ReadWrite rw;
//     set  
rw.Name = "alice";

保守性
すべてのデータをカプセル化すると、既存のお客様に影響を与えることなく、内部実装を任意に変更できます.例えば、SpeedDataCollectionは平均値を与える必要があります.
class SpeedDataCollection{
public:
  void add(int speed);
  double average() const;
};
average()は、現在の平均値の属性を維持し、addのたびにその属性を調整する2つの実装形態を有することができる.average()が呼び出されるたびに再計算されます.2つの実装の間の選択は、実際にはCPUとメモリのバランスであり、メモリが限られているシステムで後者を選択する必要がある場合がありますが、average()を頻繁に呼び出す必要があり、メモリが問題ではない場合は、前者を選択することができます.
あなたの実現方法の変化はお客様に影響しません.しかし、avarage()がメソッドではなく共有データメンバーである場合.では、実装方法が変化するたびに、お客様はコードを再実装、再コンパイル、再デバッグ、テストする必要があります.
protectedを見てみましょう
共有データ・メンバーがパッケージを破壊する以上、その変更は顧客コードに影響します.ではprotectedは?
オブジェクト向けの真髄はパッケージングにあり,1つのデータメンバーのパッケージング性がその変更によって破壊されるコード数に反比例すると大まかに考えることができる.例えば、上記のaveragepublicのメンバーである場合、その変更は、使用されていたすべての顧客コードに影響し、それらの数は不可知(unknowably large amount)に大きくなります.protectedメンバーの場合、お客様は直接使用することはできませんが、多くのクラスを定義して継承することができます.そのため、変更が最終的に影響するコードの数もunknowably largeです.protectedpublicのパッケージ性は同じです!共有または保護されたデータ・メンバーを書いた場合は、お客様のコードに影響を与えることなく、勝手に変更することはできません.
明記しない限り、本ブログの文章はすべてオリジナルで、転載はリンク形式で本文の住所を明記してください.http://harttle.com/2015/08/19/effective-cpp-22.html