Estoy creando una aplicación de Android usando Kotlin por primera vez usando el patrón MVP . Mi pregunta es, ¿por qué necesito interfaces para View y Presenter ya que Kotlin proporciona funciones de orden superior? ¿No podemos simplemente comunicarnos usando esas funciones de orden superior? ¿Es malo el uso de patrón sin interfaces?
He buscado y leído muchos artículos y tutoriales, pero no respondí a mi pregunta. ¿Lo que estoy haciendo en el siguiente código es una práctica incorrecta? ¿Alguien puede explicar me lo?
en mi actividad
override fun init() { btn_login.setOnClickListener { LoginPresenter.userLogin(et_emailAddress.text.toString(),et_password.text.toString()){ if (it){ //do something }else{ //do something } } } }mi presentador
object LoginPresenter { fun userLogin(emailId: String, password: String, completion: (Boolean) -> Unit) { //do something completion(true) } }Costos de función de orden superior
Documentación oficial de Kotlin sobre el costo de las funciones de orden superior
El uso de funciones de orden superior impone ciertas penalizaciones de tiempo de ejecución: cada función es un objeto y captura un cierre, es decir, aquellas variables a las que se accede en el cuerpo de la función. Las asignaciones de memoria (tanto para objetos de función como para clases) y las llamadas virtuales introducen una sobrecarga de tiempo de ejecución.
y si está reemplazando todas sus interfaces con funciones de orden superior, puede terminar con un mal desempeño.
2. Las interfaces pueden contener múltiples funciones, para las cuales necesitará parámetros de funciones individuales cuando use funciones de orden superior. Considere el siguiente caso,
interface UserLoginInterface { fun onLoginSuccess(loggedInUser: User) fun onLoginFailure(error: ErrorResponse) fun onRedirect(someOtherObjectWithDirectives: SomeDataClass) }Para traducir esto al uso de funciones de orden superior, deberá usar tres parámetros de función
¿Por qué necesito interfaces para View y Presenter ya que Kotlin proporciona funciones de orden superior?
Esta es una práctica bastante común en el desarrollo de software. Y aunque es posible que no use interfaces, hay una serie de puntos clave por los que las interfaces son preferibles. La parte superior de mi cabeza:
con la interfaz, puede tener múltiples implementaciones sin preocuparse realmente por el tipo concreto de implementación. Esto es lo que te estás perdiendo con las funciones de orden superior: estás restringido con el único tipo, LoginPresenter , cuando usas el método LoginPresenter.userLogin() .
la mayoría de los patrones de diseño se basan en la separación de las interfaces de sus implementaciones. Por lo tanto, programar en implementación en lugar de abstracción no le permitirá utilizarlos.
no podrá realizar correctamente pruebas unitarias de clases que dependan de otras implementaciones, ya que en este caso no es posible burlarse.
el mantenimiento y la extensión del código se vuelven mucho más difíciles con una implementación concreta.