3

我试图了解如何正确使用被动视图。在我看来,我在被动视图上看到的每个示例都违反了得墨忒耳法则:

//In the presenter code
myview.mytextfield.text = "whatever";

那么被动视图的更好实现是什么?

4

3 回答 3

4

首先,得墨忒耳定律,就像大多数编程规则一样,更像是一个原则或指导方针,并且在某些情况下该原则不适用。话虽如此,得墨忒耳法则并不真正适用于被动视图,因为在这种情况下,法律的原因不是问题。

得墨忒耳法则试图阻止依赖链,例如:

objectA.objectB.objectC.DoSomething();

显然,如果 objectB 的实现更改为使用 objectD,那么它将破坏 objectA 的依赖关系并导致编译错误。如果采取极端措施,只要链条因实施更改而受到干扰,您最终都会进行霰弹枪手术。

被动视图的情况下

  • 演示者依赖于一个接口,因此只要接口保持不变,视图的实现就可以改变。
  • 视图通常将属性公开为通用数据类型,例如系统类型和集合。这允许您在不影响演示者的情况下更改 UI。
  • 对于演示者来说,视图只不过是一个数据结构,一个检索和转储数据的地方。由于视图非常简单,演示者甚至不应该能够进行依赖链。

所以你给出的例子通常会被实现:

//from presenter
view.MeaningfulName = "data";

虽然视图类似于:

//from view
public string MeaninfulName
{
    get
    {
        return someControl.text;
    }
    set
    {
        someControl.text = value;
    }

希望这能澄清一些事情。

于 2009-06-18T20:36:13.303 回答
1

好的,好的,是的,这确实违反了得墨忒耳定律,它基本上说对象的接口不应该揭示对象的实现。但是,第二个也为实现提供了很多提示。

我想是时候问问你是否有正确的界面了。这些文本字段什么?谁在视图中设置它们?视图不应该向模型询问数据,反之亦然吗?

也许你需要观察者模式——模型保存了一个感兴趣方的列表,并在其内部状态发生变化时通知他们。


啊,那个被动视图。好久没看那个了。基本上,我看到了两部分:其中之一是通过让控制器(而不是模型)驱动所有更新,为了(我假设)效率,他公开了特定的字段方法来更新这些字段。这确实违反了得墨忒耳定律,毕竟它只是某种隐喻意义上的“定律”,就像墨菲定律一样。不过,这通常是个好主意。在这种情况下,我将重做 View 并将其用作外观来包装对单个字段的更新。

不过,您不需要观察者模式,因为现在您已经让控制器进行所有更新。它为整个代码增加了一些复杂性和易错性,因为现在您必须编写控制器来进行并行更新。

于 2009-05-26T17:37:01.743 回答
1

更好的实现是在 Presenter 和 View 之间有一个 API。Presenter 将通过一个方法(在 View 的接口中定义)将数据推送到它的 View。视图会根据一些内部逻辑来管理新的输入。

因此,Presenter 不必对 View 有任何了解,Demeter 法则是安全的。

于 2009-05-26T18:57:40.253 回答