4

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

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

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

如果我在里面PersonView,我现在有两种方法可以得到这个名字:要么

self.person.name

或者

self.nameView.name

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2012-07-02T06:23:07.423 回答