我试图了解如何正确使用被动视图。在我看来,我在被动视图上看到的每个示例都违反了得墨忒耳法则:
//In the presenter code
myview.mytextfield.text = "whatever";
那么被动视图的更好实现是什么?
我试图了解如何正确使用被动视图。在我看来,我在被动视图上看到的每个示例都违反了得墨忒耳法则:
//In the presenter code
myview.mytextfield.text = "whatever";
那么被动视图的更好实现是什么?
首先,得墨忒耳定律,就像大多数编程规则一样,更像是一个原则或指导方针,并且在某些情况下该原则不适用。话虽如此,得墨忒耳法则并不真正适用于被动视图,因为在这种情况下,法律的原因不是问题。
得墨忒耳法则试图阻止依赖链,例如:
objectA.objectB.objectC.DoSomething();
显然,如果 objectB 的实现更改为使用 objectD,那么它将破坏 objectA 的依赖关系并导致编译错误。如果采取极端措施,只要链条因实施更改而受到干扰,您最终都会进行霰弹枪手术。
在被动视图的情况下
所以你给出的例子通常会被实现:
//from presenter
view.MeaningfulName = "data";
虽然视图类似于:
//from view
public string MeaninfulName
{
get
{
return someControl.text;
}
set
{
someControl.text = value;
}
希望这能澄清一些事情。
好的,好的,是的,这确实违反了得墨忒耳定律,它基本上说对象的接口不应该揭示对象的实现。但是,第二个也为实现提供了很多提示。
我想是时候问问你是否有正确的界面了。这些文本字段是什么?谁在视图中设置它们?视图不应该向模型询问数据,反之亦然吗?
也许你需要观察者模式——模型保存了一个感兴趣方的列表,并在其内部状态发生变化时通知他们。
啊,那个被动视图。好久没看那个了。基本上,我看到了两部分:其中之一是通过让控制器(而不是模型)驱动所有更新,为了(我假设)效率,他公开了特定的字段方法来更新这些字段。这确实违反了得墨忒耳定律,毕竟它只是某种隐喻意义上的“定律”,就像墨菲定律一样。不过,这通常是个好主意。在这种情况下,我将重做 View 并将其用作外观来包装对单个字段的更新。
不过,您不需要观察者模式,因为现在您已经让控制器进行所有更新。它为整个代码增加了一些复杂性和易错性,因为现在您必须编写控制器来进行并行更新。
更好的实现是在 Presenter 和 View 之间有一个 API。Presenter 将通过一个方法(在 View 的接口中定义)将数据推送到它的 View。视图会根据一些内部逻辑来管理新的输入。
因此,Presenter 不必对 View 有任何了解,Demeter 法则是安全的。