Help us understand the problem. What is going on with this article?

Railsでリーダブルコード(モデル編)

More than 3 years have passed since last update.

目的

Railsでモデルといえば、ロジックです
こういったものが定義されていると思います

会社をモデルにすると、こんな感じです

記述の分類 例えばこんなことをします
アソシエーション 会社には従業員をたくさんいる
バリデーション 『会社名が未入力です』などのメッセージ
スコープ 今月誕生日の従業員一覧をとってくるメソッド
インスタンスメソッド 一人の従業員に有休をとらせるメソッド
クラスメソッド 従業員一覧データをCSVファイルにする
コールバック 入社した、全体の従業員数をインクリメントする

いっぱいあります

こうすると読みやすいという観点で、すごく個人的な話をしていきます
あくまで個人的なものですが、ツッコミがあれば大歓迎です!
むしろ、私などがリーダブルコードとういテーマで書くことに若干恐怖があります

モデルをシンプルにする2つのルール

1. 順番を決める

先ほどリストアップしたモデルに書かなきゃいけないことの順番を、最初にコメントをつけてフォーマットにすることです
ex )

class Prefectural < ActiveRecord::Base
  # 関連を定義
  has_many :areas

  # scopeを定義
  scope :active, -> {  }

  # boolean
  def active?
  end

  # インスタンスメソッドを定義
  def activate
  end

  # クラスメソッドを定義
  class << self
    def to_csv
    end
  end
  # コールバックを定義
  after_save do
  end

  # バリデーションを定義
  validates :name, presence: true

  # モジュールを読み込む
  include SUGEETUKAERUMODULE
end

コメントをつかってモデルの中を整頓します。

この順番は私がよく見る(一番気になる)ところにしてます
順番は好みですが、プロジェクト内のすべてのモデルで統一すると、より保守性があがります

  • 似たようなメソッドが近くにあるのに気付きやすくなったり
  • このメソッドのbooleanを返す部分が共通化出来そう!
  • スコープとかメソッドが一覧になってるので、まるでドキュメント

とかけっこう出てくると思います。(私のことです)

2. プライベートメソッドをつかう

初期のモデルは2〜3行しかないかわいいモデルです
いつのまにかコード量が多くなり、やがてモンスターになります
影響範囲が不明なメソッドがゾンビのようにはびこるお化け屋敷モデルになることがあります

そこで、私はプライベートメソッドを使います。ポイントは2つです

  1. コントローラから呼ばれるものと、呼ばれないものを区別
  2. publicメソッドの動作を数行で実装していく
class Prefectural < ActiveRecord::Base

  # controllerから呼ばれるメソッドたち
  # あらゆる人が読むところなので、共通処理をprivateにしてシンプルに
  # メソッド名や説明変数などで、表現豊かに
  # ドキュメントを書いてるつもりで、yard対応のコメントをつけると
  # メタプロしない

  ########################
  private
  ########################

  # controllerから呼ばれていないメソッドたち
  # 呼ばれそうでも、呼ばれるまではここに書く(影響範囲をはっきりさせたい)

  def kyouri
    ...
  end

  def kyabetu
    ...
  end

  def same
    ...
  end

  def saba
    ...
  end

  def koorizatou
    ...
  end
end

こうすることで、自分があまりよく知らないモデルのメソッドを使う場合でも、どれが外部からの呼び出しに使う用のメソッドがわかりやすくなります。

まとめ

言葉足らずでしたが、まとめに入ってしまいます。
まとめると、個人的にこんなことに気をつけてます。

  1. モデルのフォーマットを決める
  2. private宣言でモデルの機能を区別する

変数やメソッドの名前や、ロジックの分割とかはこの本がとても参考になってます。
リーダブルコード

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away