0

我正在寻找实现这一点的最佳方法,本质上是一种适合的模式,给定一个与兄弟姐妹和孩子有关系的对象。

我们有一套复杂的规则来设置每个对象的状态

例如

  • n个“类型”A的兄弟对象,那么每个对象的状态都是x
  • n 个兄弟对象“type”A 和“type”B 然后每个的状态是 y

这可能还有 3 或 4 个变体

对于每个兄弟对象,其子对象的组成将确定它的“类型”

希望这足够清楚,如果您认为我可以添加更多说明,请发表评论?

编辑:

添加了一些伪代码

状态将与 Foo 对象(而不是 FooBar 或 Bar)一起保留,并且状态在用户驱动的事件上更新(用户可以修改 Foos 和 Bars 的组合,然后生成事件以重新调查,设置状态并持久化到数据库)

希望这可以帮助

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

责任链在这里听起来像是一种可能的模式。

链中的每个处理程序都将负责“匹配”您的对象并返回状态或将对象传递给链中的下一个处理程序。您可以对链中的处理程序进行排序,以便即使两个或更多处理程序接受对象,链的顺序也会决定您的优先级。

于 2012-04-05T15:51:35.620 回答
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 回答
0

我不认为有这样的模式,除非你想听到类似的答案Object Oriented Programming

你有很多选择,例如:

  1. 通过调用将计算状态并将其保存在属性中的方法/函数来按需计算State状态)

  2. 创建一个属性getter,每次调用时State都会计算状态

  3. 将 CollectionChanged 处理程序附加到同级集合并在集合更改后自动更新状态

这些之间的选择将取决于您的依赖项更改的频率、您需要了解状态的频率以及您的计算成本。

如果规则没有太大变化,那么您可以对它们进行硬编码。但如果它们发生变化,您应该考虑使用规则引擎,例如Biztalk

于 2012-04-05T16:02:02.117 回答