为什么要在Android的MVP模式中使用界面?

时间:2019-03-24 06:52:03

标签: android design-patterns kotlin android-mvp

我第一次使用 MVP 模式使用 Kotlin 创建一个 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)
 }
}

2 个答案:

答案 0 :(得分:1)

  1. 高级功能成本

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

      

    使用高阶函数会产生某些运行时惩罚:每个   函数是一个对象,它捕获一个闭包,即那些变量   在函数主体中访问的文件。内存分配   (用于函数对象和类)和虚拟调用介绍   运行时开销。

    如果用高阶函数替换所有接口,可能会导致性能下降。

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

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

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

答案 1 :(得分:1)

  

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

这在软件开发中是相当普遍的做法。尽管您可能不使用界面,但是有很多要点是为什么选择界面的原因。在我的头顶上:

  1. 使用接口,您可以具有多个实现,而无需实际关心实现的具体类型。这就是高阶函数所缺少的-使用LoginPresenter方法时,只有LoginPresenter.userLogin()类型的约束。

  2. 大多数设计模式都是基于接口与其实现的分离。因此,编程到实现中而不是抽象中将使您无法利用它们。

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

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