caseによる場合わけ

mzp2006-02-25

こんなコードがあったとする

def foo
  case @param['mode']
  when 'error'
    ......
  when 'input'
    ......
  else
    .....
  end
end

処理が増えると関数が大きくなるので、あまりうれしくない。あと、派生したクラスで処理を追加するのが結構めんどうになる。

そこで、Object#sendを使ってやる。

def foo
  if self.respond_to? "on_#@param['mode']:" then
    self.send "on_#@param['mode']:"
  else
    on_default
  end
end

def on_error
  ...
end

def on_input
  ...
end

def on_default
 ...
end

ちょっと迷っていること。これはCGIのコードの一部で、@paramはCGIに渡されたパラメータ。なんとなく、このコードはセキュリティホールになりそうな雰囲気がある。いちおう、任意のメソッドを呼び出されないように'on_xxx'という形式にしているから大丈夫だとは思うんだけど、なんとなく不安。