RailsとHibernate+Tapestry

最近Railsを使い始めてずーっとすげーすげー言ってきてしまっているので、ちょっと冷静になるためにHibernate+Tapestryと比べてみようと思う。かと言って熱しやすい僕の頭は今Railsサイコーって舞い上がっているので、どこが良いのかをできるだけ落ち着いて書いてみる。

ActiveRecord vs Hibernate その1 select

両者ともSQLを使うことは可能。でもHibernateはHQLがメインでSQLはおまけという感じがドキュメントから臭ってくる。HibernateのHQLは、joinのon以降をいちいち書かなくて済むので便利!とか思ってたんだけど、SQLを直で弄らざるおえないときとかはどうしても発生する。ActiveRecordSQLの一部をメソッドの引数、あるいはメソッド名(メッセージ名と言ったほうが良い?)の一部で指定することで、SQLを簡略化することが可能。でも、僕は最初からフルのselect文を書く方が楽なんじゃないかという気がしている*1

それからActiveRecordは、テーブルに存在しないカラム名(例えば単価*数量 as 金額)のデータも、動的にオブジェクトに属性としてしまうことができちゃう。Hibernateでやろうとするとマッピング定義にそういうカラムがあるように書く(propertyをinsert="false", update="false"にすればOKなのか?)、あるいはfindメソッドの結果をタプルで取得して、オブジェクトのプロパティに手動で代入するということをやる必要があるかもしれない。っていうか、Railsで知るまでそんなこと考えなかったので、正直Hibernateでどうやるか分からんっす。

ActiveRecord vs Hibernate その2 更新系

両者ともinsert,update,deleteは楽チンになるように出来ているけど、Hibernateはテーブルにマッピングされたクラスの同一IDのオブジェクトがセッション上にダブって存在すると、saveとかで面倒なことになる。ActiveRecordはオブジェクトはただの箱として割り切っているようなので、その辺は問題なさそう。


Tapestryとの比較はTapestry3.0に基づいています。4.0は使う機会がなかったので分かりません。

ERB vs Tapestry

ERBはJSPと同じような書き方なのではっきり言って嫌い。この点ではTapestryのすっきりさはやっぱり素敵。
でもTapestryの式言語として使われているOGNLはMapとかの記述は楽なんだけどクラス変数を使うとき(@FQN@変数名)が長くなるのがちょっと微妙。その点ERBはrubyの文章がそのまま書けるのが素敵。

ActionController vs Tapestry その1 コンポーネント

コンポーネント化(両者ともHTMLの部分をレンダリングするクラスをコンポーネントと呼ぶ)については、railsの方はまだ勉強中なので不明。でもActionControllerの方は、partialなビューというものがあって複数のコントローラで共用することが可能で、ルールを守るならrhtmlファイルを作るだけでOK。一方Tapestryの方もテンプレートのHTMLとそのjwc(コンポーネント定義XML)を作り、xxx.applicationに反映させればいいんだけど、比較するとお手軽じゃない気がする。Tapestry4.0からはコンポーネント用のディレクトリとかを指定できるらしいので、4.0はお手軽かも。

それからJavaScriptとHTMLのまとめ方もTapestryの方が素敵。HTMLのHEADタグ内に書くJavaScriptとBODYタグ内に書くHTMLフラグメントをきちっとまとめて簡単に使うことができる。

ActionController vs Tapestry その2 URI

これはActionControllerがいい!というかTapestryの作るURLはわかりにくい。Ajax以前ならそれでもそんなに問題じゃなかったけど。この対応策としてTapestry4.0からはfriendly urls機能が組み込まれているそうです。
http://wiki.apache.org/tapestry/Tapestry4Final

その他

Railsには一気に機能を追加するgeneratorとかpluginとかがあってすごく便利。例えば、機能紹介したauth_generatorはテーブル定義、モデル、コントローラ、ビューを全て生成する。こういうレイヤーを貫いて縦割りで機能を提供できる仕組みができているっていうのはすごい。レイヤリングがしっかりしやすいJavaフレームワークでは難しいのかもしれない。

開発環境

僕が知らないだけかもしれないけど、Rubyにはリファクタリングブラウザがないっぽい。これがあったら言うことないんだけど。

Ruby vs Java

やっぱり今は開発初期段階ってこともあって、自分の考えが素直に表現できるRubyの方がいい感じ。既存のクラスにメソッドを追加するなんてJavaではAOPを使わないとできないけど、Rubyは素でできちゃうんだもん。その機能のおかげでRails1.1からはto_jsonメソッドがObjectに追加されて、簡単にJSON形式での通信ができるようになっちゃった。でもやっぱり実行スピードはJavaの方が速いはずなので不安は残る。

でもRubyならコードを短く書ける。Javaで同じこと書こうとしたら2〜3倍の行数になってしまうかもしれないと思うことも多数あった。実際僕の書いたへっぽこなJavaのコードは業務ロジックが複雑で*2ぐちゃぐちゃになりつつある。

システムの規模にもよるけど、コードが複雑になればなるほど余計な処理が入りやすくなって結果システムが遅くなり、コードがすっきりしていればチューニングも何とかなるんじゃないのかなーという気がしてるけど、楽観的すぎ?

まとめ

現時点で可能ならば僕はRailsを採用する。もちろん他のシステムのとの連携とか色々考えなきゃなんないけど。
Railsは楽しい。楽しさは開発言語やライブラリだけに依存してるわけじゃないけど、それらも重要な要因だとも思う。そして楽しいと開発効率が上がることもおそらく間違ってないと思う。
HibernateTapestryも勉強し始めたときは楽しくて仕方なかったのを覚えてる。だからきっとそのうちRails以上のものが出てきてわくわくさせてくれると思う。そんなわけでHibernate/Tapestryユーザに限らずRailsを試してない方には、次の楽しい何かが出てくる前に使ってみることをお勧めします。

お願い

RailsだけでなくHibernateTapestryについても僕は単なる1ユーザでしかないので大ボケかまして、もしかしたらまた自分の無知を晒すような文章を書いてしまったのかも、と今更気付きました。間違っていたらツッコミお願いします。

*1:以前はSQL書くの嫌だったんだけど、最近好きになってきたかも。特にSQLの勉強とかしてないんだけど。Hibernateのおかげ?

*2:言い訳です。僕が未熟なのでぐちゃぐちゃになるんです