معماری MVVM و تفاوت آن با MVP؟ بخش اول

معماری MVVM یا همون Model-View-Viewmodel همانند mvc یا mvp یکی از الگو های معماری نرم افزار است. استفاده از آن به ما کمک میکند کدی تمیز، قابل نگهداری ، قابل تست و با خوانایی بالا داشته باشیم. برای فهم کامل این سری از مقاله ها لازم است با معماری MVP آشنایی داشته باشید. همچنین سطح متوسط به بالا در برنامه نویسی اندروید هم لازم است.

به طور کلی MVVM از سه بخش تشکیل شده

  • ویو(view): وظیفه نمایش اطلاعات و گرفتن داده های ورودی از کاربر را دارد. اطلاعات گرفته شده از کاربر به viewmodel فرستاده می شود.
  • ویومدل(viewmodel): داده های دریافت شده از مدل را مدریت می کند و به view می فرستد.
  • مدل(model): وظیفه مدیریت داده ها را بر عهده دارد.

در نگاه اول، به نظر می رسد شباهت بسیار زیادی بین معماری MVP و MVVM وجود دارد. انگار presenter به viewmodel تبدیل شده است. اما تفاوت آنها چیزی فراتر از تغییر نام presenter به viewmodel است. همانطور که در شکل زیر می بینید یک سری اینترفیس هم برای پیاده سازی MVP لازم است. اینترفیس IView بعد ها در presenter استفاده می شود و به طور مستقیم view را تغییر می دهد. در صورتی که در معماری MVVM این اتفاق به طور مستقیم نمی افتد یعنی viewmodel به صورت غیر مستقیم view را تغییر می دهد. نکته دیگر این است که ارتباط بین view و presenter در mvp یک به یک است، اما ارتباط بین view و viewmodel یک به چند است.

معماری MVP
معماری MVP
معماری MVVM
معماری MVVM

اینکه در معماری MVP ، ویو به صورت مستقیم توسط presenter تغییر میکند یک سری مشکلات و پیچیدگی ها را به کد اضافه می کند. زیرا ما مجبوریم حواسمان باشد که ویو در چه وضعیتی قرار دارد و اگر در وضعیت یا onDestroy نبود اجازه به روز رسانی ویو را داریم. به همین دلیل ما مجبوریم در presenter وضعیت view را گزارش دهیم. همین باعث می شود تست کردن کد ها، نگهداری و پیچیدگی کدمان افزایش یابد. اما در معماری MVVM دیگر این مشکل وجود ندارد، چرا که دیگر viewmodel به طور مستقیم با view در ارتباط نیست. شاید برایتان سوال باشد که اگر viewmodel با view در ارتباط نیست پس چگونه view را به روز رسانی می کند؟!

چند راه حل برای به روز رسانی view توسط viewmodel پیشنهاد می شود.

  • دیتا بایندینگ(DataBinding)
  • لایو دیتا (LiveData)
  • ار ایکس جاوا(RxJava)

در همه راه حل های پیشنهاد شده هدف این است که یه سری observable (شی هایی هستند که زمانی که تغییر می کنند تغییرشان را به کسانی که آنها را observe (مشاهده) می کنند اعلام میکنند.) در viewmodel داشته باشیم که در view آنها را observe(مشاهده) کنیم. در آموزش های بعدی به بررسی راه حل های موجود می پردازیم.