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
}
}