✌️

カスタムバリデーション名にはmust_かvalidate_をつけよう

2023/12/27に公開

先に結論

  • カスタムバリデーションメソッド名には must_validate_ をつけよう
    • メソッド名だけでバリデーション用メソッドであることが明確に分かる
    • 文型を定めることで命名を考えるコストが下がる
  • must_validate_かはコード規約でどちらかに統一するのがベストそう
  • 下記はRails Style Guideの命名例
invoice.rb
# ...
# also good - explicit prefix
validate :validate_birthday_in_past
validate :validate_sufficient_quantity
validate :must_have_owner_with_no_other_items
validate :must_have_shipping_units

# bad
validate :birthday_in_past
validate :owner_has_no_other_items

must_などをつけない場合の問題点

invoice.rb
class Invoice < ApplicationRecord
  def expiration_date_cannot_be_in_the_past
    # something
  end
  
  def active_customer
    # something
  end
end
  • bool値を返すメソッドなのか、バリデーションなのかメソッド名から判断できない
    • 読みにくい
  • 上記例のexpiration_date_cannot_be_in_the_pastactive_customerはどちらもカスタムバリデーションメソッドであるにも関わらず、命名に共通項がない
    • → 裁量が大きいので、命名を考えるコストが高い
    • → 個人の裁量に任され、カオスになりがち

must_validate_

must_

  • メリット
    • 短くて読みやすい
  • デメリット
    • 自然な英文としては S + must + V のため、prefixにならないことがある
      e.g. birthday_must_be_in_past
    • ↑ その場合はmust_have_カラム名_状態にするといった規約を設定することでprefix化が可能そうではあるが、やや冗長?
      e.g. must_have_birthday_in_past

validate_

  • メリット
    • バリデーションであることが明らか
    • validate_カラム名_状態という記法が直感的
  • デメリット
    • validate :validate_somethingとモデルに記述することになるため、validateがダブる
    • mustより文字数が多い

所感

  • bool値メソッドとバリデーションメソッドを規約的に差別化したいと思い、調べたらRails Style Guideにちゃんと載っていた
  • must_validate_かは最終的には好みだと思われる

参考

Discussion