Yokohama.groovy #7 に参加しました

2012/10/30 Yokohama.groovy #7 #yokohamagroovy - Togetterまとめ

ポツポツと参加者以外の方からも興味をもたれ始めている様子の Yokohama.groovy の 7 回目を実施してきました。
珍しく一番乗りでした。
いつもはビールですが気分を変えてウィスキー飲みつつ開始です。

今回の範囲

プログラミングGROOVY

プログラミングGROOVY

前回に引き続き、"4.1 Groovy API" の "ビルダー" を中心に写経したり議論したりしました。

groovy.xml.MarkupBuilder

MarkupBuilder (Groovy 2.4.5)

リスト 4.3

import groovy.xml.MarkupBuilder

def xml = new MarkupBuilder()

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

同じ XML を出力するJava のサンプルコードも載っていましたが、コード量は段違いに多かったです。
ただ、コード量が少ない事よりもコードと XML との対応が非常に分かりやすく書けるのがいいなあと思いました。

表示系のメソッドを読んでいないのに XML が表示されるのは、引数無しコンストラクタの説明に"Prints markup to System.out"とあるように仕様です。

引数有りを試してみたのがこちら。出力結果は同じです。

import groovy.xml.MarkupBuilder

def sw = new StringWriter()
def xml = new MarkupBuilder(sw)

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

println sw
疑問

サンプルコードを見ると、XML の各要素名のメソッドに各属性を渡して呼び出しているように見えます。
青本によると "ビルダーは Groovy のクロージャメタプログラミングの機能を巧妙に組み合わせて作られて" いるそうです。
メタプログラミング機能によって存在しないメソッドが呼ばれた時の処理を定義しているみたい。
勉強会とは別に中身を確認してみようと思います。

groovy.util.XmlParser と groovy.util.XmlSlurper

XmlParser (Groovy 2.4.5)
XmlSlurper (Groovy 2.4.5)

どちらも XML を処理するためのパーサーです。
XmlParser はメモリ上に全要素を保持して処理し、XmlSlurper はストリーミングとして処理します。

ビルダーで時間を使ってしまったのでさらっとしかできませんでした。

その他

Groovy を学んでいくと、色々なところで Java が見え隠れするため、元々 Java をほとんどやったことがない私としては Java 力が欲しいなあと思う今日この頃。
どちらもちょっとずつ学んでいこうと思います。

今後の開催については会場のタネマキさんの月曜日夜の部がなくなってしまったようなので、当面は隔週火曜日開催になりそうです。
かなりゆるーくやっておりますので、それでもいいよという方は参加してみてください。