不要用通勤属性重复自己

时间:2012-07-02 02:22:09

标签: design-patterns data-structures dry

假设我的模型类Person具有name属性。

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

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

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

self.person.name

self.nameView.name

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

上面的例子比实际上往往更简单。例如,该人可能是Family对象的一部分,而FamilyView对象又由FamilyView对象引用。现在有三条不同的路径,从{{1}}到特定人的名字。随着树的增长,它只会变得更糟。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

至于是否使用self.person.nameself.nameView.name,这取决于您是尝试修改模型状态还是查看状态。如果您尝试更改模型,则只需更改self.person.name即可。视图应该以某种方式观察模型以进行更改,并且应该能够相应地更新自身。如果您想更新GUI而不关心模型,请使用self.nameView.name