16

これを明確にしたいと思います。私がドメイン貧血と言うとき、私は意図的なドメイン貧血を意味し、偶然ではありません。私たちのビジネスロジックのほとんどが一連のサービスの背後に隠されている世界では、完全なドメインモデルが本当に必要ですか?

これは、「ドメイン」モデルが実際には永続性モデルであるプロジェクトに取り組んで以来、私が最近自問しなければならなかった質問です。どのドメインオブジェクトにもメソッドは含まれていません。これは非常に意図的な決定です。

最初は、本質的にタイプセーフなデータコンテナでいっぱいのライブラリを見たときに身震いしましたが、この特定のシステムは基本的なCRUD操作ではなく、基本的なCRUD操作を実行するのではないかと思ったので、この場合はこれが適切な選択です。 。私の問題は、これまでの私の経験がリッチドメインモデルに非常に焦点を合わせていたので、少し投げられたということです。

ドメインロジックの残りの部分は、別のアセンブリに存在するヘルパー、ファサード、およびファクトリのグループに隠されています。

これに対する人々の考えを聞きたいと思っています。明らかに、これらのクラスの再利用に関する考慮事項ははるかに単純ですが、それは本当に大きなメリットですか?

4

7 に答える 7

6

フルドメインモデルは必要ないかもしれないことに同意します。ただし、非貧血ドメインオブジェクトのテストを作成するよりも、モックデータアクセスオブジェクトを使用してサービスのテストを作成する方が苦痛だと思います。私は現在、ドメインロジックがドメインモデル以外のすべての場所に存在し、ヘルパー、戦略、メディエーターに散在しているプロジェクトに取り組んでいます。そして、本番環境に移行する前から、すべてが管理不能なレガシーコードの山になっています。

以前のプロジェクトを振り返ると、貧血のドメインオブジェクトを使用したプロジェクトを思い出します。これには、ひどい自家製のxmlデータベースなど、多くの問題がありましたが、サービスベースのアプローチを採用しているため、問題を1つずつ簡単に解決できました。時間と本当の前進をします。現在のプロジェクトでは、彼らは巧妙にドメインオブジェクトをデータベースに結び付けようとしました。ActiveRecordスタイルであり、依存関係を制御するための努力はしませんでした。ドメインオブジェクトのデータベースへの緊密な結合、静的メソッドの乱用、および依存関係のスパゲッティのようなWebは、このコードベースが時期尚早に脆弱で柔軟性がなく、テスト不可能な大きな泥だんごになった原因の大きな部分を占めています。したがって、永続性を無視するリッチドメインオブジェクトを使用すると、ビジネスロジックのテストがはるかに簡単になりますが、重要なことは、依存関係を管理することです。

于 2010-05-04T17:26:23.863 に答える
5

OOアンチパターンが実際にはSOAパターンであるのに対し、貧血ドメインはあると思います。抽象化のレベルを上げたため、ルールが少し変更されました。

私は自分が書いているシリーズでさらに探求しています。去年のログにもそれについての怒りがありました。metallemon.blogspot.com/2008/07/soa-and-anemic-domains.html

http://hubpages.com/hub/Building-Service-Orientated-Architecture

于 2010-07-28T04:54:26.767 に答える
5

6年後、これにはメジャーアップデートが必要です。

簡単な答えはイエスです。しかし、複雑な答えはノーです。

いいえ、SOAは貧血を必要としません。しかし同時に、エンタープライズシステムはSOAを使用して作成する必要はありません。同様に、アーキテクチャはどのコードにもまったく必要ありません。悪夢になりますが、必要に応じて、すべての機能を1つのモジュールにパッケージ化できます。

簡単に言えば、OOは元々、前任者との違いによって定義されていました。より具体的には、C ++はCとの違いによって定義されました。しかし、OOの定義は変更されました。現在、多数のOO原則があります。

免責事項:これらの原則の多くは、OOの前に部分的または全体的に作成され、OO革命中に単に主張または更新されました。また、OOはLONG​​-Before C ++で使用されていることを認識していますが、それでも私のステートメントは変わりません。

カプセル化、継承、ポリモーフィズム、関心の分離、永続性の無視、高凝集度/低結合度、S、O、L、I、Dなど。

それだけでなく、これらの原則に従いながらDDDやTDDに従う場合は、ほとんど設計する必要はありません。これらの原則に従うだけで、当然、貧血ドメインモデルを使用するサービス指向アーキテクチャになります。

考えてみてください。Save()、、SendMessage()およびPayEmployee()...を含むEmployeeクラスがある場合、現在のオブジェクト指向原則の非常に多くのルールに違反しています。

特定の責任を分析して、さまざまなサービス、リポジトリ、コマンド、工場などに引き出す場合...あなたは助けることはできませんが、空の従業員クラスを持っています...ある種。

なんか?

正直なところ、値オブジェクトの概念を念頭に置く必要があります。OOの定義が進化しただけでなく、「貧血」の定義も進化しました。Employeeクラスは確かに空であってはなりません。たくさんの「ビジネスロジック」を含めることができます。

Employeeクラスには次のものがあります。

  • パラメーターが検証されるパラメーター化されたコンストラクター
  • フィールドを計算する読み取り専用プロパティ
  • Employee.ToString()、Employee.TryParse()、および同様のオブジェクトメソッド
  • おそらく他の人、従業員に固有

本質的に、従業員はまだ貧血です。ドメインモデルにアルゴリズムやコードフローロジックが存在することは決してありません。しかし、ビジネスロジックは1種類だけではありません。

Martin Fowlerが10年以上前に貧血ドメインモデルがアンチパターンであると言ったとき、それはすでにますます実行可能になりつつありました。彼の推論は2つあり、どちらも古いニュースです。

彼の最初の折り目は、OOの防御的な定義は、古い手続き型のスタイルとは対照的に、コードとデータが結婚している、つまり「データを組み合わせて処理する」ことでした。残念ながら、これは悪いコードにのみ当てはまります。継承とポリモーフィズムに従うと、関数がクラスに実際に存在するわけではないことがわかります。それらはポインタに存在するため、継承するクラスはそれらをオーバーライドして移動できます。しかし...彼らは読みやすさを向上させるためにコードに住んでいますか?彼らは確かにすべきではありません!これらは、インターフェイスと抽象化で定義し、クラスでのみ実装する必要があります。マーティン、申し訳ありませんが、コードとデータの組み合わせが20年前のOOの大きな元々のセールスポイントであったこと正しかったのですが、今ではそれほど問題ではありません。

彼の2つ目の特徴は、SOAが正しく行われていないとして失格となることであり、今日のN層アーキテクチャと非常によく似た説明を示しています。確かに、これは新しいテクノロジーではないことはわかっていますが、定義は何年にもわたって変更されています。

マーティン・ファウラーだけでなく、彼がすぐに彼の記事を引用した後、SOA自体がアンチパターンであると言った後の多くの人々は、貧血モデルを必要としたため、ファウラーはアンチパターンであると言います。

だから私たちはこれに取り掛かっています...

貧血ドメインモデルは、人々が信じているほど貧血ではありません。そしてSOAが必要であり、それを割り引くことはできません。残念ながら、これは単に物事がそうである方法です。

なぜSOAが必要なのですか?-これは説明が多すぎます。しかし、長い話-短い:90年代のドメインでは、ソフトウェアはPCとサーバーで実行されていました...そしてハードウェアはそれらのモノリスに「プラグイン」されていました。最近、私たちは文字通り何もの「コンピューター」を身の回りに持っています。煙探知器、冷蔵庫、時計、電話...最近のコンピューターは物事に接続されています。したがって、すべてのアイデア、部門、懸念事項、およびオブジェクトは、独自の小さなドメインです。それらを独自の小さなサービス、さらにはサブサービスに書き込むために、SOAが必要です。

したがって、アプリケーションは(サービスをアプリケーションに接続する代わりに)サービスに接続するようになりました。SOAを作成するには、SOLIDや関心の分離などのOOの現在のルールに従うだけです。そしてそうするとき、私たちは自然に貧血ドメインモデルに到達します...ちょっと。

したがって、SOAには貧血ドメインモデルは必要ありません。これらは、現在の原則と基準に従った自然な結果です。

于 2016-01-20T05:08:33.277 に答える
3

これはまさに、人々がWebサービスにとても興奮していることについて私が理解できなかったことです。誤解しないでください。そこにはいくつかの良いアイデアがありますが、ここでは手続き型プログラミングに違いはありません。あなたのアーキテクチャを見てください。あなたが説明するのは、すべてのOOPを使用して、完全に手続き型にすることです。プレーンなデータ構造、アルゴリズム、モジュールを使用するのはどれほど簡単でしょうか?私はあなたの状況を知りませんが、ストアドプロシージャとWebサービスへのいくつかのバインディングを備えたリレーショナルデータベースを使用する方がどれほど簡単かを考えます。もう1つの答えは、ある意味で私に同意しているようです...あなたの状況でもっと理にかなっているのか、そうでないのか、あなたの考えを聞きたいのですが、なぜですか?Webサービスの手続き的な性質について間違っていますか?

于 2010-05-04T20:16:27.190 に答える
2

アーキテクチャはSOAベースであり、メッセージングを使用して実装されていると思います。その場合、ドメインモデルはサービスレイヤー内に配置する必要があります。つまり、アーキテクチャ全体を強制的にドメインモデルに形成する必要はありませんが、サブアーキテクチャに適用することはできます。

于 2010-05-04T17:33:33.150 に答える
1

これをよりよく説明するいくつかのリソースがあります。

SOAデザインパターン

SOADで整合性を実現する

あなたのSOAがVWビートルのようにならなければならない理由

于 2010-07-28T07:57:52.747 に答える
1

私は、ほとんどのプログラマーがOOPを理解していないことを発見しました。それが導入されたとき、私たちがもう別の住所データ構造をプログラムしない方法と、これらのクラスがコードをデータに結合して、検証コードをさらに書く必要がないようにする方法について、誰もが喜んでいました。

次に、現実が始まりました。私の住所のアイデアは、必ずしも他の人のアイデアと一致するとは限りません。さらに悪いことに、私のアドレスの概念は、私が今日取り組んでいるシステムによって変わる可能性があります。そして、それは単純なものです。

そして、それはさらに悪化しました。継承?あれは何でしょう?抽象的、仮想的、..コンパイラをシャットダウンするためのコードに入れるキーワードだけ。

さらに悪いことに、コードパターン。オブジェクトを検証する必要がありますか?ここでこのヘルパーパターンを使用してください...

したがって、ほとんどの人が「クラス」は何らかの形で関連している可能性のあるランダム関数の構造体またはダンプグラウンドのいずれかであると信じているところに到達しますが、神はクラスの実際のコードをそれによって定義されたデータとともに配置することを禁じています。

于 2010-05-04T18:08:38.060 に答える