Middle
Waarom weigeren veel ontwikkelaars de MVP-architectuur?
sobes.tech AI
Antwoord van AI
- Boilerplate. Veel code om View en Presenter te koppelen: interfaces voor View, implementatie van de Presenter, lifecycle handlers.
- Testbaarheid van de Presenter. Voor het testen van de Presenter is het vaak nodig om de View te mocken, wat complex kan zijn en afhankelijkheden kan hebben.
- Problemen met het bewaren van de staat. Bij configuratiewijzigingen (bijvoorbeeld schermrotatie) moet de staat van de Presenter handmatig worden opgeslagen en hersteld, wat omslachtig kan zijn.
- Slechte schaalbaarheid. Naarmate de complexiteit van het scherm toeneemt, kan de Presenter zwaar en moeilijk te onderhouden worden.
- Gebrek aan directe verbinding tussen View en data. De View heeft geen directe toegang tot de data, alle verzoeken gaan via de Presenter, wat eenvoudige operaties kan bemoeilijken.
Voorbeeldcode die boilerplate in MVP demonstreert:
// 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()
}
// Implementatie van de 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() {
// Simulatie van data laden
val data = model.getData()
view?.showData(data)
}
}
// Gebruik in een 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 bijwerken
}
override fun showError(message: String) {
// Fout tonen
}
}