依赖关系图的设计模式

Design pattern for dependency graph

本文关键字:设计模式 关系 依赖      更新时间:2023-10-16

我有一个程序,其中包含许多变量A,B,C...,它们具有依赖关系。例如,C 的值取决于 A 和 B 的值。每当变量的值发生变化时,我都需要更新其所有下游变量。例如,如果 A 的值发生变化,我将需要重新计算 C 的值。如果 C 的值也发生了变化,我将需要重新计算依赖于 C 的那些变量的值。现在我有这样的代码:

A a;
B b;
C c;
// ...
void updateC()
{
    C newC = calculateC(a, b);
    if (c != newC)
    {
        c = newC;
        updateD();
        updateE();
    }
}

随着变量数量的增加,此代码太难维护。还有一些复杂的逻辑,例如,如果 updateD 成功,则无需调用 updateE。是否有针对此类问题的标准设计模式或库?

本质上,

您需要分离对象 A、B、C... 这可以使用中间人模式来实现,即调解器模式:

https://en.m.wikipedia.org/wiki/Mediator_pattern

使用事件总线模式:

http://wiki.c2.com/?DataBusPattern

使用发布-订阅模式:

https://en.m.wikipedia.org/wiki/Publish-subscribe_pattern

观察者模式:

https://en.m.wikipedia.org/wiki/Observer_pattern

更一般的是响应式编程:

https://en.m.wikipedia.org/wiki/Reactive_programming

计算矩阵 m 中图的传递闭包。现在 m(i,j((或 m(j,j((会告诉你事物 i 是否依赖于事物 j。将此(或转置(乘以更改内容的向量(与 j 更改的位置和其他地方的零(将得到您需要更新的内容的向量。

此外,您必须生成严格的偏序并按此排序。