TOP
>
システム開発
> Java/DIのトランザクション
徹底比較!!Ruby on Rails vs Javaフレームワーク
第4回:DIコンテナとの比較
著者:
アスタリクス 大西 正太
2006/9/20
前のページ
1
2
3
4
Java/DIのトランザクション
リスト11がSpring Frameworkを用いた宣言的なトランザクション記述のサンプルです。ワイルドカードを用いて「UserRegisterService」というクラスのすべてのメソッドに「PROPAGATION_REQUIRED」トランザクション(「開始されていなければ開始する」という意味のトランザクション属性の種類)の指定をしています。
リスト11:Springでの宣言的なトランザクション
(画像をクリックすると別ウィンドウに拡大図を表示します)
リスト12はSpring Frameworkのプログラマティックなトランザクションです。無名インナクラスとコールバックを駆使し、トランザクション関係のロジックは共通化されています。宣言的なトランザクションに比べると短く書けますが、すべてのデータベースアクセスについて毎回記述する必要があります。
リスト12:Springでのプログラマティックなトランザクション
(画像をクリックすると別ウィンドウに拡大図を表示します)
Railsのトランザクション
調査した範囲ではRailsには宣言的なトランザクションの機構が見当たりません。プログラマティックな記述を用いるのが一般的です。
プログラマティックな記述はRubyの「ブロック」と呼ばれる仕組み(クロージャとも呼ばれる)を用いて実現されており、Java側のインナクラスを駆使した方法と同じ手法がよりシンプルな記述で実現されています。
リスト13:Railsでのプログラマティックなトランザクション
Person.transaction do
person.save
end
トランザクションの比較
ぱっと見ではSpring Frameworkの宣言的な記述のコード量が多いため、Rails優勢に見えるかもしれませんが、Railsではそもそも宣言的な記述自体ができません。
先述したようにトランザクションは宣言的・プログラマティックの双方を併用できることが好ましいため、両方をサポートしているJava/DIの方が優勢であるといえます。
Railsを用いた場合、ほとんどすべての更新メソッドにトランザクション記述を書かなくてはならず、記述漏れによって品質が低下する可能性があります(記述自体はシンプルなので生産性への影響は軽微です)。
終わりに
Java/DIの代表的なメリットのうち、モックオブジェクトに関する部分はRubyの力を用いることで、Railsの標準機能としてよりシンプルに実現されています。トランザクションについては今のところ宣言的なトランザクション記述ができず、Java/DIに一歩譲っている状態です。
ただし、あくまで私見となりますが、現在ライブラリは見当たらないものの、Ruby上であれば宣言的なトランザクションをよりシンプルに実装することは可能ではないかと思います。
DIコンテナはJavaに柔軟性を与えるために生まれ、様々な効果を発揮しています。一方、Railsは始めからRubyという柔軟な言語上に構築されており、DIコンテナ上に作られたものと同じ効果をDIコンテナなしでよりシンプルに実現できてしまう傾向があるように感じます。RailsがDIコンテナを採用していない理由はその辺りにあるのかもしれません。
さて、次回はテストをテーマにとりあげます。お楽しみに。
前のページ
1
2
3
4
著者プロフィール
株式会社アスタリクス 大西 正太
JavaEEフレームワークの設計構築や開発プロセス策定などの業務を経て、現在は新規ビジネス創生に携わる。Ruby on Rails上に構築したオープンソースのCMS「Rubricks」(
http://rubricks.org/
)のコミッタ。
INDEX
第4回:DIコンテナとの比較
はじめに
Java/DIのモックオブジェクト
Railsでモックを実現
Java/DIのトランザクション