物臭

「根が無精なんだよねぇ…。」

Java で業務用のアプリケーションを開発していると、ほとんどがアクセサーメソッドのクラスを定義したりすることがよくある。

public class Hoge {
  String foo1;
  String foo2;
  public void setFoo1(String newFoo) {foo1 = newFoo}
  public void setFoo2(String newFoo) {foo2 = newFoo}
  public String getFoo1() {return foo1}
  public String getFoo2() {return foo2}
}

だいたい、こんな感じかな。こんなのを何十個も書くのは面倒なので、Ruby ならこうする。

# ここに名前だけ書く
defines = {'Hoge'=>['foo1', 'foo2']}

# で、クラスを動的に生成
defines.each {|name, properties|
  temp = <<EOS
class #{name}
  attr_accessor :#{properties.join(', :')}
end
EOS
  eval temp
}

こうして実行時にクラスを作る仕掛けをしておけば、後は defines のところを増やせばいい。一つだけなら分からないけれど、100 個も似たようなクラスを書くとしたら、その差は明らか。「Hash みたいな文法でアクセスできた方が便利そうなんだが…。」なんて気付いた時も、後者の方法なら簡単に追加できて、動的に生成するすべてのクラスに反映させられる。

eval は渡した文字列を Ruby スクリプトとして評価してくれるんだけれども、別に eval がない言語でも、「プログラムのコードを全部手で書くことの面倒さや不正確さ」を感じているなら、工夫の余地はいくらでもある。