3

集約ルートであるエンティティをインスタンス化するファクトリ メソッドを作成したいと考えています。

メソッドは、集約された子エンティティと値をインスタンス化されたオブジェクトとして受け入れる必要がありますか、それともプリミティブ型のみを受け入れる必要がありますか?

たとえば、Processor オブジェクトと Memory オブジェクトで構成されるエンティティ Computer がある場合、ファクトリ メソッドは次の形式を取る必要があります。

public Computer NewComputer(
    string computerName, 
    int processorCores, 
    int processorClockSpeed, 
    string memoryType, 
    int memoryRam) 
{
    ...
}

また

public Computer NewComputer(
    string computerName, 
    Processor processor, 
    Memory memory) 
{
    ...
}

それは好みの問題ですか、それとも深刻な考慮事項はありますか?

4

3 に答える 3

2

それは好みの問題ですが、オブジェクト作成戦略に依存する可能性があり、さらにそれらを組み合わせて一致させることもできます。

集約ルートに子オブジェクトのファクトリ メソッドが既に存在する場合 (たとえば、CreateProcessor()プロセッサの追加をサポートするために既に存在する場合)、最初のアプローチが適切な場合があります。

あるいは、ComputerFactory(またはリポジトリ) を使用して集約ルートを作成または再構成している場合、そのファクトリは子オブジェクトの作成方法を既に知っている可能性があります。その場合、集約のグラフと 2 番目のアプローチを構築する途中でそれらを作成します。適切になります。

于 2009-10-06T14:49:13.370 に答える
1

ファクトリメソッドを使用する利点について(私は集計とルートのルールにあまり精通していません):

  • プロセッサとメモリは、コンピュータクラスから分離したい特定の動作を持つオブジェクトだと思います。
  • コンピュータークラスのコンストラクターは

    public Computer(string computerName, IProcessor processor, IMemory memory) 
    {
    }
    

コンピュータクラスは、プロセッサとメモリの特定の実装に依存しなくなりました。他のクラスは、特定のメモリとプロセッサを搭載したコンピュータを使用する責任があります。

このアプローチを使用すると、より保守しやすいコードを使用でき、コンピューターを変更せずにメモリとプロセッサをアップグレードできるという利点があります。

これがあなたの特定のシナリオであなたの質問に答えるかどうかはわかりませんが、これが役立つことを願っています。その他のリソースは次のとおりです。

  1. http://www.objectmentor.com/resources/articles/inheritanceVsDelegation.pdf
  2. SOLID ebook:http ://www.lostechies.com/content/pablo_ebook.aspx
于 2009-10-06T17:59:27.767 に答える
1

「集約ルート」は、オブジェクト グラフの最上位ノードです。他のすべてのオブジェクトは、このルート オブジェクトを介して作成およびアクセスされます。つまり、Computer クラスのコンポーネントを外部ファクトリ メソッドで作成すると、それを「集約ルート」と呼ぶことはできなくなります。これは、2番目の例が何らかの形で悪い、臭いなどであると言っているのではなく、「集約ルート」の概念を満たしていないだけです...

于 2009-10-06T15:01:22.520 に答える