excelとかの仕様書からDTOを作るっていうのが今回多くて、Ruby初心者の練習がてら仕様書からフィールド、gettersetterを生成するものを作ってみました。
excelでは結合セルとか使ってるので、それをテキストファイルにコピーするとこんな感じです。
テスト1 test1 テスト2 test2
フィールドの日本語名、英語名がタブで離れていて、改行って感じです。
で、このテキストからDTOを作りたいわけです。
public class Dto { /** テスト1 */ private String test1; /** テスト2 */ private String test2; /** * テスト1を取得します。 * @return テスト1 */ public String getTest1() { return test1; } /** * テスト1を設定します。 * @param テスト1 */ public void setTest1(String test1) { this.test1 = test1; } /** * テスト2を取得します。 * @return テスト2 */ public String getTest2() { return test2; } /** * テスト2を設定します。 * @param テスト2 */ public void setTest2(String test2) { this.test2 = test2; } }
するとこんな感じでできました。
filename = ARGV[0] file = open(filename) fields = "" accessors = "" while text = file.gets do fieldNameAndValue = text.split() name = fieldNameAndValue[0] value = fieldNameAndValue[1] field = "/** #{name} */\nprivate String #{value};\n" fields << field camel = fieldNameAndValue[1].capitalize getter = "/**\n * #{name}を取得します。\n * @return #{name}\n */\npublic String get#{camel}() {\nreturn #{value};\n}\n" accessors << getter setter = "/**\n * #{name}を設定します。\n * @param #{name}\n */\npublic void set#{camel}(String #{value}) {\nthis.#{value} = #{value};\n}\n" accessors << setter end file.close out = "public class Dto {\n#{fields}#{accessors}\n}" puts out
これを「dto.rb」として、テキストは「sample.txt」とすると、呼び出しはこうです。
ruby dto.rb sample.txt > Dto.java
「>」で出力をファイルにできます。Dto.javaとして出力されます。
作ってみた感想としては、
- ラク
これが第一です。RubyでなくてもLLは全部そうなのですが、
- 型宣言入らないからラク
って感じです。
- ファイル、文字列の扱いがラク
式展開とか文字列連結がすごいラクですし、ファイルの読み取りも少しのコードで済みました。こういったツールはこれからどんどんRubyで作っていこうと思いました。練習がてらですが、それ以上にラクだっていうのが大きいです。Javaでこういうの作ろうとしてもメンドくさくてやらない(excel VBAでやろうとしちゃう)。