Sobes.tech
Middle

Kodėl daugelis kūrėjų atsisako MVP architektūros?

sobes.tech AI

Atsakymas iš AI

  • Boiilerplaitas. Daug kodo, skirtas View ir Presenter ryšiui: View interfeisai, Presenter įgyvendinimas, gyvenimo ciklo tvarkymas.
  • Presenter testavimo sudėtingumas. Dažnai reikia imituoti View, kuris gali būti sudėtingas ir turėti priklausomybių.
  • Būsena išsaugojimo problemos. Konfigūracijos keitimo metu (pvz., ekrano pasukimo atveju) būtina rankiniu būdu išsaugoti ir atkurti Presenter būseną, kas gali būti sudėtinga.
  • Blogas mastelio keitimas. Didėjant ekrano sudėtingumui, Presenter gali tapti sunkus ir sunkiai prižiūrimas.
  • Tiesioginio ryšio tarp View ir duomenų nebuvimas. View neturi tiesioginės prieigos prie duomenų, visi užklausimai eina per Presenter, kas gali apsunkinti paprastus veiksmus.

Pavyzdinis kodas, demonstruojantis MVP boilorplaitą:

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

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

// Presenter įgyvendinimas
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() {
        // Duomenų įkėlimas
        val data = model.getData()
        view?.showData(data)
    }
}

// Naudojimas 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>) {
        // UI atnaujinimas
    }

    override fun showError(message: String) {
        // Klaidos rodymas
    }
}