Effective Rubyの勉強メモです。
オブジェクト指向はカプセル化によって公開するpublicメソッドと非公開なprivateメソッドを分けています。
最初の頃はすべて公開したら後で楽じゃないかって思っていたのですが、公開するものを制限することでテスト対象が減り、インターフェースをできるだけ変えないようにすることで修正範囲を狭くできるので、公開しないものはprivateにするようにしています。
さて、rubyでのprivateメソッドの定義は結構面白いです。
privateメソッドとして定義されたメソッドは明示的にレシーバを指定して呼び出すことができません。
privateメソッドとなるルールはこれ一つです。
単純なルールですが、確かにクラスの外からは呼び出せないのでカプセル化されています。
レシーバを指定できないので、クラスの中でもself.hoge
みたいにselfを付けてしまうと呼び出せないですが、セッターメソッドの呼び出し以外はselfを付ける必要はないので不便もなさそうです。
スポンサーリンク
privateに似た機能にprotectedがあります。
protectedはprivateほどシンプルなルールではありません。
protectedメソッドはprivateと違いレシーバを付けて呼び出すことができます。
ただし、呼び出すことのできるメソッドは継承階層に含まれるクラスのものに限られます。
ざっくり言うとprivateは個人が持つ秘密なのに対し、protectedは代々受け継がれてきた秘伝という感じです。
インスタンス変数はアクセサメソッドを定義しない限りprivateメソッド同様内部に隠蔽されています。
インスタンス変数にアクセスするためにはアクセサメソッドを定義するのですが、全世界に向けてオブジェクトが持つプライベートな情報を公開してしまいます。
一方で隠ぺいしておきたいが、同じクラスのオブジェクト同士でぐらいは情報のやり取りがしたい場合があります。
protectedはそのような場合に用意された機能です。
使う場合は単純にゲッターをprotectedにしてしまえばいいです。
class User protected def phone_number @phone_number end end
これでユーザークラス内にメソッドを隠蔽しつつ、ほかのユーザからは電話番号をしることができるようになりました。
- 作者: Peter J. Jones,arton,長尾高弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/09
- メディア: 大型本
- この商品を含むブログ (13件) を見る
Ruby on Rails 5アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/14
- メディア: 大型本
- この商品を含むブログを見る
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る