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)
}
}
高阶函数成本
关于高阶函数成本的 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?
这在软件开发中是相当普遍的做法。虽然您可能不使用接口,但有许多关键点可以说明为什么接口更可取。在我的脑海中:
有了接口,您可以拥有它的多个实现,而无需真正关心实现的具体类型。这就是高阶函数所缺少的——当使用 LoginPresenter.userLogin()
方法时,您只能使用 LoginPresenter
类型。
大多数设计模式都是基于接口与其实现的分离。所以编程到实现而不是抽象不会让你利用这些。
您将无法正确地对依赖于其他实现的单元测试 类,因为在这种情况下不可能进行模拟。
代码维护和扩展随着具体实现变得更加困难。
我第一次使用 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)
}
}
高阶函数成本
关于高阶函数成本的 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?
这在软件开发中是相当普遍的做法。虽然您可能不使用接口,但有许多关键点可以说明为什么接口更可取。在我的脑海中:
有了接口,您可以拥有它的多个实现,而无需真正关心实现的具体类型。这就是高阶函数所缺少的——当使用
LoginPresenter.userLogin()
方法时,您只能使用LoginPresenter
类型。大多数设计模式都是基于接口与其实现的分离。所以编程到实现而不是抽象不会让你利用这些。
您将无法正确地对依赖于其他实现的单元测试 类,因为在这种情况下不可能进行模拟。
代码维护和扩展随着具体实现变得更加困难。