cypher256's blog

Pleiades とか作った

Rails の暗黒面

ただ、Railsの中心的な考えであるConvention Over Configuration(CoC)は、強力だけど、暗黒面も強いと思うんだよね。一見簡単に見えるけど、ちゃんとしたアプリケーションを作ろうとしたら、かなり踏み込んだことまで知らないと、使いこなせない。

バージョンアップが早いので、直ぐに知識が陳腐化するだけでなく、前動いていた機能が動かなくなってしまうこともそれなりにある。

Railsの暗黒面とSeasar2の脱CoC - yvsu pron. yas

今丁度、Rails を使ってガシガシやってます。SAStruts ではありませんが、Java とも連携しています。RailsJava フレームワークの違いは色々なとこに書かれてますが、SAStruts と比較して個人的に思うところを長所短所含めてざっくり (フレームワークだけでなく、言語仕様もごちゃまぜで言ってます)。ちなみにどちらかを貶したり、擁護する気はありません。

  1. Rails後方互換性のなさは死ぬ。仕様も情報もプラグインも。
  2. RubyRails もやっぱりコード量少ない。びっくりするぐらい多機能。
  3. Rails に良くも悪くもフォームクラスはない。Java で言えばただの Map みたいな。
  4. ActiveRecord のモデルの DB 更新検証機能が○。
  5. Rails ってコントローラー変更するとサーバー再起動しないとだめなことが多い?


上記 2 については、動的言語ではない Java は到底太刀打ちできません。これは共通化とかコード自動生成とか、そういうレベルでなく、継承しないでクラスを好きに拡張できたり、実行時に動的にメソッドを生成したりを指しています。Java は存在しないメソッド呼び出しはコンパイルできないため (最低インターフェースが無ければ)、このあたりは実現できません。ただ、Ruby のこれは、デバッグ時に軽く死ねます。

上記 4 については、モデル更新時に検証しているのが、Javaフレームワークと違い良いとか書いている人がどっかにいましたが、これは単純にフォームクラスを持たない Rails では定型的なチェックは、ここでしかやりようがないだけな気がします。でも、レイヤーの責務とか言う気はありませんが、実際のシステムでの入力チェックはレイヤー単位が理想的です。

  1. 画面入力項目チェック
  2. 画面入力項目相関チェック
  3. DB 整合性チェック (関連するレコードが存在するとか)
  4. DB 物理属性チェック (桁数、not null とか)


SAStruts は 1、2 の一部、4 は入力チェックアノテーション、あとはアクションかサービス、Rails は 1、4 をモデルのチェック機構でを行い、あとはコントローラーかモデルのどちらかになっていると思います。今回 Rails を使用したプロジェクトでは DB メタ情報を元に DB 物理属性チェック機能付きのモデルのソースコードを静的に自動生成するようにしています。実行時に動的に DB メタ情報チェックのほうがかっこいいかもしれません。DB 物理属性のチェックって必要ですが、書くのはめんどくさいだけで面白くないですもんね。

S2JDBC の機能に DB 物理属性チェックが取り込まれると嬉しい気がします。でも、メッセージの伝播をどうするか、UTF-8 マルチバイトは、メッセージや項目名との紐付けは、バッチで使った場合は、とかで複雑化して CoC っぽくなるのも避けたいところです。

静的にコードを生成できるということはフレームワークに無駄があり、動的生成を多用するフレームワークは CoC 色が強くなりがち。前者は IDE の補完やチェック機能を享受する目的もありますが、静的であれ動的であれ、自動生成は少なければ少ないほど良い気がします。