美しいコードとは

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を活用してより柔軟にコードを記述する。
プログラムを組む際に気をつけよう。