CGIKit

http://www.spice-of-life.net/cgikit/
るびま3号のインタビューで、かずひこさんがちらっと「よさげ」と言っていたCGIKitを眺めてみた。

CGIKitはRubyで書かれたWebアプリケーションフレームワークです。Webページをコンポーネントとして扱うため、通常のCGIプログラムよりも効率の高い開発が可能です。

ひととおりユーザーガイドを読んで、その後 ライブラリのチュートリアルを非常にわかりやすくまとめてくれている山本さんのサイト(http://www.gesource.jp/ruby/cgikit/simplebbs/index.html)のサンプルを流し読んだ。
結論。
これは使える。
以前から名前は知ってたんだけど、こんな地味な名前でこんな素晴しいライブラリだったとは。
ただ、
すげえええええええええええ、おしい。
素晴しいアーキテクチャですごく生産性が高そう。何回でもいうけど、これは非常に素晴しいCGI用のライブラリだと思います。下手するとこれだけでrubyキラーアプリ*1になる気がします。ただ、それなのに、ああ、それなのに、つまらないところですごく大きな損をしている。主に二点。

  1. テンプレートにcgikitなる独自タグを利用している。
  2. バインディング定義に利用する独自フォーマットがよくわからない。

基本的に、CGIKitは、ロジックを記述するrbファイル、テンプレートを記述するhtmlファイル、その間の関係を定義するバインディングファイルの3つから一つのコンポーネントを生成し、コンポーネントのまとまりとしてサイトを構築する構成になっています。

テンプレートにcgikitなる独自タグを利用している。

一点目に関しては、テンプレートとロジックを結びつけるマーカーにcgikitという名の独自タグを利用しているのが痛い。これによって、作成中のテンプレートが普通のブラウザで見れなくなってます。
erbみたいにロジックまでテンプレートに埋めこめちゃう仕様ならブラウザで見れなくてもしょうがありませんが、cgikitタグに指定するのはほとんどの場合、識別用の名前だけ。これなら、amritaみたいに特定のidでHTMLタグに名前を埋めこんでおけば十分なはずです。
そうすれば、今はバインディングの中で定義している名前とエレメントの型のマッピングも、idを埋めこんだHTMLタグとの関係で自動的に行うこともできる。cgikitタグはほとんど子要素を必要としないけど、そういう場合はidをつけたHTMLタグの子要素を無視しちゃえばいいだけ。逆にそこは無視されるからダミーコードをしこんでおけて、テンプレートファイルだけプレビューするときに便利*2
んー、標準ライブラリだけで動くことを目標にしているから、HTMLをそこまでちゃんとparseするのが面倒、ということなのかな。じゃあXHTML限定でもいいからREXMLつかって楽しましょうよ。

バインディング定義に利用する独自フォーマットがよくわからない。

そして二点目、一番重要であるはずのバインディング定義が独自フォーマットで、かついろいろrubyらしくない。エレメントごとに属性の意味や設定できる値のタイプが激しく違うのです。これは読みづらい。山本さんのところでは実用的かつ非常にシンプルなサンプルを見ることができるのですが、そのサンプルを読むのでさえ苦労しました。
またこのフォーマット、元々はWebObjects由来のもののようですが、rubyの配列やら文字列を書けるようにいろいろがんばって拡張された結果、「rubyの式が書けそうなのだけど、油断するとparseエラー」というものになってしまっているようです。これは書きづらい。
いっそのこと、Rubyで書けるようにしちゃいましょうよ。たとえば、バインディングクラスを定義してロジックのほうにmixinする、なんてのはどうでしょう。今流行りのDI(IoC)みたいなのでもいいですよ。それはいきすぎかな。にしても、もうちょっとなんとかなるんじゃないですかね。例えば、繰り返しを表現するCKRepetitionのバインディング定義なんかはイテレータ使うとか。そすれば、繰り返しの中に含むエレメントのバインディングももうすこし素直に書ける気がするのですが。
この二点だけなんとかなれば、(本当はコンポーネントのネストにも問題がありそうなのですが)他のCGIライブラリなんか寄せつけないほど素晴しいものになると思うのですよ。
とかなんとか書きながらも、実際使ってはいないのだけど…。週末にはなんか書いてみます。はい。

*1:いや、ライブラリなんだけどね

*2:このへんはamritaと同じ理屈