【问题标题】:Don't Repeat Yourself with commuting properties不要重复自己的通勤属性
【发布时间】:2012-07-02 02:22:09
【问题描述】:

假设我有一个模型类 Personname 属性。

我也有一个对应的PersonView,其中包含一个NameView 作为其子视图之一。

PersonView 还保留对人(其模型)的引用,NameView 保留对名称(其模型)的引用。

如果我在PersonView 中,我现在有两种方法可以获取名称:要么

self.person.name

self.nameView.name

所有的引用都是自然的。然而,这似乎违反了 DRY。上述路径应该产生相同的名称。但如果某些事情不同步,他们可能不会。

上面的例子比这些事情在实践中要简单得多。例如,该人可能是Family 对象的一部分,而该对象又被FamilyView 对象引用。现在有从FamilyView 到给定人名的三种不同路径。随着树的生长,它只会变得更糟。

处理这种情况的最佳方法是什么?

【问题讨论】:

    标签: design-patterns data-structures dry


    【解决方案1】:

    我认为,在这种情况下,您必须在违反 DRY 或放弃松散耦合之间做出选择。我认为你不能同时避免两者。

    如果NameView 不包含它自己的数据副本,那么它需要一个指向数据的指针。现在您已经拧紧了耦合,因为NameView 不能单独使用。

    另一方面,如果NameView 保留了模型数据的副本,那么您就违反了 DRY,您最终可能会遇到同步问题。许多 GUI 框架都有一个“绑定”概念,可以使模型和视图之间的值保持同步。

    就个人而言,我会选择松耦合加绑定。如果您使用的绑定很好,您不应该有任何同步问题。绑定在许多不同语言和框架中的广泛使用表明这是一种不错的方法。

    至于是使用self.person.name还是self.nameView.name,这取决于你是想修改模型状态,还是视图状态。如果您要更改模型,则只需更改self.person.name。视图应该以某种方式观察模型的变化,并且应该能够相应地更新自己。如果您想更新 GUI 而您不关心模型,请使用self.nameView.name

    【讨论】:

    • 它总是一个指针。唉,iOS 没有绑定;它确实有键值观察,这有点接近。
    • 我主要是 Cocoa 开发人员,所以我可能会犯这个错误,但我认为 iOS 中的想法是在控制器中手动进行同步。如果你真的想要绑定,那么在 KVC 和 KVO 之上实现它们是相当简单的。如果你谷歌一下,我相信你会找到已经实现它的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-09-04
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多