0

私はこれを実装するための最良の方法を探しています。兄弟や子供と関係のあるオブジェクトを考えると、本質的には適合するパターンです。

各オブジェクトの状態を設定する一連の複雑なルールがあります

例えば

  • 「タイプ」Aのn個の兄弟オブジェクトの場合、それぞれの状態はxです。
  • n個の兄弟オブジェクト「タイプ」Aおよび「タイプ」Bの場合、それぞれの状態はyです。

これにはおそらく3つか4つのバリエーションがあります

各兄弟オブジェクトでは、その子オブジェクトの構成によって「タイプ」が決定されます。

これが十分に明確であることを願っています。さらに説明を追加できると思われる場合はコメントしてください。

編集:

いくつかの疑似コードを追加しました

状態はFooオブジェクト(FooBarまたはBarではない)と一緒に永続化され、状態はユーザー主導のイベントで更新されます(ユーザーはFoosとBarの組み合わせを修正して、イベントを生成し、状態を再設定できますそしてデータベースに固執する)

お役に立てれば

void Main()
{


    var foobar = GrabAFooBar();
    //Each Foo will have its state set based on the rules in the question
    //eg
    //foobar has 2 Foos both of which only contain BarType1 then both foos have a State of StateOne
    //foobar has 2 foos, one has a BarType1 one has a BarType2 both foos have a State of StateTwo
    //foobar has 2 foos, one has a BarType1 and BarType3 one has a BarType2 both foos have a State of StateThree
    //effectivaly there are 5 States (currently) and a  well defined set of combinations
    //All foos will have the same state at the end of the process (there will never be a mix)

}

FooBar GrabAFooBar()
{
    //return a FooBar from data
}

// Define other methods and classes here

    class FooBar
    {
        List<Foo> Foos {get;set;}

    }
    class Foo
    {
        public List<Bar> Item {get;set;}
        public State state {get;set;}
    }
    abstract class Bar
    {

    }

    class BarType1 : Bar
    {
    }


    class BarType2 : Bar
    {
    }


    class BarType3 : Bar
    {
    }

    enum State
    {
        StateOne,
        StateTwo,
        StateThree
    }
4

3 に答える 3

2

責任の連鎖は、ここで考えられる 1 つのパターンのように思えます。

チェーンの各ハンドラーは、オブジェクトを「照合」し、状態を返すか、オブジェクトをチェーン内の次のハンドラーに渡す責任があります。チェーン内のハンドラーを順序付けて、2 つ以上のハンドラーがオブジェクトを受け入れる場合でも、チェーンの順序によって優先順位が決定されるようにすることができます。

于 2012-04-05T15:51:35.620 に答える
0

のような答えを聞きたくない限り、これにはパターンはないと思いますObject Oriented Programming

たとえば、次のような多くのオプションがあります。

  1. 状態を計算してプロパティに保存するメソッド/関数を呼び出して、オンデマンドStateで状態を計算します) 。

  2. 呼び出されるたびに状態を計算するプロパティStateゲッターを作成します。

  3. CollectionChanged ハンドラーを兄弟コレクションにアタッチし、コレクションの変更後に状態を自動的に更新する

これらのどちらを選択するかは、依存関係が変更される頻度、状態を確認する必要がある頻度、および計算のコストによって異なります。

ルールがあまり変わらない場合は、ハードコーディングできます。ただし、それらが変更された場合は、Biztalkなどのルール エンジンの使用を検討する必要があります。

于 2012-04-05T16:02:02.117 に答える
0

列挙型を、ロジックを管理する実際のクラスに置き換えることをお勧めします。

public abstract class State {
    public bool AppliesTo( Foo foo );
}

public class StateOne : State {
    public override bool AppliesTo( Foo foo ){
        return foo.Item.All(x => x is Bar1);
    }
}
//etc.

「x is Bar1」の部分は良くないので、ダブルディスパッチを使用できます。

于 2012-04-05T15:58:51.087 に答える