你将如何设计一个“状态/管理”来做到这一点

时间:2009-09-14 15:49:33

标签: .net algorithm

我有一个可以为空的整数列表,它看起来像一对多的关系

 id1 can have an id2 and id3
 id2 can have id4

如果id1的值发生变化,则id2和id3必须设置为null,并且表示id4必须设置为null

在该示例中,我只使用4个变量,以便于管理。

我现在至少要管理15个变量。

我现在想要这样做的方法是在“set”属性中检查值是否改变,如果是这种情况,则将子值设置为null。如果关系发生变化并且是维护的噩梦,这将成为一场噩梦。

有没有比我刚才说的更简单/更好的方式?

2 个答案:

答案 0 :(得分:1)

您可以考虑使用INotifyPropertyChanged并在值更改时添加处理程序。这样,您可以将所有逻辑放在一个位置。

答案 1 :(得分:0)

这就是我认为你现在所拥有的:

public class Ids
{
    public int? Id1
    {
        get { return _id1; }
        set
        {
            if (_id1 != value)
            {
                _id1 = value;
                Id2 = null;
                Id3 = null;
            }
        }
    }

    public int? Id2
    {
        get { return _id2; }
        set
        {
            if (_id2 != value)
            {
                _id2 = value;
                Id4 = null;
            }
        }
    }

    public int? Id3 { get; set; }
    public int? Id4 { get; set; }

    private int? _id1;
    private int? _id2;
}

这是一个替代方案:

public class Id
{
    public Id(int? value)
    {
        _value = value;
    }

    public void AddChild(Id child)
    {
        _children.Add(child);
    }

    public IEnumerable<Id> Children
    {
        get { return _children; }
    }

    public int? Value
    {
        get { return _value; }
        set
        {
            if (_value != value)
            {
                _value = value;

                foreach (Id id in Children)
                {
                    id.Value = null;
                }
            }
        }
    }

    public override string ToString()
    {
        return Value.ToString();
    }

    private readonly List<Id> _children = new List<Id>();
    private int? _value;
}

使用如下:

var id1 = new Id(1);
var id2 = new Id(2);
var id3 = new Id(3);
var id4 = new Id(4);

id1.AddChild(id2);
id1.AddChild(id3);

id2.AddChild(id4);

请注意,您可以将这些添加到通用列表&lt; Id&gt;。

我只对此进行了基本测试,并且有许多替代方案(以及为更容易初始化提供语法糖的方法)。也许其他人会提出更好的设计;希望这能准确地描述你的问题。

编辑:这是试图回答问题的问题;但是,它有助于为您要解决的问题提供更多背景信息。例如,可以为空的ID代表什么,为什么一个ID是另一个ID的子代码?是否涉及数据库?

相关问题