我第一次使用 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)
}
}
答案 0 :(得分:1)
高级功能成本
有关高阶函数成本的Kotlin官方文档
使用高阶函数会产生某些运行时惩罚:每个 函数是一个对象,它捕获一个闭包,即那些变量 在函数主体中访问的文件。内存分配 (用于函数对象和类)和虚拟调用介绍 运行时开销。
如果用高阶函数替换所有接口,可能会导致性能下降。
2。 接口可以包含多个函数,使用高阶函数时,您将需要单独的函数参数。 考虑以下情况,
interface UserLoginInterface {
fun onLoginSuccess(loggedInUser: User)
fun onLoginFailure(error: ErrorResponse)
fun onRedirect(someOtherObjectWithDirectives: SomeDataClass)
}
要将其转换为高阶函数用法,必须使用三个Function参数
答案 1 :(得分:1)
为什么Kotlin提供了更高阶的功能,我为什么需要View和Presenter的接口?
这在软件开发中是相当普遍的做法。尽管您可能不使用界面,但是有很多要点是为什么选择界面的原因。在我的头顶上:
使用接口,您可以具有多个实现,而无需实际关心实现的具体类型。这就是高阶函数所缺少的-使用LoginPresenter
方法时,只有LoginPresenter.userLogin()
类型的约束。
大多数设计模式都是基于接口与其实现的分离。因此,编程到实现中而不是抽象中将使您无法利用它们。
您将无法正确地对依赖于其他实现的类进行单元测试,因为在这种情况下无法进行模拟。
通过具体的实施,代码维护和扩展变得更加困难。