【问题标题】:Model-View-Presenter and Android Application DesignModel-View-Presenter 和 Android 应用程序设计
【发布时间】:2012-09-05 23:58:17
【问题描述】:

问题:非常大且复杂的 Activity 类。难以阅读/理解和修改。很难测试。

可能的解决方案:Model-View-Presenter(可能使用依赖注入)。 和模拟测试对象!

我计划在我的 Android 应用程序中实现 Model-View-Presenter。 这基本上是模型-视图-控制器的变体。本质上,使 Activity 一个美化的布局管理器,并将任何业务逻辑交给 Presenter。查看 Presenter 的另一种方式是,它就像在 Activity 中实例化的 Helper 类,通过提供 Presenter 可以使用的接口/回调的 Activity 来完成繁重的工作。

我想了解一些社区对此的看法。例如: 这意味着什么接口?
Model 和 View 与 Presenter 相比有什么责任。

对于 Presenter,我想 Activity 会实现 Presenter 所需的接口?
Presenter vs. Activity 应该包含哪些内容?

演示者会与活动一对一吗?如果一个 Activity 有多个显示不同小部件的片段,每个片段都有自己的适配器呢?我们现在需要多个演示者还是仍然只需要一个?

Presenter vs. Adapter 怎么样?

演示者应该如何关联说具有 ListView 和 ListViewAdapter 的 Activity? Presenter 与 Adapter 的区别是什么?
Presenter 应该选择要使用的适配器吗?还是应该由 Activity 做出这个决定? Presenter 应该处理模型数据还是适配器?适配器和演示者之间是否存在冲突?适配器是演示者吗?或更少/更多的东西。通常适配器仅适用于 Activity 中的 ListViews 等小部件。我认为他们不会进行获取数据本身的调用。

所以在 model-view-presenter 中,关键是真正决定 Presenter 与其他类中的内容以及 Presenter 与活动、适配器和视图/包括片段之间的通信应该是什么。

Model-View-Presenter 对 Android 来说真的是个坏主意吗?或者它是否适合 Android 框架?

请记住,在 Android 之外还有许多非常成熟的 SDK 示例仍然需要像 MVP 这样的微架构。事实上例子比比皆是:例如。 Flex 是一个非常成熟的 Flash SDK,但它仍然需要用于几乎所有主要应用程序的 MVP 和 MVC 框架。

EJB 需要 Spring 来简化和组织它。 MFC/Struts 等,不胜枚举。为什么Android应该有所不同?在没有像 MVP 这样的设计模式的情况下,我们为什么要假设 SDK 具备 Android 所需的一切?

很高兴在我花费数百小时之前知道,请随时评论/回答此问题的任何部分。

【问题讨论】:

标签: android design-patterns android-layout


【解决方案1】:

Android 比我遇到的任何平台都更惩罚糟糕的 MV(P|C) 设计。忘记它提供的用于在活动堆栈上下传递状态的笨拙方法。从您的活动中获取尽可能多的状态和逻辑。根据需要将其移动到 Services、ContentProviders 和 SharedPreferences 中。尽量让你的活动成为纯粹的观点。 IMO,服务在 Android 教程中从未得到足够的重视。甚至 O'Reilly Programming Android 一书也只给了他们四分之一页!

小心扩展应用程序。如果您曾经在自己的进程中启动服务(例如,允许它在 Activity 崩溃时正常关闭),那么该服务将拥有自己的应用程序副本。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多