Middle
Dlaczego wielu programistów odrzuca architekturę MVP?
sobes.tech AI
Odpowiedź od AI
- Szablon boilerplate. Dużo kodu do łączenia View i Presenter: interfejsy dla View, implementacja Presenter, obsługa cyklu życia.
- Trudności w testowaniu Presenter. Do testowania Presenter często trzeba tworzyć mocki View, które mogą być skomplikowane i mieć zależności.
- Problemy z zachowaniem stanu. Przy zmianie konfiguracji (np. obrót ekranu) konieczne jest ręczne zapisywanie i przywracanie stanu Presenter, co może być uciążliwe.
- Słaba skalowalność. W miarę rozbudowy ekranu, Presenter może stać się ciężki i trudny do utrzymania.
- Brak bezpośredniego połączenia między View a danymi. View nie ma bezpośredniego dostępu do danych, wszystkie zapytania przechodzą przez Presenter, co może utrudniać proste operacje.
Przykład kodu demonstrujący boilerplate w MVP:
// Interfejs View
interface MyView {
fun showData(data: List<String>)
fun showError(message: String)
}
// Interfejs Presenter
interface MyPresenter {
fun attachView(view: MyView)
fun detachView()
fun loadData()
}
// Implementacja 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() {
// Symulacja ładowania danych
val data = model.getData()
view?.showData(data)
}
}
// Przykład użycia w 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>) {
// Aktualizacja UI
}
override fun showError(message: String) {
// Wyświetlenie błędu
}
}