kawa-tの日記: カプセル化とアクセサ 6
日記 by
kawa-t
C++においては、基本的に、クラスのメンバー変数がprivateは当然として、アクセサを作らないのがカプセル化の極意だと思う。
結果として、アクセサと同等のメソッドができることはあっても、アクセサを作ろうとしたわけではない。アクセサを最初に作ってしまうと、アクセサがなければ、クラス内にしか書けないものを、クラス外に書くことを許してしまい、混乱の元。
巷で良く見かけるカプセル化の説明は、メンバー変数へのアクセスの制限の話ばかりで、メンバー変数の書き換えを許可しないクラスでは、カプセル化のメリットが全く見えません。
ものによっては・・・ (スコア:0)
ロックとかしている場合は、privateなアクセサがあってもいいとは思いますがねー
Re:ものによっては・・・ (スコア:1)
マルチスレッドは今後の課題ですが、privateにもアクセサのようなものを作ったりはします。でも、大きいクラスだと、見落としてしまうので、そういうメンバー変数はクラスを作って、対応しています。その方が、コンパイラがチェックできるようになって、何かと便利。
まともなインタフェースがアクセサなのか? (スコア:0)
publicなインタフェースと、それ以外をきちんと分けることが必要というだけ。アクセサを作るかどうかではなく、必要なアクセサがまともなインタフェースなのかどうかという問題。
float x,yをメンバに持つ2次元座標クラスを作るとき、float getX(), float getY()は作らない。作るならば、getXY(float &x, float &y)。
Re: (スコア:0)
コメントありがとうございます。
言いたかったのは、xやyの値を取り出す必要が必ずしも無いので、アクセサは作らないほうがいいということでしたが、xやyがどうしても必要なときには、理にかなってますね。xとyの値を同時に設定するなら、同時にxとyの値を取り出す。なるほど。
Re:まともなインタフェースがアクセサなのか? (スコア:1)
Re: (スコア:0)
たとえば、x,yを個々のものと考えるのが、すでに内部実装の話になっています。float x,y;の代わりに、string point;でもかまわないわけです(効率考えたらそんなことしませんが)
アクセサの要/不要はクラスのインタフェースとしてふさわしいかどうかで決めましょう。
アクセサは偶然(?)publicインタフェースと実装が一致しているにすぎません。
むやみにアクセサを追加する必要はないということは同意します。