Android 为什么要使用 MVP 模式中的接口?

Why should we use interface in MVP pattern for Android?

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

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

在我的Activity

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)
 }
}
  1. 高阶函数成本

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

    Using higher-order functions imposes certain runtime penalties: each function is an object, and it captures a closure, i.e. those variables that are accessed in the body of the function. Memory allocations (both for function objects and classes) and virtual calls introduce runtime overhead.

    并且如果您将所有接口替换为高阶函数,您可能会以糟糕的性能告终。[​​=12=]

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

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

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

why do I need interfaces for View and Presenter as Kotlin provides higher order functions?

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

  1. 有了接口,您可以拥有它的多个实现,而无需真正关心实现的具体类型。这就是高阶函数所缺少的——当使用 LoginPresenter.userLogin() 方法时,您只能使用 LoginPresenter 类型。

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

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

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