【问题标题】:what is the best design pattern for this problem?这个问题的最佳设计模式是什么?
【发布时间】:2011-09-21 07:47:19
【问题描述】:

我有一个有几个属性的类。某些属性可以由其他类更改,但某些属性依赖于其他属性。例如假设我的类有三个属性:A,B和C。A和B可以被系统中的其他类更改,C等于A + B。该类生成属性更改通知所以我想当A或B更改时,为更改的属性(A 或 B)生成一个通知,也为 C 生成一个通知。 我有三个选择(还有其他选择吗?)

1- 创建一个普通的 C 属性(带有支持字段)并在 A 和 B 的 setter 中添加代码以更改 C。

2- 创建一个普通的 C 属性并在我的类中监听我的类的属性更改通知,并在 A 或 B 更改时更改 C。

3- 为 C 创建一个计算属性,没有 setter 但 getter 是 A+B,在 A(和 B)的 setter 中,我为 A(或 B)和 C 触发属性更改。

哪个是更好的设计模式(在 C# 中)?我个人喜欢 2 号设计。

【问题讨论】:

    标签: properties inotifypropertychanged


    【解决方案1】:

    听起来像观察者模式在这里可能很有用。参见例如http://www.oodesign.com/observer-pattern.html。虽然搜索观察者模式会产生许多结果和其他示例,其中一些更简单且特定于语言。

    【讨论】:

    • 观察者模式很好,在这种情况下观察者和可观察者是同一个类。使用这种模式等同于设计 2,当类监听自己的属性更改通知并因此观察自己的更改时。
    【解决方案2】:

    我可能会选择 2 和 3 的变体。

    您可以为 C 计算一个属性(仅限 getter),以便 C = A + B 计算只在一个地方。

    然后,根据您的选项 2,您可以在同一类中侦听属性更改事件...但是当您检测到 A 和 B 的 PropertyChanged 事件时,您不需要更新 C,您只需要为 A 和 B 引发 PropertyChanged 事件那时的 C。

    【讨论】:

    • 您提到要在一个地方进行 C 计算这一事实非常好。我认为我们可以通过编写代码以使 C=A+B 在单独的方法中并在检测到 A 或 B 发生更改时调用的方式单独在 2 中实现这一点。
    • 是的,这是真的,我在这些选项之间没有太多区别。 2 非常小的风险可能是,如果某些代码更改 A 或 B 的支持字段而不通过属性设置器,则 C 可能不同步,而计算的属性不能不同步。对于这样一个简单的案例,虽然这可能是一个非常低的风险。
    【解决方案3】:

    2 是最纯粹的,因为它将 A、B 和 C 分开,但它确实涉及一些开销 qith 属性通知中的字符串解析。

    如果它是一组简单的属性,我会很想用 1,因为它们仍然是相当独立的,但更新要简单得多。 3 是最糟糕的 IMO,因为 A+B 正在复制无论如何都应该分开的代码(C 通知)。

    【讨论】:

      【解决方案4】:

      这里的问题是你试图将事情应该做的方式与微软强迫你做事情的方式混合在一起...... :)

      但除了我的咆哮之外,它认为选项 3 听起来最干净。当然不是 1,这是迄今为止最糟糕的,而且我认为订阅您自己的属性更改事件可能会导致一些时髦的问题,当一些糟糕的 sap 将来试图维护代码时,这些问题将难以调试......

      如果你从高层次上考虑,你在 3 中的建议完美地描述了课堂上发生的事情:

      任何时候属性 A 发生变化,类的观察者都应该被通知属性 C 也发生了变化(因为它已经发生了变化)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多