「オブジェクト指向でなぜ書くのか」を読んでRailsガイドを読み直すとしっくり来た話
2019.07.21
最近「オブジェクト指向でなぜつくるのか」という書籍を読んでいる。非常に分かりやすい書籍だが、やはり概念だけの説明だけだとなかなか頭に入って来にくい。 同時期に Rais ガイドの読み直しをしていると、「オブジェクト指向」と Rails ガイドの内容がリンクしてきて、頭に入って来やすかった。
オブジェクト指向について
オブジェクト指向の3大要素として「クラス
」「継承
」「ポリモーフィズム
」が紹介されていた。「クラス
」の役割としては以下の3つがある。
クラス
- まとめる
- 隠す
- 沢山作る
まとめる
クラス内では変数や機能をまとめることができる。 Active Record の例で考えてみると、理解が進むかもしれない。Active Record では以下のような機能が実装されている。
- モデルおよびモデル内のデータを表現する
- モデル同士の関連付け(アソシエーション)を表現する
- 関連付けられているモデル間の継承階層を表現する
- データをデータベースで永続化する前にバリデーション(検証)を行なう
- データベースをオブジェクト指向スタイルで操作する
後述する継承
を行うことによって、rails で定義する model では非常に簡潔な記述で関連付けやバリデーションを定義することが可能となる。
隠す
rails で実装するときにも、private
という記述を行いメソッドでカプセル化を頻繁に行う。パラメータの許可を行うメソッドや、データの取得を行うメソッドの定義は基本的にprivate
でカプセル化する。
private
def person_params
params.require(:person).permit(:name, :age)
end
private
によって定義されたメソッドをレシーバー付きで呼び出そうとすると、例外NoMethodError
が発生する。
refs: https://railsguides.jp/actioncontrolleroverview.html https://ref.xaio.jp/ruby/classes/module/private
たくさんつくる
オブジェクト指向プログラミングには、「インスタンスを格納する変数名. メソッド名(引数)
」という記述によってメソッドの呼び出しをすることが可能だ。
rails でもインスタンス変数を定義して、呼び出すというのは頻繁に行っている。
def show
@post = Post.find_by(params[:id])
end
継承
上述の通り Rails ではActive Record
を継承していることによって、様々な機能を実現している。継承を実現しているコードは以下の箇所。
class Blog < ApplicationRecord
end
まとめ
今までなんとなくで書いてきた Rails コードについて振り返ってみて、オブジェクト指向についても勉強してみた。オブジェクト指向の概念が面白いので、より詳しく学習を進めていきたい。