|
||||||||||||||||
| 前のページ 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
|
||||||||||||||||
| トランザクションの比較 | ||||||||||||||||
|
ぱっと見では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 |
||||||||||||||||
|
|
||||||||||||||||
|
|
||||||||||||||||
|
||||||||||||||||
|
|
||||||||||||||||
|
||||||||||||||||
|
|
||||||||||||||||
|
||||||||||||||||
|
|
||||||||||||||||
|
||||||||||||||||



