Digital Romanticism このページをアンテナに追加 RSSフィード

2011-07-07

書評:プログラミングGroovy

著者の方々より献本頂きました。厚く御礼申し上げます。ありがとうございます!


プログラミングGROOVY

プログラミングGROOVY

はじめに

まずはじめに、これはGroovyを好きな方々、Groovyのことが気になっている方々にとっての必携書になると思います。素晴らしいお仕事をなさった著者のみなさまに感謝します。


さて、本の紹介をする前に、私のGroovyに対するポジションを明らかにしておきたいと思います。過去の記事を見て頂けばおわかり頂ける通り、私は時々Groovyを触っています。たとえばDSLを書いてみたいとき、DCIアーキテクチャで何か作ってみたいとき、モダンTDDを試したいとき・・・。意図が伝わりやすいGroovyのコードと、動くアプリが一瞬で作れるGrailsは、私にとって実に頼もしいツールです。


「ちょっと待て、Scalaのエントリも書いているじゃないか」そうですね、先日のTDDBC仙台でもScala組だったように、私は時々Scalaも触っています。「どっちなんだ?」私自身はこの2つの使い分けをかなり意図的に行っています。


一言で言えば、「ScalaはネクストJava、Groovyは軽量Java」です*1。Scalaを使うときには、Scalaの持つJavaにないパラダイム、特に関数型のパラダイムを学ぶためという明確な目的があることが多いです*2。逆に、とにかくさらっとコードを書きたいときにはGroovyを選択しています。そういう意味で、動的言語的な破壊力を隅々まで知り尽くしているわけではありません。そういう比較的中立的(?)なGroovyユーザの視点で書かれた紹介だと思って続きをお読みください。

概要

この本の対象読者について、「はじめに」に書かれている言葉を引用します。

本書の対象読者としては、Groovyのことをまだあまりよく知らないJavaプログラマを想定しています。(p.vi

もうすこし補うと、Javaをそれなりに使い込んでいて、Javaの「面倒なところ」も含めて理解している方のツボにはまるのではないかと思います。


もう1点、この本の読み方ですが、まずは適度に写経しながら全体をさらっと通読してみるのがいいと思います。細かいAPIは表形式でまとめられていますので、必要に応じて後で調べることができます。むしろ頭の中に、「あ、こんなことができるんだ」というインデックスを作ることが重要だと思います。以下、勝手に3部に分けてみました。


準備編

「まだGroovyに触ったことがない」という方は、第1章「Groovyの世界へようこそ」をさらっと読んでみてください。「Javaを置き換えるとまでは言わないけれど、とりあえず使えるところから使ってみなよ、便利だからさ」というGroovyの声が聞こえてくると思います。


第2章「Groovyの利用方法」は開発環境整備です。これから準備される方はここを見ながらどうぞ。なお、IDEとしてIntelliJがイチオシされていますが、初めてGroovyに触るのであればエディタの方をお勧めします。IntelliJは私もぼちぼち触り始めており、使い込めばかなり良さそうだと思っているのですが、ある程度設定しないといけないことはありますし、一度に色々やると混乱しますので・・・。


写経編

準備が整ったら、ぜひ第3章、第4章を写経してみてください。第3章「プログラミング言語Groovy」ではBeanやGString、クロージャ、コレクションなどGroovyの「軽量」度合いがよく伝わると思います。たとえば、Beanであれば余計なものを一切書く必要がありません。

class MyClass {
    String msg
}

これでGetter/Setterが自動生成されます(同書, p.52)。JavaでもIDEを使えば自動生成できますが、リファクタリングでフィールドが移動する場合などを考えると結構メンテナンスが面倒であることや、そもそもの圧倒的な可読性のよさを考えると、やはりこうやって書けるのはうれしいものです。


第4章「Groovyのライブラリ」ではGroovyに準備されているさまざまなライブラリが紹介されます。ここで紹介されているものは、笑いがこみ上げるくらい小気味よいものばかりです。たとえば、こんなXMLを出力する処理を考えてみてください。

<Products>
    <Product type='regular'>
        <Name>Instant Noodle</Name>
        <Price>147</Price>
    </Product>
</Products>

Javaであれば、あの面倒なDOM/SAXプログラミングが頭をよぎるところですが、Groovyならこれだけです(同書, p.130)。

import groovy.xml.MarkupBuilder

def xml = new MarkupBuilder()

xml.Products() {
    Product(type:'regular'){
        Name('Instant Noodle')
        Price(147)
    }
}

すごいですよね。動的言語である強みを存分に活かした設計と言えるでしょう。


また、第4章はデータベース処理についても、それなりの紙面が割かれているのが大きな特徴だと思います。実際にエンタープライズで使おうと思ったときに必要なものはきちんと押さえてくれているということですね。


応用編

この後はすこし進んだ話題になります。第5章「進んだ話題」で紹介されているものは、すぐには使わないかもしれないものも多いかもしれないですが、適度に写経しながら読み進めると色々参考になります。AST変換で特に目を引くのが、@Singletonや@Immutableというアノテーションですね。こうしたアノテーションを使うことで必要なコードが自動生成されるというのは、Groovyの大きな魅力です。


第6章「Groovyのエコシステム」ではGroovyを取り巻くさまざまなプロダクトが紹介されます。1つ1つは基本的には概略ですが、いくつかのプロダクトにはそのまま動かせるコードもついていますので、手を動かしながら全体像をとらえるのに丁度よいと思います。


第7章「Groovy1.8の新機能」は最新版で追加された機能の紹介ですね。ちなみに、さらっと書いてありますが、Sqlクラスがページングに対応したそうです。これってすごいことじゃないですか?(同書, p.274)

sql.eachRow('select * from EMP', 101, 20) { row ->
    // 各行ごとの処理
}

終わりに

エントリの本文でも書いている通り、この本は電車の中で「読む」のではなく、ある程度時間をとって手を動かしてみるのがよいと思います。新しい考え方が紹介されているのではなく、「これまでやってきたことがこんなに楽にできますよ」ということが豊富なサンプルコードとあわせて説明されているからです。書くコードの量がすくなくてすむGroovyの性質上、ある意味写経のやり甲斐はないかもしれませんが、読み終わる頃にはある程度Groovyのことがわかるようになっているのではないでしょうか。Javaプログラマに対するGroovyの敷居の低さは驚異的です。


実は、Groovyにも黒魔術っぽいところはあります。私自身もそんなに知っているわけではありませんが、たとえば、以前DSLでご紹介したASTの操作は明らかにそちらの世界に一歩踏み出しているでしょう。ただ、この本では、Groovyのそういう部分に対してそれほど触れていません。Groovyの持つ普段の仕事を確実に楽にしてくれるであろう部分が、いわば「謙虚に」まとめられています。この辺りは、「Groovy便利なんだからもっと使えばいいのに」という著者の方々の思いがこもっているように感じられます。


個人的にはGroovyに対して、どう控えめに見てももっと評価されてよいと思っています。この本がきっかけで、Groovyがもっと多くの人に使ってもらえるようになることを祈っています。


プログラミングGROOVY

プログラミングGROOVY

*1:こういうまとめはどなたかがなさっているかもしれませんが、不勉強ゆえよく知らず・・・

*2:先日のTDDBCはちょっと特別ですね。

nobusuenobusue 2011/07/08 02:05 的確な書評ありがとうございます。
4章のデータベース処理まわりは個人的に思い入れがあるので、執筆意図が伝わったことを素直に嬉しく思います。
Groovyはエンタープライズシステムの開発の周辺でデータの加工などに使っていただくことで威力を発揮すると思いますので。

digitalsouldigitalsoul 2011/07/08 22:20 nobusueさん

コメントありがとうございます!そうでしたか。メッセージを正しく受け取ることができてよかったです。良書だと思いますよ、本当に。Groovyが流行するといいですね〜

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証



Copyright(C) 2005-2011 Digital Romanticism. All Rights Reserved.