假设我有一个带有 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/