【问题标题】:Why should we use interface in MVP pattern for Android?为什么我们应该在 Android 的 MVP 模式中使用接口?
【发布时间】:2019-03-24 06:52:03
【问题描述】:

我正在使用 Kotlin 第一次使用 MVP 模式制作一个 Android 应用程序。我的问题是,为什么我需要 View 和 Presenter 的接口,因为 Kotlin 提供了更高阶的功能?我们不能只使用那些高阶函数进行通信吗?使用没有接口的模式不好吗?

我查看并阅读了很多文章和教程,但没有回答我的问题。我在下面的代码中所做的是错误的做法吗?谁能给我解释一下?

在我的活动中

override fun init() {

    btn_login.setOnClickListener {
        LoginPresenter.userLogin(et_emailAddress.text.toString(),et_password.text.toString()){
            if (it){
                //do something
            }else{
                //do something
            }
        }
    }
}

我的主播

object LoginPresenter {

fun userLogin(emailId: String, password: String, completion: (Boolean) -> Unit) {
    //do something
    completion(true)
 }
}

【问题讨论】:

  • “为什么我需要 View 和 Presenter 的接口” - 你不需要使用接口,但是最好编程到抽象而不是实现。想想这如何在单元测试中使您受益,或者您更改实现 - 合同保持不变。我认为使用演示者的界面没有任何好处,只是视图。观察一下,你的 Presenter 是一个单例,它真的应该被限制在 Activity 范围内。我不确定您对高阶函数的论点,因为您可以在 java 中提供 Consumer<T> 吗?这也打破了 MVP 流控制。

标签: android design-patterns kotlin android-mvp


【解决方案1】:
  1. 高阶函数成本

    关于高阶函数成本的 Kotlin 官方文档

    使用高阶函数会带来一定的运行时惩罚:每个 函数是一个对象,它捕获一个闭包,即那些变量 在函数体中访问。内存分配 (对于函数对象和类)和虚拟调用引入 运行时开销。

    如果你用高阶函数替换你的所有接口,你可能会得到一个糟糕的性能。

2。 接口可以包含多个函数,在使用高阶函数时需要单独的函数参数。 考虑以下情况,

interface UserLoginInterface {
      fun onLoginSuccess(loggedInUser: User)
      fun onLoginFailure(error: ErrorResponse)
      fun onRedirect(someOtherObjectWithDirectives: SomeDataClass)
 }

要将其转换为高阶函数用法,您必须使用三个函数参数

【讨论】:

  • 不知道使用高阶函数会导致性能不佳。谢谢。
【解决方案2】:

为什么我需要 View 和 Presenter 的接口,因为 Kotlin 提供了更高阶的功能?

这是软件开发中相当普遍的做法。虽然您可能不使用接口,但有许多关键点可以说明为什么接口更可取。在我脑海中浮现:

  1. 使用接口,您可以有多个实现,而无需真正关心实现的具体类型。这就是高阶函数所缺少的——在使用 LoginPresenter.userLogin() 方法时,您受限于唯一的类型 LoginPresenter

  2. 大多数设计模式都基于接口与其实现的分离。所以编程到实现而不是抽象不会让你使用这些。

  3. 您将无法正确地对依赖于其他实现的类进行单元测试,因为在这种情况下无法进行模拟。

  4. 随着具体实施,代码维护和扩展变得更加困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多