关于设计模式:松散耦合演示者在MVP中查看

Loose Coupling Presenter to View in MVP

我们在Java商店中工作,我们的Web应用程序使用MVP架构模式的实现。我们的经理来自一个.NET世界,在那里他已经接触到了MVVM设计模式。我们的经理提倡在我们的MVP实现中进行更改,包括演示者应该通过观察者设计模式,按照传统的MVVM,与它的视图分离(或松散耦合,取决于您的解释)。我更多的观点是,演讲者和视图共同工作以实现一个共同的目标,因此应该结合起来。

支持这种变化的论点之一是单元测试演示者的能力。如果演示者只将视图视为观察者,那么可以更容易地对它们进行单元测试。但是,与他们的观点紧密结合的演讲者并不一定很难测试。如果视图使用谦逊的视图范式,那么它可以被模仿。最后,可测试性应该是良好设计的一个症状,而不是设计的驱动因素。

我的经理用来支持分层视图和表示者的另一个论点是假定的MVVM成熟度。因此,我们应该遵循MVVM的教义,并适应MVP的实现。如果我错了,请纠正我,但MVVM强制(人为)对视图和表示者进行分层,以便在控件中方便其数据绑定。

你能帮我们看看这里的灯吗?为什么我们要使用一个分离的模型并为此付出代价呢?我没有看到好处。奥卡姆的Razor说,我需要参数来使用去耦,而测试似乎不是其中之一。

澄清:我在这个问题上真正寻找的是那些能够使平衡点偏向于一个不了解其观点并在以太中拍摄事件的演示者的论点,或者偏向于一个通过更直接的耦合了解其观点的演示者的论点,比如一个不起眼的视图接口或直接指向类的观点。请注意,演示者可以通过松耦合和紧耦合轻松地提供多个视图。不同之处在于演示者所说的接口:使用松耦合时,演示者与侦听器类(或事件总线代表)进行对话,而使用紧耦合时,演示者与视图接口进行对话。


更新:

看起来TS并没有询问是否将interface而不是class传递给presenter,但是presenter是否通过另一层(我们称为observable)与view通信。它只是试图反映用于视图管理的WPF中的MVVM模式。如果是这样的话,那么我之前的所有论点都是无效的。

就我个人而言,我认为这种方法是不好的,不会带来很多好处而不是缺点。以下是我想说的要点:

  • Humble view已经足够维护了。

    正如TS所述,谦虚的观点已经足以创建可测试的类和模块化,足以将关注点/责任分离。你可以看到我的回答的修改,说谦虚的观点已经可以维护了。

  • 它增加了复杂性和学习曲线

    除非您的方法得到内置分布式库(如WPF)的支持,否则您将注定要学习这种方法。这是不常见的,新开发人员会发现很难学习您的设计。

  • 它降低了代码的可发现性

    我对WPF的经验是,如果在文件夹结构上没有适当的协议,您将很难发现演示者(因为它是指可观察的)。WPF有一些关于文件夹结构(称为约定)的指导方针,因此理解WPF的新开发人员将理解它。

  • 更难调试

    如果绑定(监听点)声明错误,您将很难找到错误。大多数时候,这个错误给了你错误的例外。即使在WPF中,新用户也很难调试。

  • 更难确保财产更新,无限周期风险更大

    在开发WPF的过程中,我发现很难确保视图和演示者(ViewModel)之间的属性更新。MVVM设计听取诸如淘汰和WPF等变化,具有更高的无限循环发生的风险(Prop A中的变化更新Prop B,更新Prop A等)。

  • 您已通过编译器验证

    我不喜欢使用WPFMVVM,因为编译器无法帮助验证您的绑定。这意味着null referencedata type error只能在运行时级别处理。

  • 它不能实现到Web应用程序。

    可观察层在事件驱动的应用程序(如桌面应用程序甚至移动应用程序)中可能很有用。然而,在基于Request -> Response结构的Web应用程序中,它只是一个无用的抽象层。我还发现了任何可以在Web和应用程序体系结构中使用的演示者逻辑。如果它无论如何都会被复制,为什么不让它更简单呢?此外,Humble view方法在Web体系结构中也可以使用(不完全,但可以)。

  • 你无论如何都需要BLL

    无论您构建什么体系结构,您仍然只处理PL级别的代码。您仍然需要在另一层中使用BLL,以确保业务逻辑可以被重用,不管UI是什么(web/desktop)。

  • 好处只是另一层分离

    我不知道你想用Java做什么。但是,在WPF中,我发现修改视图更容易、更安全(就不破坏视图模型/演示者而言)。

  • 总结:

    MVP使用observable时,您违反了KISS/YAGNI。如果不使用分布式库,也会违反Reinvent the Wheel。唯一的好处是支持DRY(用于管理数据绑定),但是由于它不能用于Web结构,因此它的好处是不值得的。


    您和/或您的经理可能会混淆依赖方向和耦合紧密性。

    MVVM和(被动视图)MVP的本质区别在于前者,由于绑定和命令,视图模型基本上不了解视图。依赖关系从一个视图转到另一个视图模型。在被动视图MVP中,它采用了另一种方式——演示者指向视图,填充视图数据并监听其事件。

    不过,它不需要是紧密耦合的——您可以将演示者与一个视图的抽象结合起来,这个视图可以在测试上下文中通过模拟来体现。这是松耦合。

    也就是说,我同意您的观点,即两种模式(MVVM和被动/谦虚视图)大致都是可测试的。另外,MVVM在.NET环境中基本上是有效的,您可以利用绑定和命令,这使得特定模式在Java生态系统中是一个奇怪的调用。Java世界中可能存在类似的方法,但它们不被称为MVVM。