自分で作っているサービスの関係で, taggable plugin, searchable plugin を見たり, 試したりしているんだけど, 面白い.
% grails install-plugin Searchable
して (ネットワークの向こうのリポジトリからダウンロードされる), 適当なドメイン・クラスに
static searchable = true
を挿入するだけで, 裏で検索エンジン Lucene が走って, そのドメイン・クラスの String フィールドなどを対象に次のような検索ができるようになる.
やろうと思えば, どのフィールドを検索対象にするかとか指定できるし, 検索画面はもちろん自分で作り直せばよい.
ただし, static scaffold すると (generate すると) URLMapping に問題があると言って転ける (dynamic な scaffoldならばちゃんと動く). とりあえず../plugins/Searchable-0.4-SNAPSHOT/grails-app/conf/SearchableUrlMappings.groovy
から "/searchable "の定義を取り去れば動くようになる. 原因は突き止めてない.
一方, taggable pluginは自分で plugin をダウンロードして, やはり install-plugin する.
すると, implements Taggable したドメイン・クラスに, addTag("foo") とかできるようになる. このタグとは blog なんかで使われる意味のタグですね. タグからドメイン・オブジェクトを検索するメソッドは (まだ?) ないとか, どうも gsp から (今のところ) うまくアクセスできてないなどという欠点はあるものの, 面白いでしょ?
gsp から他のフィールドと同じように tags を扱えないのは, Controller の setProperties()/getProperties が inject されたフィールドに対して動作しないからのようだ. plugin でこれらを上書きするか, 明示的に set/get すればよい.
この二つの例の何が面白いかというと, 複数のオブジェクトを横断するいわゆるアスペクトを, grails ではプラグインとして実装すればよいということなのだ. だって「タグ付け (分類) 可能なオブジェクト」は継承とは関係なくいろいろあるだろうし, タグ付け可能かどうかはドメインの本質とは関係ないから分離したいわけだ. プラグインなら後から簡単に付けたり外したりできる. 「検索可能なオブジェクト」というのも同じ.
# この二つの例に限らず, grails 自身がいわばアスペクトの固まりなのですが.
実は「ビジネスパターンによるモデル駆動設計」は, ビジネス系アプリケーションの構造をリソース, イベント, エージェントの組み合わせで, 振る舞いを識別, 期日, 説明, 注釈, 場所, 分類, 通知, 価値のようなアスペクトのパタンで組み上げてしまおうというなかなか頭のよいアイデアなんだけど, この振る舞いのパタン (アスペクト) をまさに grails だとプラグインで実装すればいいわけだ.
# 元の本は惜しいことに .NET を使っている.
エンタプライズ 2.0 系のアプリケーションには, grails はよく効きそうだ.