The way of refactoring
昨日に引き続きコードを書き換える作業を少し進める。
似たような機能で、微妙に異なる動作をするメソッドを1つのメソッドにまとめる場合に、Rubyでは引数をハッシュ1つにまとめてしまって、キーでオプションを指定して動作を変える、という方法がとても強力なことがわかった。RailsのActiveRecordなんかはそんな感じだよね。
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