The way of refactoring

昨日に引き続きコードを書き換える作業を少し進める。

似たような機能で、微妙に異なる動作をするメソッドを1つのメソッドにまとめる場合に、Rubyでは引数をハッシュ1つにまとめてしまって、キーでオプションを指定して動作を変える、という方法がとても強力なことがわかった。RailsActiveRecordなんかはそんな感じだよね。

def goto_somewhere_by(where, by)
# definition
end

def goto_somewhere_with(where, with)
# definition
end

def goto_somewhere_by_with(where, by, with)
# definition
end

goto_somewhere_by(:station, :car)
goto_somewhere_with(:station, :money)
goto_somewhere_by_with(:station, :car, :money)

よりも

def goto(args = Hash.new)
# definition
end

goto(:where => :station, :by => :car)
goto(:where => :station, :with => :money)
goto(:where => :station, :by => :car, :with => money)

のほうが、メソッド使うときに次の点で便利

  • 呼び出す時点で、引数として渡す値が何を表しているのか一目瞭然
  • 引数の順番を考えなくてよい(1つのハッシュに収まるから、並び順は意味をもたない)

ただし、あんまり調子にのりすぎて多岐にわたるメソッドを1つにまとめると、そのメソッド内の条件分岐がスパゲッチになる予感。そこらへんの加減が、プログラマの腕の見せ所ってところですな。

しかし、メソッドの引数としてハッシュをこのように記述できるRubyの書きやすさはすばらしい。PHPだったら

goto(array("where" => "station", "with" => "money"));

とかだろうか。Rubyのエレガントさに慣れると、この汚さは耐えられないw