/note/tech

クライアントサイドのモデルとは何か 前編 ~ クライアントサイド MVC の死

Rails の ActvieRecord の失敗は、端的に指摘できて、それは Storage 層 と、ドメインを記述するための Entity を区別しないというところにある。

これに気づくまでに人類は多大な犠牲を払った。

この MVC2 は Web 特有のリクエスト・レスポンスに起因していて、コントローラで受けてから値を返すまでのライフサイクルが以上に短い(50ms~1500ms)。また雛形のコードも短い。なので、Enitity と Storage を区別しているステップがもったいない。

そして外部 IO から来る値を元に Entity を組み上げても、短いコードではそのロジックを使う間もなく、Storage にセーブして終わり、となりがち。

単純なCRUDアプリでDDDをやることに躊躇する理由がこれ。ムダなコードを書くことになるのが目に見えてるという。

Rails に Service 層を生やすかどうかよく議論にあがるが、それは ActiveRecord が Entity としての振る舞いをどこに書くかの居場所が Rails の MVC モデルだと用意されてないからだと思う。Controller が分厚くなったら、共通処理は Model に書きましょう、というのがこのアーキテクチャから自然と導かれてしまうアンチパターンで、これは悪い DRY の話にもつながる。

Service層は悪いと言いながらも、HTTPから独立したレイヤーは欲しくて、結局それはService層じゃねーのみたいな。