目的
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つです
- コントローラから呼ばれるものと、呼ばれないものを区別
- 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
こうすることで、自分があまりよく知らないモデルのメソッドを使う場合でも、どれが外部からの呼び出しに使う用のメソッドがわかりやすくなります。
まとめ
言葉足らずでしたが、まとめに入ってしまいます。
まとめると、個人的にこんなことに気をつけてます。
- モデルのフォーマットを決める
- private宣言でモデルの機能を区別する
変数やメソッドの名前や、ロジックの分割とかはこの本がとても参考になってます。
リーダブルコード