2

グラフを表すデータベースに永続化されたドメインモデルがあります。グラフは、ブランチを介して接続されたノード(NodeTypeA、NodeTypeBなど)で構成されます。2つの一般的な要素(ノードとブランチにはプロパティがあります)。グラフが計算エンジンに送信されます。計算を実行するには、エンジンを次のように初期化する必要があります(簡略化された擬似コード)。

Engine Engine = new Engine() ;
Object ID1 = Engine.AddNodeTypeA(TypeA.Property1, TypeA.Property2, …, TypeA.Propertyn);
Object ID2 = Engine.AddNodeTypeB(TypeB.Property1, TypeB.Property2, …, TypeB.Propertyn);
Engine.AddBranch(ID1,ID2);

最後に、計算は次のように実行されます。

Engine.DoSomeComputation();

優れた設計原則を使用して上記を達成するのに役立つ、関連する設計パターンがそこにあるかどうか疑問に思っています。これが理にかなっていることを願っています。フィードバックをいただければ幸いです。

4

1 に答える 1

1

エンジンは、Open/Closed プリンシパルと、おそらく Single Responsibility プリンシパルも壊しているようです。エンジンの目的が何らかの計算を行うことである場合、SRP 違反となるさまざまなノード タイプから ID1 または ID2 を作成する方法を認識すべきではないでしょう。AddNodeTypeA と AddNodeTypeB という名前から、C、D などがあるのではないかと思いました。これは、新しい NodeType では、OCP が壊れているように見えるエンジン クラスを変更する必要があることを意味します。

Adapter パターンは、これらの懸念の両方を解決します。

class Engine
{
    public void AddBranch(Branch branch1, Branch branch2)
    {
        //do something
    }

    public void DoSomeComputation();
    {
        //do something
    }
}

interface BranchAdapter
{
    Branch GetBranch();
}

class NodeTypeABranchAdapter : BranchAdapter
{
    private readonly TypeA _typeA;
    public NodeTypeABranchCreator(TypeA typeA)
    {
        _typeA = typeA;
    }

    public Branch GetBranch()
    {
        //do processing to take _typeA and transform it into Branch
    }
}

class NodeTypeBBranchAdapter : BranchAdapter
{
    private readonly TypeB _typeB;
    public NodeTypeABranchCreator(TypeB typeB)
    {
        _typeB = typeB;
    }

    public Branch GetBranch()
    {
        //do processing to take _typeB and transform it into Branch
    }
}

呼び出しコードは次のように機能します

var engine = new Engine();
Branch id1 = new NodeTypeABranchAdapter(TypeA).GetBranch();
Branch id2 = new NodeTypeBBranchAdapter(TypeB).GetBranch();
engine.AddBranch(id1, id2);
engine.DoSomeComputation();
于 2012-09-19T17:11:38.487 に答える