معماری mvp در اندروید با کاتلین ، نحوه استفاده از معماری MVP ، همیشه برای برنامه نویسی با هر زبانی و برای هر پلتفرمی نیاز به رعایت اصول و قوانینی می باشد.تمیز نویسی و کوتاه نویسی همیشه به برنامه نویس لذت می بخشد. کدهای اصولی به راحتی قابل تغییر و منعطف هستند و قابلیت تست راحتری دارند و خود مستند هستند.
اولین موردی که توسعه دهنده اندروید برای بهبود موارد فنی در نظر میگیرد معماری می باشد.انتخاب معماری برای برنامه نویسان تازه کار می تواند مشکل باشد.ما در این آموزش شما را با یک معماری در اندروید برای تمیز نویسی کد آشنا میکنیم.این معماری mvp نام دارد که از کلمات زیر مشتق شده است.
Model–View–Presenter
در ادامه آموزش یاد خواهید گرفت که چگونه معماری mvp را در اکوسیستم اندروید پیاده سازی کنید. ما یک مثال برای پیاده سازی با کاتلین ارائه میدهیم که الگوی مناسبی برای یادگیری شما خواهد بود.
وقتی که میخواهیم معماری برای پیاده سازی نرم افزار خود انتخاب کنیم اولین اصلی که باید به آن توجه کنیم جدا کردن لایه ها از یک دیگر می باشد. تا نرم افزار ما منعطف شود و تغییرات درآن ساده باشد و زمانبر نباشد.
معماری MVP یکی از بهترین معماری جدا کردن لایه نمایشی از لایه منطق تجاری یا Business Logic Layer می باشد.
معماری MVP به ما این امکان را می دهد تا به راحتی الگویی از معماری پیشرفته را پیاده سازی و اجرا کنیم. مانند الگوی کامل Clean Architecture.
ما در این مقاله بررسی میکنیم که نحوه استفاده از معماری MVP چگونه است؟ و ما چگونه می توانیم با استفاده از کاتلین آن را اجرا کنیم
همان بخشی است که کاربر با نصب اپلیکیشن آن را می بیند و با آن ارتباط برقرار میکند در واقع در معماری mvp عملیات کاربر را به presenter منتقل میکند. و ترکیبی از Activity/Fragment/View و رابط کاربری می باشد. و هر زمان که نیاز به انجام عملی باشد عملکردی متفاوت از presenter را برای شی انجام میدهد و دارای منطق تجاری نمی باشد و به صورت مستقیم با مدل ارتباطی ندارد.
Xml فایل ها یک بخش از لایه view هستند و همچنین Adapter ها هم یک بخش از view می باشد.
نمونه ای از کدهای لایه view با کاتلین
//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) }
به زبان ساده میتوان گفت در معماری mvp لایه Presenter به عنوان واسط بین model و view عمل میکند.و یک کلاس جداگانه است که نباید Android context داشته باشد.
Presenter در واقع شامل منطق های اپلیکیشن از جمله رفتارها یا رویدادها و هر عملیاتی که صورت میگیرد هست و به بروزرسانی مدل پاسخ میدهد و وضعیت ارائه در لایه view را کنترل می کند.
Presenter دارای آبجکت View و Model است و دسترسی مستقیم به عناصر ui برنامه را ندارد.
Presenter بر اساس view ساخته می شود یعنی پیاده سازی کد های Presenter به لایه view محدود میگردد ، این گفته به صورت رایج قابل قبول می باشد ، به این دلیل که view یک کلاس ساده است و نیازی نیست که تست شود.همچنین Presenter احتمال تغییر کدهایش کم می باشد.
زمانی که presenter مجموعه ای از اطلاعات را در view قرار می دهد یا یک رویدادی توسط کاربر اتفاق می افتد، view تغییر می کند.
Presenter مدل را دریافت و نمایش می دهد در واقع بخش model را در view نمایش میدهد.
نمونه ای از کدهای لایه Presenter با کاتلین
// 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 } }
بخواهیم مدل را به زبان ساده بیان کنیم می توانیم بگوییم که مدل وظیفه اش ارتباط بین برنامه و دیتا است.در واقع میتوان گفت یک منبع اطلاعات قابل نمایش در view می باشد.مدل تنها لایه ای هست که منطق تجاری یا business logic را به خوبی اجرا می کند و به صورت جداگانه بدون view قابل تست می باشد.
مدل از وجود view و Presenter هیچ آگاهی ندارد.اگر تغییری در مدل ایجا شود باید Presenter حتما از آن تغییر آگاه شود.
نمونه ای از کدهای لایه Model در کاتلین
class MainInteractor { interface OnFinishedListener { fun onResultSuccess(arrUpdates: List<DataItem>) fun onResultFail(strError: String) } fun requestGetDataAPI(onFinishedListener: OnFinishedListener) { // Get data from server } }
به طور خلاصه قابل ذکر است که لایه view با توابع و کلاس Presenter ارتباط برقرار میکند. مثلا اگر کاربر در اپلیکیشن بر روی دکمه ثبت اطلاعات کلیک کند view اطلاعات کاربر را به Presenter انتقال می دهد و Presenter یک آبجکت جدید از اطلاعات دریافت شده را به مدل انتقال میدهد و اطلاعات را به مدل تحویل میدهد و مدل آن را در دیتابیس ذخیره میکند و درنهایت presenter برروزرسانی مدل را دریافت میکند و آن را به view ارسال میکند و view آن بروز رسانی را به کاربر نمایش میدهد.
ارتباط مستقیم از:
View ==> Presenter ==> Model
ارتباط غیر مستقیم از قرارداد رابط کاربری :
Model =/=> Presenter =/=> Vie
تصویر زیر اطلاعات خوبی را از معماری mvp بیان میکند ، این تصویر بیان گر نمودار جریانی از معماری mvp در اندروید می باشد و درک کاملی از این معماری در اندروید را نشان می دهد.
در آدرس زیر میتوانید مثال کاملی در این رابطه با کاتلین را مشاهده نمایید.
نمونه ای از معماری mvp در کاتلین
امیدوارم این پست براتون مفید بوده باشه و ازش استفاده کنید. از طریق راه های ارتباطی زیر میتونید با ما برای درخواست آموزش های اختصاصی و انواع پروژه ها در ارتباط باشید.