3

異なる集合体に属するいくつかのエンティティでいくつかの共通の動作があり、抽象クラスを考慮に入れたいと思います。

異なる集合体のエンティティが共通の抽象クラスから継承することには欠点がありますか?


使用事例

いくつかのエンティティには、異なる言語に翻訳できる名前、説明、またはその他のプロパティがあります。

たとえば、で名前を設定し、setName(language, name)で取得しgetName(language)ます。

各言語の各テキストは、次のようなオブジェクトに保存されます。

class EntityName
{
    protected Entity entity;
    protected Language language;
    protected String text;
    protected int version;

    public EntityName(Entity entity, Language language)
    {
        this.entity = entity;
        this.language = language;
        this.version = 1;
    }

    // setText(), getText(), ...
}

特定Entityのクラスについて、は集合EntityName体内にあります。、経由、およびへの作成、読み取り、書き込みEntityのみが可能です。EntityEntityNamesetName()getName()

ただし、、などのクラスEntityNameはすべてほぼ同じコードを共有します。変更以外の部分は、集合体、つまりコンストラクターへの参照だけです。EntityDescriptionOtherEntityName

4

3 に答える 3

4

このトピックについてはあまりありません。ただし、「ハウツー:ドメイン駆動設計」というタイトルのこの記事をご覧ください。

特に、「ステップ2 –アグリゲートとアグリゲートルートの特定」というタイトルのセクションをお読みください。

高度な状況では、クラスモデルにポリモーフィズムが存在すると、集合体の境界にも影響を与える可能性があります。これは、複数の集約ルートクラスがすべて同じ基本クラスを共有している場合に発生します

適切なドメインモデルの外部にある簿記データ(id、バージョン、タイムスタンプの作成、タイムスタンプの更新)を保存している場合(たとえば、永続層をサポートするため)、これは問題とは見なされません。ただし、真のビジネスメソッドと属性を再利用しようとしている場合は、継承を構成またはAOPの導入に置き換えることを検討できます。

アップデート

更新されたユースケースを見ると、本当のリスコフの関係ではなく、コードの再利用を実際に達成しようとしているように見えます。一部の言語は、ミックスイン(Groovy)や特性(Scala)などの概念を使用して、このタイプの再利用をより適切にサポートします。Javaを想定すると、実行できる1つのアプローチは、クラスを作成し、ProjectLombokの@Delegateアノテーションを使用して実装に転送することです。これには次の利点があります。

  • 同じレベルの集約カプセル化を提供します
  • ソースのすべての重複なしにバイトコードを生成します
  • 本当のis-将来の関係のためにあなたの1つの継承オプションを保存することができます
  • ドメイン全体の一貫性を確保します

これはより純粋であり、モデルの柔軟性を可能にすると思います。私はいくつかのプロジェクトでProjectLombokを使用し、大きな成功を収めました。これにより、Javaに欠けている言語機能の一部を回避し、特定のイディオムを実装するために必要な定型コードよりもドメインに集中することができます。

于 2012-11-21T14:17:32.370 に答える
1

共通の定義が集合ルートの設計に影響を与えない限り、問題ないと思います。つまり、集約ルートのモデリングを開始し、それらに多くの共通点があることに気付いたので、共通の基本クラスを抽出します。

しかし、これについてはよく考えます。なぜなら、さまざまな境界のあるコンテキストからのルートを集約して、多くの共通点を持つ可能性はどのくらいあるのでしょうか。ちょっとしたコードの臭いIMOです。

于 2012-11-21T14:26:40.560 に答える
0

正しい継承は、is-a関係によって定義されます。imhoそれが集約ルートに適用されるケースはほとんどありません。

根が似ているからといって、それらが同じ場所から来ているという意味ではありません。

ドメインで意味のある名前の基本クラスを作成できる場合は、先に進んでください。そうでない場合は、しないでください。

于 2012-11-21T16:50:33.650 に答える