うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

JavaプロジェクトでGroovyを導入すべき5つの理由

前段

TDDBootCamp in Tokyo 1.5にJavaグループの一員として参加させていただきました。
そこでGroovyをやりたいというホットなエンジニアと出会いまして、GroovyでTDDをさせていただきました。
いきなりGroovyでプロダクトを書く事はなかなかないと思っているので、Javaのプロダクトコードに対して、Groovyのテストコードを書く。という方法で演習しました。
そこで、皆様がGroovyへ多少なりとも注目してくださいましたので、このエントリーを書いてみようと思いました。

JavaプロジェクトでGroovyテストコードを導入すべき5つの理由

以下であげる5つのポイントは「Groovyを知らないJavaプログラマーがすぐに始められるGroovyの強力な機能」をとりあげました。
もちろんここにあげた以外にもたくさんのGroovyの強力な機能はありますが、それらの威力を知るのはGroovyに本腰をいれてからでも遅くはありません。なにせ、GroovyはJavaと同じように書いてもほとんど同じように動作し、テストコードは気軽に書けるものであることが多いからです。


1.簡潔なループ処理
2.明示的なPowerAssert
3.privateにも簡単にアクセスできる
4.強力なデバッグプリント
5.簡潔なリスト、マップ定義

1.簡潔なループ処理

Javaの場合

for(int i=0; i < 5; i++){
    System.out.println(i);
}
List<String> list = new ArrayList<String>();
// listに要素追加処理
for(String str : list){
    System.out.println(str);
}

Groovyの場合

5.times{
    println it
}
List<String> list = new ArrayList<String>();
// listに要素追加処理
list.each{
    println it
}

もしくは

0.upto(4){
    println it
}

Groovyでは 数字.times でその数字分のループ処理を実行します。そのときにループ処理の中で使えるカウンタは0オリジンです。
同じようにListインターフェースはeachメソッドでforeach処理を使用できます。
もし、違う1オリジンやその他で行いときには 開始数字.upto(終了数字) で 開始数字から始まるループ処理を実行できます。
ループ処理のなかの it は自動的にこの変数名でカウンタが代入されています。※itはクロージャのデフォルト変数ですが、それはクロージャが何であるかを学んでもらうときに理解すれば問題ありません。


2.明示的なPowerAssert

assert String.class.name.equals(Integer.class.name)


実行結果


Groovyではバージョン1.7からassert文の表示が非常に綺麗になりました。テストが失敗した時にコンソールをパッと見でわかるのは素晴らしいです。


3.privateにも簡単にアクセスできる

class Hoge {
    private String foo = "this is private."
    public String bar = "this is public."
}

Hoge hoge = new Hoge()
println hoge.foo
println hoge.bar


実行結果

this is private.
this is public.


TDDやリファクタリングやレガシーコードでテストコードを書くときにprivateにアクセスしたくなるときがあります。簡単に書けるのでとてもいいです。


4.強力なデバッグプリント

println new HashMap().dump()


実行結果

<java.util.HashMap@0 table=[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] size=0 threshold=12 loadFactor=0.75 modCount=0 entrySet=[] keySet=null values=null>

dump()メソッドはGroovyのデフォルトメソッドになっているので、どのようなクラスにでも基本的に使えます。内部のオブジェクトの状態を可能な限りフィールド名と値を出力してくれます。


5.簡潔なリスト、マップ定義

List foo = [1,2,3,4,5,6,7,8,9,0]
foo.each{
  println it
}

Map bar = [hoge:"value1",fuga:"value2"]
bar.each{
  println it
  println it.key
  println it.value
}


実行結果

1
2
3
4
5
6
7
8
9
0
hoge=value1
hoge
value1
fuga=value2
fuga
value2


[a,b,c,d]でArrayListインスタンスが生成できます。[key1:value1,key2:value2]でLinkedHashMapのインスタンスが生成できます。






他にもListは#add()の代わりに list+"hoge" のように+で追加できるとかたくさんありますが、とりあえず上記5つを実践できるだけでも十分にJavaのコードがより直感的になるのではないでしょうか?

Happy Groovy Life!


プログラミングGROOVY

プログラミングGROOVY