113

Anemic Domain Model よりも Rich Domain Model を使用する必要があるかどうかを判断し、2 つの良い例を探しています。

私は、サービス --> リポジトリ --> ストレージ層システムに裏打ちされた貧血ドメイン モデルを使用して Web アプリケーションを構築し、BL 検証にFluentValidationを使用し、すべての BL をサービス層に配置しています。

Eric Evan の DDD 本を読んだことがありますが、彼は (Fowler などと同様に) Anemic Domain Models はアンチパターンであると考えているようです。

だから私は本当にこの問題についていくつかの洞察を得たいと思っていました.

また、Rich Domain Model の良い (基本的な) 例と、それが提供する Anemic Domain Model に対する利点を本当に探しています。

4

10 に答える 10

73

違いは、貧血モデルはロジックをデータから分離することです。ロジックは**Service**Util**Manager、などの名前のクラスに配置されることがよく**Helperあります。これらのクラスはデータ解釈ロジックを実装するため、データ モデルを引数として受け取ります。例えば

public BigDecimal calculateTotal(Order order){
...
}

一方、リッチ ドメイン アプローチは、データ解釈ロジックをリッチ ドメイン モデルに配置することでこれを逆転させます。したがって、ロジックとデータを組み合わせて、リッチ ドメイン モデルは次のようになります。

order.getTotal();

これは、オブジェクトの一貫性に大きな影響を与えます。データ解釈ロジックがデータをラップするため (データはオブジェクト メソッドを介してのみアクセスできます)、メソッドは他のデータの状態変化に反応できます -> これが動作と呼ばれるものです。

貧血モデルでは、データ モデルは正当な状態にあることを保証できませんが、リッチ ドメイン モデルでは可能です。リッチ ドメイン モデルは、カプセル化、情報の隠蔽、データとロジックの結合などの OO 原則を適用するため、貧血モデルは OO の観点からはアンチ パターンです。

より深い洞察については、私のブログをご覧ください https://www.link-intersystems.com/blog/2011/10/01/anemic-vs-rich-domain-models/

于 2015-04-28T08:37:30.683 に答える
45

私の見解は次のとおりです。

貧血ドメイン モデル = オブジェクトにマップされたデータベース テーブル (フィールド値のみ、実際の動作なし)

リッチ ドメイン モデル = 動作を公開するオブジェクトのコレクション

単純な CRUD アプリケーションを作成する場合は、従来の MVC フレームワークを使用した貧血モデルで十分かもしれません。しかし、何らかのロジックを実装したい場合、貧血モデルはオブジェクト指向プログラミングを行わないことを意味します。

*オブジェクトの動作は永続性とは関係がないことに注意してください。別のレイヤー (データ マッパー、リポジトリなど) が、ドメイン オブジェクトの永続化を担当します。

于 2014-05-13T10:55:57.497 に答える
-2

役立つ例を次に示します。

貧血

class Box
{
    public int Height { get; set; }
    public int Width { get; set; }
}

非貧血

class Box
{
    public int Height { get; private set; }
    public int Width { get; private set; }

    public Box(int height, int width)
    {
        if (height <= 0) {
            throw new ArgumentOutOfRangeException(nameof(height));
        }
        if (width <= 0) {
            throw new ArgumentOutOfRangeException(nameof(width));
        }
        Height = height;
        Width = width;
    }

    public int area()
    {
       return Height * Width;
    }
}
于 2017-08-06T07:20:14.323 に答える