1

質問の短いバージョン: 「2 つのサブクラスを持つスーパークラスを持っても大丈夫ですか。1 つはエンティティで、もう 1 つは値オブジェクトですか?」

より長いバージョンへ: T にはTeamスーパークラスがあります。チームには、MasterHelpers、およびCodeがあります。次に、 TeamのサブクラスであるDefaultTeamを持っています。これは、独自の **Code**** を持つエンティティであり、ドメイン ID を持っています。次に、 **ExecutionTeam を持っています。これはTeamのサブクラスであり、追加の属性OriginalTeamがあります。

public abstract class Team{

    public string Code{ get; protected set; }

    public Worker Master{ get; protected set; }

    public IList<Worker > Helpers { get; protected set; }
    ...

}

public class DefaultTeam: Team
{
}

public class ExecutionTeam : Team
{

    public virtual string Code { get { return OriginalTeam.Code; } }

    public virtual DefaultTeam OriginalTeam { get; private set; }

   ...

 }

ExecutionTeamは、 Taskを実行するチームです。Taskを実行する必要がある場合は、 DefaultTeamを選択して実行します。ただし、 DefaultTeamからヘルパーを変更できます(マスターは変更されません)。

タスクを実行するチームは、 DefaultTeam ( OriginalTeam )のバリエーションですが、そのタスク専用に選択されたヘルパーを持ちます。

ExecutionTeamには、 OriginalTeam と同じコードが含まれます。したがって、ExecutionTeam には一意の ID がありません同じDefaultTeamによるタスクの実行が 10 回ある場合、同じコードを持つ (同じOriginalTeamを持つ) 10 個のExecutionTeamsが存在します。したがって、ExecutionTeamをエンティティにすることはできません。

しかし、同じスーパークラス (両方ともチーム) を共有するエンティティと値オブジェクトを持つことは、少し奇妙です。おそらく、このドメイン モデルには何か問題があります。

意見が必要です。

ありがとう

4

2 に答える 2

0

ExecutionTeam は interface としてより適切にモデル化されているように思えますICanExecuteTasks。それはあなたのために働くでしょうか?あなたが悩んでいる問題を解決してくれるでしょう..

あなたの短い質問に関しては、ExecutionTeamが実際に の派生クラスであったTeam場合 (チームから継承し、「IsA」関係を表す場合、答えはいいえです。もちろん、すべての ExecutionTeam はチームであるため、異なるタイプにすることはできません。同時に aTeamと an の両方である 1 つのことのみExecutionTeam... 同時にエンティティ タイプと値タイプの両方になることはできません。

しかし、構造化されたものを持っているので、クラスを設計した方法はExcecutionTeam派生クラスではなく、DefaultTeam. これは、「HasA」関係にあることを意味します。これは、それらが異なる共存オブジェクトであり、そのうちの 1 つがエンティティであり、もう 1 つが値型であることを意味します。しかし、私の直感では、これは実際のドメイン モデルを正確に反映しているとは言えません...

于 2010-01-03T22:14:23.733 に答える
0

DefaultTeam をエンティティではなく値オブジェクトにするのは何ですか? DefaultTeam もエンティティではありませんか?

そうは言っても、ここにいくつかのコメントがあります:

  1. なぜ DefaultTeam に特別なクラスが必要なのですか? 特定の値を指定して、DefaultTeam を単純に ExecutionTeam にすることはできませんか?

  2. DefaultTeam は、おそらく、アプリケーション ドメインに関連付けられている Team のインスタンスである必要があります。たとえば、プロジェクト XYZ の問題を解決するために一般的に使用される特定のチームがあるとします。

  3. ExecutionTeam のプロパティとして "DefaultTeam" をリストする代わりに、Team クラスと ExecutionTeam クラスの両方のプロパティとして "PreviousTeam" を指定する必要があります。チームが再び変更された場合に備えて、これはより一般化できます。

  4. タスクはドメインの重要な部分であり、チームに割り当てられているため、おそらくチームのプロパティである必要があります。

  5. 「ヘルパー」はチーム メンバーに適切な名前ではないようです。「Members」または「TeamMembers」と名前を付けてみませんか?

  6. Dilbert ランドで作業している場合やデータベースを扱っている場合を除き、"Master" はおそらく PC ではありません :) これを "Supervisor" または "Manager" に変更することをお勧めします。

  7. 「コード」は、プログラミング コードと混同されやすいため、アプリケーションのコンテキストではおそらく不適切な名前です。代わりに「Id」または「TeamId」を使用することをお勧めします。

于 2010-01-03T22:21:54.420 に答える