Sobes.tech
Middle

Ինչու շատ ծրագրավորողներ մերժում են MVP ճարտարապետությունը։

sobes.tech AI

Պատասխան AI-ից

  • Բոյլերփլեյթ։ Շատ կոդ՝ View և Presenter-ների կապի համար՝ ինտերֆեյսներ View-ի համար, Presenter-ի իրականացում, կյանքի ցիկլի հսկողություն:
  • Presenter-ի թեստավորման բարդություն։ Թեստավորման համար հաճախ անհրաժեշտ է մոկել View-ը, որը կարող է լինել բարդ և ունենալ կախվածություններ:
  • Կարգավիճակի պահպանման խնդիրներ։ Կոնֆիգուրացիայի փոփոխության ժամանակ (օրինակ՝ էկրանին պտտվելու ժամանակ) անհրաժեշտ է ձեռքով պահպանել և վերականգնել Presenter-ի վիճակը, ինչը կարող է լինել բարդ:
  • Անբավարար ընդլայնելիություն։ Էկրանի բարդության աճի դեպքում Presenter-ը կարող է դառնալ ծանր և դժվարին պահպանել:
  • Ուղիղ կապի բացակայություն View և տվյալների միջև։ View-ը չունի ուղիղ մուտք տվյալների, բոլոր հարցումները անցնում են Presenter-ի միջոցով, ինչը կարող է բարդացնել պարզ գործողությունները:

Նմուշ կոդ, որը ցույց է տալիս MVP-ում բոյլերփլեյթ:

// View ինտերֆեյս
interface MyView {
    fun showData(data: List<String>)
    fun showError(message: String)
}

// Presenter ինտերֆեյս
interface MyPresenter {
    fun attachView(view: MyView)
    fun detachView()
    fun loadData()
}

// 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() {
        // Տվյալների բեռնում
        val data = model.getData()
        view?.showData(data)
    }
}

// Օգտագործում 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-ի թարմացում
    }

    override fun showError(message: String) {
        // Հաղորդագրության ցուցադրում
    }
}