Sobes.tech
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
    }
}