Middle
Pourquoi de nombreux développeurs rejettent-ils l'architecture MVP?
sobes.tech IA
Réponse de l'IA
- Modèle boilerplate. Beaucoup de code pour relier View et Presenter : interfaces pour View, implémentation du Presenter, gestionnaires du cycle de vie.
- Difficulté de tester le Presenter. Pour tester le Presenter, il est souvent nécessaire de faire des mocks de la View, qui peut être complexe et avoir des dépendances.
- Problèmes de conservation de l'état. Lors d'un changement de configuration (par exemple, lors de la rotation de l'écran), il faut sauvegarder et restaurer manuellement l'état du Presenter, ce qui peut être fastidieux.
- Mauvaise évolutivité. À mesure que la complexité de l'écran augmente, le Presenter peut devenir lourd et difficile à maintenir.
- Absence de lien direct entre View et données. La View n'a pas d'accès direct aux données, toutes les requêtes passent par le Presenter, ce qui peut compliquer les opérations simples.
Exemple de code illustrant un boilerplate en MVP :
// Interface View
interface MyView {
fun showData(data: List<String>)
fun showError(message: String)
}
// Interface Presenter
interface MyPresenter {
fun attachView(view: MyView)
fun detachView()
fun loadData()
}
// Implémentation du 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() {
// Simulation du chargement de données
val data = model.getData()
view?.showData(data)
}
}
// Exemple d'utilisation dans une 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>) {
// Mise à jour de l'UI
}
override fun showError(message: String) {
// Affichage de l'erreur
}
}