Sobes.tech
Middle

¿Por qué muchos desarrolladores rechazan la arquitectura MVP?

sobes.tech AI

Respuesta de la IA

  • Plantilla de boilerplate. Mucho código para enlazar View y Presenter: interfaces para View, implementación del Presenter, manejadores del ciclo de vida.
  • Dificultad para probar el Presenter. Para probar el Presenter, a menudo es necesario hacer mock de la View, que puede ser compleja y tener dependencias.
  • Problemas con la conservación del estado. Al cambiar la configuración (por ejemplo, al rotar la pantalla), es necesario guardar y restaurar manualmente el estado del Presenter, lo cual puede ser engorroso.
  • Mala escalabilidad. A medida que crece la complejidad de la pantalla, el Presenter puede volverse pesado y difícil de mantener.
  • Falta de conexión directa entre View y datos. La View no tiene acceso directo a los datos, todas las solicitudes pasan a través del Presenter, lo que puede complicar operaciones simples.

Ejemplo de código que demuestra un boilerplate en MVP:

// Interfaz View
interface MyView {
    fun showData(data: List<String>)
    fun showError(message: String)
}

// Interfaz Presenter
interface MyPresenter {
    fun attachView(view: MyView)
    fun detachView()
    fun loadData()
}

// Implementación del Presenter
class MyPresenterImpl(private val model: MyModel) : MyPresenter {

    private var view: MyView? = null

    override fun attachView(view: MyView) {
        this.view = view
    }

    override fun detachView() {
        view = null
    }

    override fun loadData() {
        // Simulación de carga de datos
        val data = model.getData()
        view?.showData(data)
    }
}

// Ejemplo de uso en una Activity
class MyActivity : AppCompatActivity(), MyView {

    private lateinit var presenter: MyPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        presenter = MyPresenterImpl(MyModel())
        presenter.attachView(this)
        presenter.loadData()
    }

    override fun onDestroy() {
        super.onDestroy()
        presenter.detachView()
    }

    override fun showData(data: List<String>) {
        // Actualización de la UI
    }

    override fun showError(message: String) {
        // Mostrar error
    }
}