关于MVP模式的思考

您好,亲爱的读者们,欢迎我对MVP(模型-视图-演示器)模式的想法,我终于开始学习了。 我之前曾尝试过,但是每个人总是如此抽象地解释它,即使与MVVM抽象地比较,我也不知道它是什么。 但是我最近看到了这种模式在一些现场编码的情节中得到了实现,我并没有太多分享。 我将重点介绍典型的实现中的一种迷你反模式,我想为其提供其他想法。

关于MVP的一般思考

首先,我将给您我对MVP的总体看法。 我首先想到的是:“这真的和MVC有什么不同吗?” 确实,MVP几乎就是我一直认为的MVC。 我认为问题不是MVC,而是许多人开始认为MVC 是什么 。 听到Bob叔叔对MVC所说的话,很明显,社区对MVC的理解发生了严重的“演变”,但是我在大学里受过教育的MVC与MVP几乎完全相同,所有差异都可以忽略不计。与我对MVC的理解与其他许多人的理解之间的差异相比。

除了所有这些,我总体上还是很喜欢MVP。 正确完成后,它将遵循Clean Architecture 。 不幸的是,许多人对域模型(或“清洁体系结构”中的“实体”) 理解与我遵循的观点背道而驰,这类似于域驱动设计的理解,我相信Bob叔叔(清洁体系结构的创建者)也倾向于。 话虽如此,我可以让其他人按自己喜欢的方式做这件事,因为关于它的想法太多了。 确实,该模式很好,除了我今天关注的一个反模式。

MVP中的循环引用

据我了解,每个人都使用循环引用来实现MVP。 我能理解为什么,这是实现模式的最简单,最明显的方法。 几乎无论您在什么系统上开发,视图都将成为接收事件的系统,并且要使事件(或从事件派生的命令)到达演示者,视图必须具有对演示者的引用。 这就是应有的一切。 问题来自于这样一个事实,那就是Presenter在处理模型后,将被期望将命令返回给视图。 通常,这是通过对存储在Presenter上的View对象的简单方法调用来完成的。 繁荣! 循环参考。 视图包含对Presenter的引用,该引用也包含对View的引用。

我们如何解决这个问题?

解决循环引用的最明显方法是将View传入作为Presenter方法的参数。 这很简单,直接,而且有点繁琐(要输入很多“ this”),但是如果您想避免使用循环引用,那肯定是一种方法。

另一种方法是返回某种命令对象。 这是一种老式的OO,可能需要进行大量类型检查和转换才能确定返回哪种命令并获取执行该命令所需的数据。 我不会推荐这个。

我见过有人使用的一种“解决方案”是使对View的引用成为弱引用(垃圾收集器不计算该引用)。 尽管这可以避免循环引用不好的最大原因,但实际上并没有摆脱循环。 如果您不太在乎循环引用,我仍然至少建议您这样做,如果您在Android中执行MVP,则建议您查看GitHub上android-arch-sample存储库 ,因为它显示了有人可以使用弱引用以及其他一些脚手架来制作它,以便在进行配置更改(例如旋转屏幕)时,Presenter替换其View对象,因为配置更改会导致Activity(其作为View的两倍)被破坏,并且重建。 它也是我见过的有状态Singleton的最大用处。 我敢肯定,有一种方法可以使它成为Singleton,但是我实际上并不想解决它,它是如此的聪明。

那么,我认为避免循环引用的最佳解决方案是什么? Lambdas。 它与命令解决方案类似,但是您无需返回命令,而是通过lambda或方法引用返回了一个匿名函数,然后View将调用该方法并将其作为参数传递给匿名函数。 它具有更多的功能,而不仅仅是因为它使用了高阶函数。 而是,它更具功能性,因为Presenter方法现在有一些返回值。 它们可以是纯净的(尽管它们不太可能是因为模型很可能将访问某种可变数据存储),因为它们没有在View上调用“ void”方法。 它使不纯函数在最外层View上被调用,这是理想的。

什么才是我

现在,我已经说过lambda是最好的解决方案,但实际上我并不相信。 从理论上讲,这是最好的,因为演示从来没有任何视图参考,但它实际上是?

  1. 它依靠View来调用返回的函数,该函数完全可以忽略正在执行的操作,而容易忘记执行该操作。
  2. 即使使用Lambda,也无法使Presenter保持纯净,因为它访问了Model,而Model可能使用可变数据存储。
  3. 您真正要做的就是移动您将要进行的相同调用,但它们不在lambda或方法引用中。

在我提出一个更好的主意或其他理由之前,我的实际建议是将视图作为参数传递。 也就是说,除非您使用Android(这是我所知道的唯一会破坏并完全重建其Activity的系统-或等效的系统),否则我建议您遵循android-arch-sample存储库中的模式。

直到下一次,谢谢您的阅读。

翻译自: https://www.javacodegeeks.com/2017/06/thoughts-mvp-pattern.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值