Sobes.tech
Middle

Warum lehnen viele Entwickler die MVP-Architektur ab?

sobes.tech KI

Antwort von AI

  • Boilerplate. Viel Code, um View und Presenter zu verbinden: Schnittstellen für View, Implementierung des Presenters, Lifecycle-Handler.
  • Schwierigkeiten bei der Testung des Presenters. Für Tests ist es oft notwendig, die View zu mocken, die selbst komplex sein und Abhängigkeiten haben kann.
  • Probleme bei der Zustandsverwaltung. Bei Konfigurationsänderungen (z.B. bei Bildschirmrotation) muss der Zustand des Presenters manuell gespeichert und wiederhergestellt werden, was umständlich sein kann.
  • Schlechte Skalierbarkeit. Mit zunehmender Komplexität des Bildschirms kann der Presenter schwer und wartungsintensiv werden.
  • Fehlende direkte Verbindung zwischen View und Daten. Die View hat keinen direkten Zugriff auf die Daten, alle Anfragen laufen über den Presenter, was einfache Operationen erschweren kann.

Beispielcode, der Boilerplate in MVP demonstriert:

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

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

// Presenter-Implementierung
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() {
        // Daten laden simulieren
        val data = model.getData()
        view?.showData(data)
    }
}

// Verwendung in einer 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>) {
        // UI aktualisieren
    }

    override fun showError(message: String) {
        // Fehler anzeigen
    }
}