[go: up one dir, main page]
More Web Proxy on the site http://driver.im/ PHP Mentors — DDD アンチパターン:賢すぎるエンティティ
1.5M ratings
277k ratings

See, that’s what the app is perfect for.

Sounds perfect Wahhhh, I don’t wanna

DDD アンチパターン:賢すぎるエンティティ

Symfony Advent Calendar JP 2012 - Day 3


ドメイン駆動設計にしたがってドメインモデルをソフトウェアとして表現するのにエンティティが使われます。エンティティは、ドメイン駆動設計におけるモデル駆動設計パターンの1つに分類されます。

賢すぎるエンティティはアンチパターン

Ruby on Rails由来のアクティブレコードと直結したMVCフレームワークでは、本来エンティティとして扱われるべきクラスを「モデルクラス」と呼び、そこにビジネスロジック等を実装することが推奨されていました。これらのフレームワークでは、自らモデルレイヤー部分もカバーしておきながら、すべてをエンティティとして実装することを強いるため、ドメインモデルの実装にはほとんど自由度がありませんでした。

このスタイルに慣れてしまうと、ピュアなクラスでドメインレイヤーを実装できる状況においても、誤った設計に陥ってしまいます。

問題

  • 責務が多すぎることにより、依存関係が複雑になる
  • レイヤーの境界があいまいになりやすい
  • 実装時の明確な指針がないため、知識の分散が生じやすい

解決

ドメインモデルを分析・設計する時に使える手法として「責務駆動設計」があります。責務駆動設計とは、「オブジェクトデザイン(Object Design: Roles, Responsibilities, and Collaborations)」等で紹介されているオブジェクト指向による分析・モデリング手法です。オブジェクトデザインでは、分析によって現れたクラスを責務に分割していく時に6つの「ロールステレオタイプ」を用います。

  • 情報保持役(Information Holder)
  • 構造化役(Structurer)
  • サービス提供役(Service Provider)
  • 制御役(Controller)
  • 調整役(Coordinator)
  • インターフェース役(Interfacer)

エンティティは本来「情報保持役」であり、オブジェクト指向のクラス設計原則(SOLID)に従えば、これ以外の責務を持つべきではありません。(注意深く設計する場合、1つのオブジェクトに複数の責務を割り当てることもできます。) 明らかなことは、何でもかんでもエンティティに詰め込んで賢くするのではなく、責務を見分けて適度に分割すべきということです。

ドメイン駆動設計のパターン(エンティティ、値オブジェクト、リポジトリ、サービス、ファクトリ)やオブジェクトデザインの6つのロールステレオタイプなどを設計の型として用いることで、「良い設計、良いソフトウェア」を実現しやすくなるといえるでしょう。

最後に、オブジェクト広場にて2008年に掲載されたオブジェクトデザインの著者Rebecca Wirfs-Brockさんへのインタビューで「良い設計」について話された部分を引用します。

「良い設計」とは何なのでしょうか?たとえば、質であったり、構造の美しさであったりするのでしょうか?

これは面白いところですね。「良い設計」は「十分に良い設計」と異なります。Scott Ambler さんなどは、 just barely good enough modeling (*5) を提唱していますが、私は「十分良い設計」は実のところ十分ではないと思っています。 シンプルなものの中には、シンプル「過ぎる」ものもあります。問題が複雑である場合、その解決策も複雑になりがちです。その際は、コードも分かりやすいものになるとは限りません。複雑であり、シンプルにできないためです。理解できるものである必要はありますね。

「良い設計」とは、将来起こりえると思うことや、減らしたいリスクを考慮しているものです。また、結果としての実装が、安心して使えるものであり、メンテナンスしやすいものである必要もあります。

また、設計は変更に耐えるものでなければなりません。設計に何一つ追加できないのは良くないですよね。 将来起こりえると思うことを考慮した、分かりやすさに関する適切なバランスが必要ですね。また、2 年前には良かったものでも、5 年後にはよくないものになる場合もあります。その場合は、新しく作り直したり、考え直したりする必要があります。

参考

Amazon.co.jp ウィジェットAmazon.co.jp ウィジェット
ddd ood symfonyadvent2012 entities

See more posts like this on Tumblr

#ddd #ood #symfonyadvent2012 #entities