OO / DDDスタイルでアーキテクチャを開発し、いくつかのドメインエンティティ、たとえばOrderエンティティをモデル化する場合、注文に関連するロジック全体をOrderエンティティに配置します。しかし、アプリケーションがより複雑になると、Orderエンティティはますます多くのロジックを収集し、このクラスは非常に巨大になります。
巨大になる傾向があるクラスは、多くの場合、重複する責任を持つクラスです。順序は、複数の責任を持つ可能性があり、アプリケーションでさまざまな役割を果たす可能性があるクラスの典型的な例です。
注文が表示されるコンテキストを考えると、それは可変状態のエンティティである可能性があります(つまり、交渉フェーズ中に注文の商業的状態を管理している場合)が、アプリケーションがロジスティクスを管理している場合、注文は異なる役割を果たす可能性があります。不変の値オブジェクトは、ロジスティックのコンテキストで最適な実装である可能性があります。
貧血モデルと比較すると、確かにアンチパターンですが、その巨大なロジックはすべて異なるサービスに分離されています。
...そして分離は良いことです。:-)
元のモデルはおそらくデータ中心であり、さまざまな目的(注文の作成、支払い、注文の履行、注文の配信)に役立つデータが同じコンテナー(Orderクラス)に積み上げられているように感じました。ここからは言えませんが、非常に頻繁なパターンです。このデータのすべてが同時に同じ目的に役立つわけではありません。
多くの場合、あなたが説明しているような肥大化したクラスは、境界コンテキスト間の分離の欠如、および/または同じ境界コンテキスト内の不完全な集約分離の匂いです。私は見てみたいと思います:
- 一緒に変わるもの;
- 同じ理由で変わるもの;
- 行動を遂行するために必要な情報。
それに応じて集計境界を再定義してみてください。そしてまた:
- アプリケーションのさまざまな目的。
- さまざまな利害関係者。
- さまざまな暗黙のモデル/言語。
関係するコンテキストを発見することになると。
大規模なアプリケーションでは、複数のモデルが存在する可能性があるため、少なくとも多くの役割を果たしている概念については、単一のドメイン概念の複数の表現につながる可能性があります。
これは、ポールのアプローチを補完するものです。