假设我有一个带有 Person 属性的模型类 name

我还有一个相应的 PersonView,其中包含一个 NameView 作为其 subview 之一。
PersonView 还保存了一个人(它的模型)的引用,而 NameView 保存了一个对名字(它的模型)的引用。

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

self.person.name

或者
self.nameView.name

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

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

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

最佳答案

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

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

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

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

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

关于design-patterns - 不要用通勤属性重复自己,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11287193/

10-08 23:03