ぐへへお姉ちゃんパンツ何色 私は黒は穿かない!
ちょっと気になったので突っ込みです。
カプセル化にはいくつもの意味がありますが、以下の内容はデータ隠蔽を取り上げています。
小人閑居して: 「ぐへへお姉ちゃんパンツ何色」から始めるクラス解説
http://boronology.blogspot.jp/2011/12/blog-post.html
ここでは以下のようにパンツにアクセスするためのアクセッサー(setter,getter)を追加しています。
- 引用
お姉ちゃんのパンツの色を16進数で表示してね!というと……再びコンパイラが「お姉ちゃんのパンツの色はプライベートなのでアクセスできないぞっ」 と怒ります。そう、隠蔽されてしまったパンツの色を確認するにはどうしたらいいのでしょうか? こうしましょう。 class oneechan{ public: int get_pants_color(); void set_pants_color(int color); private: int pants_color; }; int oneechan::get_pants_color(){ return pants_color; }; void oneechan::set_pants_color(int color){ pants_color = int color; }; パブリックにset_pants_color()メソッドとget_pants_color()メソッドを追加しました。 パンツの色にアクセスするためにはこのメソッドを利用します。
ここで以下の疑問を持ったあなたは鋭い!
pants_colorをprivateにしても、getterとsetterがpublicならpants_colorがpublicなのと同じでは?
その通りです。
setterをpublicで公開してしまうと結局のところパンツの色を好きに変更できてしまうのです。
クラスを作成してカプセル化しても、フィールドに対して単純にgetterとsetterを作ってはカプセル化の効果が現れていません。
ではどうすればいいのでしょうか?
これはあなたがどのようなお姉ちゃんが好きかによります。
あなたの好みのお姉ちゃんに
- 1. お姉ちゃんは清純派 黒のパンツは絶対はかない!
void oneechan::set_pants_color(int color){ // パンツが黒だったら例外を投げる if(color == 0x000000){ throw new OnechanPantsColorException(); } pants_color = color; };
- 2. お姉ちゃんはパンツを変えない
お姉ちゃんは生まれてから死ぬまで同じ色のパンツをはき続けます。
その場合はsetterを削除してしまえばいいのです。
#12/7(水)ちょっと補足
しかし結局setterなんていつでも変更できるんだから意味がないのでは?
という疑問が出てくるかもしれません。
確かに自分1人で開発しているときは清純派お姉ちゃんを変更することは可能ですが、今回作成した清純派お姉さんのオブジェクトファイルoneechan.oとAPIドキュメントだけを他人に渡して使って貰う状況を考えてみてください。
もしデータ隠蔽をせずpants_colorがpublicだったとすると、清純派のお姉ちゃんは黒いパンツをはきたくないのに悪い人はpatas_color=0x000000として黒いパンツをはかせることができてしまいます。
しかしデータ隠蔽を行うことにより、pants_colorを変更するには必ず:set_pants_color(int color)で行う必要があります。この関数ではどんなに悪いやつが黒いパンツをはかせようとしても、必ずお姉ちゃんは怒ってOnechanPantsColorExceptionを投げてくれるわけです。そのため絶対に黒いパンツをはかせることはできません。
このようにデータ隠蔽することにより、清純派お姉ちゃんは自分の身を自分で守ることができるようになったため、誰にでも安心して預けることができるようになりました。
更に重要なことは、久しぶりに清純派お姉ちゃんにあったときに、自分自身もお姉ちゃんが黒のパンツが嫌ということを忘れてしまい、誤って黒いパンツをはかせてしまうということを防ぐことができるのです。
ちなみに細かいことを言うと、クラスを使わなくても構造体でカプセル化(データ隠蔽)を実現することはできます。
詳しくはこちら
疑りぶかいあなたのためのオブジェクト指向再入門
http://kmaebashi.com/programmer/object/