Model-View-Presenter和Android应用程序设计

11
问题:Activity类庞大且复杂,阅读/理解和修改困难。测试也很困难。
可能的解决方案:使用模型-视图-控制器(MVP)(可能需要依赖注入)。同时使用Mock测试对象!
我计划在我的Android应用程序中实现MVP。基本上这是一种模型-视图-控制器的变体。实质上,将Activity作为一个拟人化的布局管理器,并将任何业务逻辑推迟到Presenter中。从另一个角度来看,Presenter就像是在Activity中实例化的Helper类,用于执行繁重的工作,Activity提供一个Presenter可以使用的接口/回调。
我想听听社区的想法。例如: 这意味着什么样的接口? Model和View与Presenter之间的责任是什么?
对于Presenter,我想Activity会实现Presenter所需的接口?哪些东西应该放入Presenter或Activity?
Presenter是否应该与Activity一对一?一个Activity中有多个显示不同小部件的片段怎么办?现在我们需要多个presenters还是仍然只有一个?
Presenter和Adapter有什么区别?Presenter应该如何与具有ListView和ListViewAdapter的Activity相关联?Presenter和Adapter各自负责什么?Presenter是否应该选择要使用的Adapter?还是Activity做出这个决定?Presenter处理Model数据还是Adapter?Adapter和Presenter之间有冲突吗?适配器是Presenter还是其他东西?通常,适配器只用于Activity中的小部件,如ListViews。我认为它们不会调用获取数据本身的那些方法。
因此,在模型-视图-Presenter中,关键是要决定将哪些内容放入Presenter中,而不是其他类,并且应该在Presenter、Activity、Adapter和视图(包括片段)之间进行通信。
MVP对于Android来说是一个非常糟糕的想法,还是与Android框架非常契合?

请记住,除了Android之外,还有许多成熟的SDK需要像MVP这样的微架构。实际上,这种例子很多:例如,Flex是Flash的一个非常成熟的SDK,但几乎任何重要的应用程序仍需要MVP和MVC框架。

EJB需要Spring来简化和组织它。MFC/Struts等等,列表还很长。为什么Android应该与众不同?为什么我们应该认为在没有像MVP这样的设计模式的情况下,SDK已经拥有了Android所需的一切呢?

在我花费数百个小时之前知道这些信息很好,请随意评论/回答此问题的任何部分。


1
有什么看法?点赞?踩?评论?回答?....... - Code Droid
1
请参考以下链接:http://programmers.stackexchange.com/questions/133134/is-model-view-presenter-mvp-scheme-useful-for-android - nawfal
2个回答

3
Android惩罚不良的MV(P|C)设计比我遇到过的任何平台都更加严格。忘记它提供的笨拙方法来在活动堆栈中传递状态。尽可能多地将状态和逻辑从活动中移出。根据需要将其移入服务,内容提供程序和SharedPreferences中。尝试使您的活动成为纯视图。在我看来,Android教程从未充分关注服务。即使是O'Reilly的《Programming Android》书籍也只给了它们四分之一页!
小心扩展应用程序。如果您曾经在自己的进程中启动服务(例如,使其能够在活动崩溃时优雅地关闭),则该服务将具有自己的应用程序副本。

2

为了给其他可能感兴趣的人提供参考,我几年前也有同样的想法。当我们将MVC/MVVM/Presentation Model应用于Android应用时,我们真正希望的是拥有一个清晰结构化的项目以及更易于单元测试。目前,如果没有第三方框架,您通常会有很多代码(例如addXXListener(),findViewById()等),这些代码并不增加任何业务价值。而且,你必须运行Android单元测试而不是普通的JUnit测试,这需要运行很长时间,使得单元测试变得有些不切实际。出于这些原因,几年前我们启动了一个开源项目RoboBinding——一个针对Android平台的数据绑定Presentation Model框架。 RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。 RoboBinding消除了像addXXListener这样的不必要的代码,并将UI逻辑转移到Presentation Model中,这是一个pojo,可以通过普通JUnit测试进行测试。 RoboBinding本身带有300多个JUnit测试,以确保其质量。其他替代方案:Android-Binding、Bindroid和MvvmCross。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接