美しいコードとは
Beautiful Code: The evolution of an iterator - (37signals)
DHHがコードを添削している。英語ぜんぜんだめだからいまいち理解できないなー。
def self.each_state STATES.each { |state| yield state } end
この部分を、
def self.states @states ||= [PENDING, PROCESSING, COMPLETED] end
をこう添削している。わざわざeachメソッドを定義していたのを配列を返すことによってeachでもcollectでもなんでもござれにしている。これは納得の添削だね。
しかし、もっと気になる部分はclass_evalを使ってモデルの状態を定義している部分。
class Export < ActiveRecord::Base PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" def self.states @states ||= [PENDING, PROCESSING, COMPLETED] end # ... end class ExportPresenter # ... Export.states.each do |state| class_eval "def #{state}?; @export && @export.#{state}?; end" end # ... end
Export.states.each do |state| class_eval "def #{state}?; @export && @export.#{state}?; end" end
class_evalを活用してより柔軟にコードを記述する。
プログラムを組む際に気をつけよう。