Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

初めてのRubyプログラム(Javaのアクセッサ生成)

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でやろうとしちゃう)。