Tow*_*wer 30 theory mvp architectural-patterns
如何在MVP中创建视图?Presenter是否始终创建它们(除了子视图的视图外)?或者它是一个单独的第三方组件或应用程序或创建它们的东西?
我们还要补充一点,我可能会在Dojo Toolkit/ExtJS(即JavaScript)上执行此操作.
所以,我有这些代码行:
var v = new MyApp.view.User();
var p = new MyApp.presenter.User();
Run Code Online (Sandbox Code Playgroud)
这两条线应该在哪里准确?演示者是否实例化视图,反之亦然?什么实例化第一个实例?
Mar*_*ijn 46
这取决于 ...
MVP的主要目标是将复杂的决策逻辑与UI代码分开,使其变得更容易理解和维护.通常另一个目标是使演示者中的决策逻辑可测试.
Fowler在2004年描述了MVP模式,他在2006年通过将模式分为监督控制器(SC)和被动视图(PV)来退休.在SC中,View与模型绑定,但在PV中不绑定; 在PV中,View仅由Presenter直接更改.
在SC和PV中,Presenter必须更新视图并对用户对视图所做的更改做出反应,例如输入文本或按下按钮.当您在Presenter上使用View调用方法时,会出现您描述的问题,因为View需要对Presenter的引用,反之亦然.如果你这样做,你只需要决定谁开始它.选项包括:
所有选项都可以让您实现关注点分离和决策逻辑可测性提高的"MVP目标".我不认为这些方法中的任何一种在理论上是正确的或错误的 - 您只需选择最适合您使用的技术的方法.并且最好在整个应用程序中保持一致.
这些是你的选择:
var cvp = new ContactViewPresenter(new ContactView());
Run Code Online (Sandbox Code Playgroud)
ContactViewPresenter构造函数集this.view = viewParam和集this.view.presenter = this.它将代码保留在Presenter中,它可以在必要时交换视图,并且可以通过模拟视图进行测试.
var cv = new ContactView(new ContactViewPresenter());
Run Code Online (Sandbox Code Playgroud)
ContactView构造函数集this.presenter = cvpParam,和this.presenter.view = this.View中的一些逻辑,但不是很多.如有必要,可以换出演示者.
ContactView cv = new ContactView();
ContactViewPresenter cvp = new ContactViewPresenter();
cv.presenter = cvp;
cvp.view = cv;
cv.init();
cvp.init();
Run Code Online (Sandbox Code Playgroud)
这是更多的代码.
ContactViewPresenter cvp = new ContactViewPresenter();
Run Code Online (Sandbox Code Playgroud)
构造函数创建集this.view = new ContactView()和this.view.presenter = this.
ContactView cv = new ContactView();
Run Code Online (Sandbox Code Playgroud)
构造函数集this.presenter = new ContactViewPresenter()和this.presenter.view = this
最后两个似乎有点太耦合了.
一个很好的是代码保留在Presenter中,似乎允许更容易的测试.
两个很好,因为你不必过多关心演示者,并且可以更多地担心你的观点.