物臭
「根が無精なんだよねぇ…。」
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 がない言語でも、「プログラムのコードを全部手で書くことの面倒さや不正確さ」を感じているなら、工夫の余地はいくらでもある。