مقالات باگتو

معماری mvp در کاتلین
معماری mvp در کاتلین

نحوه کارMVPو یک مثال ساده که پیاده سازی آن در کاتلین است.

عملاً خلاصه کردن معماریMVPدر اینجا در چند سطر امکان پذیر نیست. اما می توانم به شما اطمینان دهم که تک تک سطرهای مقاله زیر ارزش وقت شما را دارد.

هر زمان که هر توسعه دهنده اندروید به فکر بهبود مهارت های فنی است اولین چیزی که به ذهن او خطور می کند معماری برنامه است. ناگفته نماند آنها سختی که در حفظ کد های قدیمی و بدونه ساختار وجود دارد را می دانند. من همین کار را کردم و مفهوم معماری را یاد گرفتم و بعداً تصمیم گرفتم که رویMVPتمرکز کنم. بعد از امتحان کردن آن با پروژه های آزمایشی و برنامه های واقعی ، من به سمت یادگیری زبان کاتلین و اکنون جدیدترین  Architecture Component های معماری حرکت کردم. بنابراین در اینجا با این مثالها معماریmvp را نشان میدهم. من به شما قول می دهم که این مثالها آنقدر ساده خواهند بود که می توانید هسته این مفاهیم را به راحتی درک کنید.

Model-View-Presenter (MVP)در کاتیلن

MVPیکی از بهترین الگوها برای جداسازی لایهpresentationاز لایهlogic است. علاوه بر اینMVPبه شما کمک می کند تا الگوهای معماری پیشرفته تر ، مانندClean Architectureرا به راحتی پیاده سازی کنید.

در اینجا نمی خواهم به سوالاتی مانند چه و چرا پاسخ دهم اما چگونه.

چگونه ازMVPاستفاده کنیم؟ چگونه کار می کند؟ و چگونه می توان آن را با استفاده از کاتلین پیاده سازی کرد؟

بنابراین در این مقاله اول شاهد اجرایMVPبا استفاده از کاتلین خواهیم بود.

View

ترکیبی ازActivity,Fragment,Viewو قرارداد آن یعنیinterface.

همه موارد مربوط بهUIو همه مواردی که بهcontext Androidنیاز دارند در این لایه انجام میشوند.

هر زمان که لازم است عملیاتی انجام شود باید تابع مربوطه را در presentation فراخوانی کنید.

اگرچه لایهXMLبخشی ازViewاست  اما به تنهایی به عنوانViewنامیده نمی شود. تمام توابع لازم از طریقinterfaceبهActivity Fragment , View,اضافه می شوند.Adapterها نیز بخشی ازViewهستند. Activity / Fragment / Viewها Modelرا به صورت غیرمستقیم معرفی می کنند همانطور کهPresenter  کلاس Model را در سازنده آن مقداردهی اولیه میکند.


//Activity/Fragment/View implements interface
class MainActivity : AppCompatActivity(), MainView {
    // Initialize Presenter (also Model in the constructor of Presenter) & has object of Presenter
    private lateinit var mainPresenter: MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        //...
        mainPresenter = MainPresenter(this, MainInteractor())
        mainPresenter.getData()
    }

    //...

    override fun setData(arrUpdates: List<DataItem>) {
        // Show data on UI
    }

    override fun setDataError(strError: String) {
        // Show error on UI
    }

    override fun onDestroy() {
        // Destroy View
        mainPresenter.onDestroy()
        super.onDestroy()
    }
}

===================================

// Interface (acts as a contract between View and Presenter)
interface MainView {
    fun showProgress()
    fun hideProgress()
    fun setData(arrUpdates: List<DataItem>)
    fun setDataError(strError: String)
}

 

Presenter

یک کلاس جداگانه است که نبایدContext Androidداشته باشد.

 به عنوان واسطه بین دو لایه اصلی معماری یعنیViewوModelعمل میکند.

توابع مربوط به مدل را بسته به درخواستی که توسطViewارائه میشود را در این کلاس پیاده سازی میکنید.

Presenterاشیایی ازViewوModelرا دارد.این کلاسbusiness logic ما نیست. علاوه بر این  نباید مستقیماً به عناصرUIدسترسی داشته باشد.

// Presenter has the object of both View and Model(Interactor)
// Implements OnFinishedListener to listen for Interactor response
class MainPresenter(private var mainView: MainView?, private val mainInteractor: MainInteractor)
    : MainInteractor.OnFinishedListener {

    fun getData() {
        mainView?.showProgress()
        mainInteractor.requestGetDataAPI(this)
    }

    override fun onResultSuccess(arrUpdates: List<DataItem>) {
        mainView?.hideProgress()
        mainView?.setData(arrUpdates)
    }

    override fun onResultFail(strError: String) {
        mainView?.hideProgress()
        mainView?.setDataError(strError)
    }

    // Destroy View when Activity destroyed
    fun onDestroy() {
        mainView = null
    }
}

 

Model

پایگاه داده ،modelها فراخوانی هایAPIو سایر  busines logicها بخشی از این لایه است. تمامbusiness logic اپلیکیشن در این لایه قرار دارد.

برای جدا کردنbusiness logic می توانیم آن را به صورت جداگانه و بدونViewتست کنیم. این کار همچنین به ما کمک می کند تا از یکcode-baseدر سراسر اپلیکشن استفاده کنیم.و همچینین در این لایه دریافت یا محاسبه داده ها یا خطا برای نشان دادن درUIرا داریم.

 

در اینجا ارتباط باAPI، تماس با پایگاه داده و سایر محاسبات را انجام میدهیم.

اما برای اینکه بهتر و قابل اطمینان تر شود ، می توانیم یک لایه دیگر در داخلModelاضافه کنیم.

 

Repository

Repositoryتصمیم می گیرد که چگونه بسته به شرایط از پیش تعیین شده ، داده ها نمایش داده شود. این بدان معنی است که داده ها را از منابع آفلاین یا آنلاین بسته به شرایطی مانند دسترسی به شبکه دریافت می کند.

برای ساده نگه داشتن آموزش برنامه موجود لایهrepositoryندارد.

 

معماریMVPچگونه کار می کند؟

به طور مختصرViewتوابعPresenter را فراخوانی میکندPresenterآن را بهModelمنتقل می کند ،Modelدرخواست می کند داده ها نشان داده شوند. بعد از اینکهModelداده را دریافت کرد ، آن را بهPresenterوPresenterآن را بهViewپاس میدهد وViewآن داده را درUIنمایش می دهد.

ارتباط مستقیم:

View ==> Presenter ==> Model

ارتباط غیر مستقیم با استفاده ازInterface:

Model =/=> Presenter =/=> View

در اینجا نمودار گردش کار(workflow) سادهMVPدر اندروید را مشاهده میکنید.

تصویر زیر را با دقت چند بار نگا کنید و مراحل کار را به ذهن خود بسپارید. این کار به شما کمک می کند تاMVPرا درAndroidبهتر درک کنید.

توجه:از این مدل به عنوانInteractorیاد می شود.

امیدوارم که مفهومmvp را به خوبی درک کرده باشید.این آموزش هم به پایان رسید سوالات خودرا در قسمت کامنت ها مطرح کنید تا به آنها پاسخ بدهم.

تگ‌ها
اشتراک

0 نظرات


;