【Rails】なぜ"private" "protected" "public"に分けるのか


概要

あるメソッドを実装するときに「アクセス権をどうするか?」という問題に必ず直面すると思います。
それぞれの特徴を知っておくことで、効率良く設計・開発が可能です。
ちなみにこれはカプセル化と言い、、オブジェクト同士の紐付き(関係性)を薄くし独立性を高め、再利用や交換といった保守性を高める効率の考え方です。

特徴

publicメソッド

- クラスの主な責任や目的を明らかにする
- 外部から実行されることが想定される
- 思いつくままに変更されたりはしない
- 他者が依存したとしても安全
- テストで完全に文書化されている

privateメソッド

- 実装の詳細に関わる部分
- 外部から実行されることは想定されていない
- 変更されやすい
- 他者が依存するのは危険
- 基本的にはテストはしない(個人的な意見です。諸説あり。)

protectedメソッド

- 外部からは隠蔽されている
- 仲間(自クラスかサブクラスのレシーバー、親子関係にあるクラスのみ)からは実行可能

判断のポイント

  • なるべく狭い範囲で設定するようにする。
    • 余計なアクセス権は想定外の場所の不具合を生む原因にもなりかねないため。
  • privateメソッドを多用しないようにする。
    • 本来そのクラスの責務でないものを抱えてしまうことが可能性があるため。
    • 「別のクラスのpublicメソッドにする」可能性を視野に入れる。
  • 最も範囲が狭いprivateをベースとして設計する。
  • 継承先、あるいは継承元で呼び出したり上書きしたい場合はprotectedにする。
  • 外部からのアクセスを可能にしたい場合はpublicにする。