代码之家  ›  专栏  ›  技术社区  ›  Fredou

你将如何设计一个“状态/管理”来实现这一点?

  •  0
  • Fredou  · 技术社区  · 15 年前

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

     id1 can have an id2 and id3
     id2 can have id4
    

    如果id1的值发生变化,id2和id3必须设置为空,这意味着id4必须设置为空。

    在那个例子中,我只使用4个变量,这样便于管理。

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

    我现在想做的方法是在“set”属性中检查值是否更改,如果是这样,则将子值设置为空。如果关系发生变化,这将是一场噩梦,而维护工作则是一场噩梦。

    有没有比我刚才说的更容易/更好的方法?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Brian Genisio    15 年前

    您可以考虑使用inotifyPropertyChanged,并在值更改时添加处理程序。这样,你就可以把所有的逻辑放在一个地方。

        2
  •  0
  •   TrueWill    15 年前

    我想你现在有:

    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);
    

    请注意,您可以将这些添加到常规列表中<id>。

    我只做了一些基本的测试, 许多的 备选方案(以及为更简单的初始化提供语法糖分的方法)。也许其他人会建议更好的设计;希望这能准确地描述您的问题。

    编辑:这是按要求回答问题的一种尝试;但是,在您试图解决的问题上有更多的上下文会有所帮助。例如,可以为空的ID代表什么,为什么一个ID是另一个ID的子ID?是否涉及数据库?