メソッドをどのように命名するか
状況
モデルにスコープをつける。ある程度ややこしい処理をまかせるスコープだ。名前はながったらしくしないで完結にしたい。
処理内容
たとえば、ブログ記事のモデルArticles
について考えるとして
- 先週1週間分のアクセス数をブログごとに集計し、降順に並べて返す
であれば、.lastweek_ranking
としてみた。
Article.lastweek_ranking
となる。
次のように分解できる。
先週1週間分 => lastweek
アクセス数をブログごとに集計し、降順に並べて返す => ranking
だから lastweek_ranking
(全然ややこしくない気もする。)
雑感
スコープを書いているとき、SQLを組み立てるのに必要な条件は何かと考えていると、すっとうまい名前が思いつけないということがよくある。具体的な条件を考えながら、それら条件を抽象化したときの呼び名を考えるのはなかなか難しい。
はじめスコープをあれこれ試行錯誤して組み立てたとき、
scope :aggregate_weekly_ranking, ->() { select('id, SUM(access_count) AS total_access_count') .where(' YEARWEEK(date) = YEARWEEK( CURRENT_DATE ) -1') .group('id') .group(' YEARWEEK(date)') .order('total_access_count') }
ここの条件があたまにこびりついていて、このスコープをselect_group_order_lastweek_total_access_count
みたいな名前にした(たしか)。具体的な処理をそのまま書いただけといえる。だが、長すぎるし、長い割にわかりにくかったので、考え直してlastweek_ranking
で十分だというところに落ち着いた。
出来上がった名前を見ると、そもそも全然複雑じゃなくて、簡単にみえて、名前も簡単につけられるような気がするのだけど、コードを書いていると難しいことがある。あるいはもし他人の書いたコードを、先入観のない目で見たらもっと簡単に名前づけできるのかもしれない。