パスワードを忘れた? アカウント作成
284721 journal

kawa-tの日記: カプセル化とアクセサ 6

日記 by kawa-t

C++においては、基本的に、クラスのメンバー変数がprivateは当然として、アクセサを作らないのがカプセル化の極意だと思う。

結果として、アクセサと同等のメソッドができることはあっても、アクセサを作ろうとしたわけではない。アクセサを最初に作ってしまうと、アクセサがなければ、クラス内にしか書けないものを、クラス外に書くことを許してしまい、混乱の元。

巷で良く見かけるカプセル化の説明は、メンバー変数へのアクセスの制限の話ばかりで、メンバー変数の書き換えを許可しないクラスでは、カプセル化のメリットが全く見えません。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2010年12月23日 10時11分 (#1878533)

    ロックとかしている場合は、privateなアクセサがあってもいいとは思いますがねー

    • コメントありがとうございます。

      マルチスレッドは今後の課題ですが、privateにもアクセサのようなものを作ったりはします。でも、大きいクラスだと、見落としてしまうので、そういうメンバー変数はクラスを作って、対応しています。その方が、コンパイラがチェックできるようになって、何かと便利。
      親コメント
  • by Anonymous Coward on 2010年12月23日 17時31分 (#1878709)
    これにつきる。
    publicなインタフェースと、それ以外をきちんと分けることが必要というだけ。アクセサを作るかどうかではなく、必要なアクセサがまともなインタフェースなのかどうかという問題。

    float x,yをメンバに持つ2次元座標クラスを作るとき、float getX(), float getY()は作らない。作るならば、getXY(float &x, float &y)。
    • by Anonymous Coward

      コメントありがとうございます。

      float x,yをメンバに持つ2次元座標クラスを作るとき、float getX(), float getY()は作らない。作るならば、getXY(float &x, float &y)。

      言いたかったのは、xやyの値を取り出す必要が必ずしも無いので、アクセサは作らないほうがいいということでしたが、xやyがどうしても必要なときには、理にかなってますね。xとyの値を同時に設定するなら、同時にxとyの値を取り出す。なるほど。

      • くせでACで投稿してしまった...orz
        親コメント
      • by Anonymous Coward
        なぜ「同時にアクセス」か分かります?メリット/デメリット、意味を考えてみてください。

        たとえば、x,yを個々のものと考えるのが、すでに内部実装の話になっています。float x,y;の代わりに、string point;でもかまわないわけです(効率考えたらそんなことしませんが)

        アクセサの要/不要はクラスのインタフェースとしてふさわしいかどうかで決めましょう。
        アクセサは偶然(?)publicインタフェースと実装が一致しているにすぎません。
        むやみにアクセサを追加する必要はないということは同意します。
typodupeerror

開いた括弧は必ず閉じる -- あるプログラマー

読み込み中...