Sobes.tech
Middle

Miks paljud arendajad keelduvad MVP arhitektuurist?

sobes.tech AI

Vastus AI-lt

  • Boiilerpliiit. Palju koodi View ja Presenter vahelise sideme jaoks: View liidesed, Presenter'i rakendamine, elutsükli haldus.
  • Presenter'i testimise keerukus. Tihti on vaja mockida View, mis võib ise olla keeruline ja sõltuvustega.
  • Seisundi säilitamise probleemid. Konfiguratsiooni muutmisel (näiteks ekraani pööramisel) tuleb käsitsi säilitada ja taastada Presenter'i seisund, mis võib olla tülikas.
  • Halb skaleeritavus. Ekraani keerukuse suurenedes võib Presenter muutuda raskeks ja hooldatavaks.
  • Otsese ühenduse puudumine View ja andmete vahel. View ei pääse otse andmetele ligi, kõik päringud läbib Presenter, mis võib lihtsaid toiminguid keerulisemaks muuta.

Näide koodist, mis näitab MVP boilerpliiiti:

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

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

// Presenter'i rakendus
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() {
        // Andmete laadimine
        val data = model.getData()
        view?.showData(data)
    }
}

// Näide kasutamisest Activitys
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 uuendamine
    }

    override fun showError(message: String) {
        // Vea näitamine
    }
}