「オブジェクト指向でなぜ書くのか」を読んでRailsガイドを読み直すとしっくり来た話

2019.07.21

最近「オブジェクト指向でなぜつくるのか」という書籍を読んでいる。非常に分かりやすい書籍だが、やはり概念だけの説明だけだとなかなか頭に入って来にくい。 同時期に Rais ガイドの読み直しをしていると、「オブジェクト指向」と Rails ガイドの内容がリンクしてきて、頭に入って来やすかった。

オブジェクト指向について

オブジェクト指向の3大要素として「クラス」「継承」「ポリモーフィズム」が紹介されていた。「クラス」の役割としては以下の3つがある。

クラス

  • まとめる
  • 隠す
  • 沢山作る

まとめる

クラス内では変数や機能をまとめることができる。 Active Record の例で考えてみると、理解が進むかもしれない。Active Record では以下のような機能が実装されている。

  • モデルおよびモデル内のデータを表現する
  • モデル同士の関連付け(アソシエーション)を表現する
  • 関連付けられているモデル間の継承階層を表現する
  • データをデータベースで永続化する前にバリデーション(検証)を行なう
  • データベースをオブジェクト指向スタイルで操作する

refs: https://railsguides.jp/activerecordbasics.html

後述する継承を行うことによって、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 コードについて振り返ってみて、オブジェクト指向についても勉強してみた。オブジェクト指向の概念が面白いので、より詳しく学習を進めていきたい。