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

如何实现更新对象的依赖树?

  •  0
  • Matt  · 技术社区  · 5 年前

    编辑

    我正在努力生成依赖树,其中子节点由外部进程更新,并且要求更新更新子节点的所有父节点。

    例如:想象这样一棵树:O[父项]、O(l)[左子项]、O(r)[右子项]、O(ll)、O(lr)、O(rl)和O(rr)。O(ll)、O(lr)、O(rl)和O(rr)引用以随机间隔更新的数据集合。

    这里的复杂性是每个子节点在不同的树之间共享,这意味着一棵树的子节点也可以是另一棵树的任何子节点。此结构的目的是避免子节点已经是最新的时重新计算。如果不同的树实现的子节点具有与现有子节点完全相同的功能(函数和参数化),则子节点是共享的。

    我被这个结构的设计和如何去实现它所困扰。我还没有提供代码,因为我被困在设计思想的过程中。本质上,每个子函数都是函数,依赖于依赖函数本身。

    1 回复  |  直到 5 年前
        1
  •  1
  •   John Wu    5 年前

    我建议定义一个类,该类跟踪其子类是否通过一个标志(例如名为 Dirty . 树中的节点可以通过引发事件来告诉其父节点变脏。当一个节点返回它自己的值时,它应该检查标志并仅在需要时重新计算它自己的值。在重新计算时,它应该检查每个子级的值,然后每个子级递归地检查自己的脏标志,依此类推。

    class Node<T> 
    {
        event EventHandler Changed;
    
        private T _value;
        private bool _dirty = true;
        private List<Node<T>> _children = new List<Node<T>>();
    
        public void AddChild(Node<T> child)
        {
            child.Changed += (s,e) => _dirty = true;
            _children.Add(child);
        }
    
        protected void OnChanged()
        {
            if (Changed != null) Changed(this, new EventArgs());
        }
    
        public T Value
        {
            get
            {
                if (_dirty)
                {
                    this.Value = ComputeValueFromChildren();
                    _dirty = false;
                }
                return _value;
            }
            set
            {
                _value = value;
                OnChanged();
            }
        }
    
        private T ComputeValueFromChildren()
        {
            var values = _children.Select( child => child.Value );
            //Return the new value based on the children
        }
    }