Sobes.tech
Middle

Zašto mnogi programeri odbacuju MVP arhitekturu?

sobes.tech АИ

Одговор од АИ

  • Boilerplate. Mnogo koda za povezivanje na View i Presenter: interfejsi za View, implementacija na Presenter, upravlqne na životniot cikŭl.
  • Teškoći pri testiranje na Presenter. Za testiranje na Presenter, često e potrebna mock na View, koja može biti složena i da ima zavisnosti.
  • Problemi so očuvanje na sostojanie. Pri promena na konfiguracijata (npr. rotacija na ekranot), treba rucno da se čuva i da se vrati sostojanjeto na Presenter, što može biti zamorno.
  • Loska skalabilnost. Kako se povećuva složenosta na ekranot, Presenter-ot može da postane teški i teško za održavanje.
  • Nema direktna veza između View i podatocite. View-ot nema direkten pristap do podatocite, site zahtevki prolazat preko Presenter, što može da oteža jednostavni operacii.

Primer kod koji prikazuva boilerplate vo MVP:

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

// Interfejs na Presenter
interface MyPresenter {
    fun attachView(view: MyView)
    fun detachView()
    fun loadData()
}

// Implementacija na 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() {
        // Simulacija na load na podatoci
        val data = model.getData()
        view?.showData(data)
    }
}

// Primer na koristenje vo 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>) {
        // Ažuriranje na UI
    }

    override fun showError(message: String) {
        // Prikaz na greska
    }
}