آموزش معماری MVVM در اندروید: راهنمای جامع و کاربردی
- تحلیل و بررسی
- سید وحید حسینی
- 10 دقیقه
آموزش معماری MVVM در اندروید : MVVM یکی از معماری های رایج در توسعه اپلیکیشن های اندروید است که مخفف کلمه (Model-View-ViewModel) هست و به دلیل ساختار منظم و قابلیت تست پذیری بالا، توسط بسیاری از توسعه دهندگان استفاده میشود. MVVM با جدا کردن منطق نمایش از منطق برنامه، به بهبود نگهداری کد و کاهش وابستگی ها کمک میکند. در آموزش معماری MVVM در اندروید به بررسی کامل این معماری، مزایای آن و نحوه پیاده سازی آن در اندروید میپردازیم.
معماری MVVM چیست؟
معماری MVVM یک الگوی طراحی است که شامل سه جزء اصلی به نامهای Model، View و ViewModel است. این معماری توسط مایکروسافت معرفی شده و برای اولین بار در پروژه های WPF و Silverlight استفاده شده است. هدف اصلی آن، جدا کردن منطق رابط کاربری (UI) از منطق برنامه و داده ها است تا توسعه دهندگان بتوانند کد تمیزتری بنویسند و توسعه اپلیکیشنها را بصورت ماژولار و قابلیت نگهداری بیشتر انجام دهند.
Model: این بخش مسئول مدیریت داده ها و عملیات مرتبط با داده ها است. Model میتواند داده ها را از منابع مختلفی مانند پایگاه داده یا API دریافت و مدیریت کند.
View: این بخش به عنوان رابط کاربری عمل میکند و آنچه کاربر مشاهده میکند را نمایش میدهد.
ViewModel: این لایه رابط بین Model و View است و داده های مورد نیاز View را آماده میکند و همچنین به صورت دوطرفه داده های ورودی کاربر را به Model ارسال میکند.
در ادامه آموزش معماری MVVM در اندروید به تفاوت، مزایا و مفهوم اجزای معماری MVVM میپردازیم.

تفاوت MVVM با معماری های MVC و MVP
معماری MVVM نسبت به MVC (Model-View-Controller) و MVP (Model-View-Presenter) تفاوت هایی دارد. در MVC، Controller مسئول مدیریت منطق برنامه و ایجاد ارتباط بین Model و View است. در MVP، Presenter بعنوان رابط بین View و Model عمل میکند. اما در MVVM، ViewModel لایه ای بین View و Model است که داده ها را برای View آماده میکند و امکان ارتباط دوطرفه داده ها فراهم میشود.
تفاوتهای کلیدی MVVM با این دو معماری به شرح زیر است:
عدم ارتباط مستقیم بین View و Model: در MVVM، ارتباط مستقیم بین View و Model وجود ندارد و ViewModel به عنوان واسط عمل میکند.
استفاده از DataBinding: در MVVM، DataBinding امکان اتصال دوطرفه بین View و ViewModel را فراهم میکند که این ویژگی در معماریهای MVC و MVP وجود ندارد.
مزایای استفاده از معماری MVVM در اندروید
استفاده از معماری MVVM در اندروید مزایای متعددی دارد که برخی از آنها عبارتند از:
1- بهبود ساختار و نگهداری کد: جدا کردن لایه های مختلف در MVVM باعث میشود که کد به صورت ماژولار نوشته شود و هر بخش مسئولیت مشخصی داشته باشد. این کار نگهداری کد را در پروژه های بزرگ آسانتر میکند.
2- کاهش وابستگی ها بین بخشهای مختلف برنامه: در MVVM، ارتباط بین View و Model از طریق ViewModel انجام میشود و این موضوع به کاهش وابستگی ها و افزایش انعطاف پذیری کمک میکند.
3- افزایش قابلیت تست پذیری: با جدا کردن منطق برنامه در ViewModel، بخشهای مختلف کد به راحتی قابل تست هستند، بدون اینکه نیازی به تعامل با رابط کاربری باشد. این مزیت به ویژه برای توسعه دهندگان تست واحد و تست خودکار اهمیت دارد.
مفهوم Model در معماری MVVM
Model مسئول مدیریت و ارائه داده ها به ViewModel است و منطق مرتبط با داده ها را در خود جای داده است. در معماری MVVM، Model میتواند شامل کلاس هایی برای دستیابی به پایگاه داده، برقراری ارتباط با APIها یا منابع داده دیگر باشد. در اندروید، استفاده از Repository Pattern در لایه Model به کاهش پیچیدگی کمک میکند و داده ها را به طور مناسب برای ViewModel آماده میسازد.
ویژگی های مهم لایه Model در اندروید
شامل موارد زیر است:
1- مدیریت داده های برنامه: میتواند از پایگاه داده محلی مانند Room یا منابع آنلاین مانند APIها استفاده کند.
2- ایزوله کردن منطق داده ها: جدا نگه داشتن منطق داده ها از لایه View و ViewModel به بهبود معماری و تمیزی کد کمک میکند.
مفهوم ViewModel در معماری MVVM
ViewModel در معماری MVVM رابط بین View و Model است. این لایه وظیفه دارد داده های لازم را از Model دریافت و برای نمایش به View آماده کند. ViewModel چرخه حیات View را مدیریت میکند و از LiveData برای مدیریت داده ها استفاده میکند، که باعث میشود تغییرات داده ها به صورت خودکار در View بروزرسانی شوند.
ویژگی های کلیدی ViewModel در اندروید
شامل موارد زیر است:
1- مدیریت داده ها: ViewModel داده های مورد نیاز View را آماده میکند و از LiveData برای مدیریت آنها استفاده میکند.
2- ایزوله کردن چرخه حیات View: ویو مدل ViewModel از چرخه حیات View جداست و بنابراین، حتی پس از تغییرات چرخه حیات View مانند چرخش صفحه، داده ها دست نخورده باقی می مانند.
آشنایی با LiveData در MVVM
LiveData یکی از ابزارهای قدرتمند Android Architecture Components است که برای مدیریت داده ها و واکنش به تغییرات چرخه حیات استفاده میشود. با استفاده از LiveData، میتوانید داده های ViewModel را بهصورت خودکار به View متصل کنید و داده ها را به محض تغییر به روزرسانی کنید. LiveData در چرخه حیات View مانند Activity یا Fragment فعال است و نیازی به مدیریت دستی آن نیست.
ویژگی های LiveData در MVVM
1- واکنش پذیری: LiveData به صورت خودکار داده ها را به View متصل می کند و در صورت تغییر داده ها، View بروزرسانی میشود.
2- مدیریت چرخه حیات: LiveData به چرخه حیات View وابسته است و از مشکلات مرتبط با حافظه جلوگیری میکند.
آشنایی با DataBinding و کاربرد آن در MVVM
DataBinding یکی از ابزارهای کاربردی در اندروید است که امکان اتصال داده ها را بین View و ViewModel فراهم میکند. DataBinding به شما اجازه میدهد تا داده های ViewModel را مستقیماً به Viewها متصل کنید و نیاز به کدهای اضافی برای بروزرسانی UI را حذف میکند. در MVVM، DataBinding کمک میکند تا کدهای View ساده تر و تمیزتر نوشته شود.
ویژگی های DataBinding در MVVM
1- اتصال داده ها بین View و ViewModel: دیتا بایندینگ DataBinding بهطور مستقیم View را به داده های ViewModel متصل میکند.
2- کاهش کدهای تکراری: نیاز به نوشتن کدهای اضافی برای بروزرسانی رابط کاربری کاهش مییابد.
امیدوارد تا اینجا آموزش معماری MVVM در اندروید با اجزا این معماری آشنا شده باشید. در ادامه به ساختا معماری MVVM و یک مثال کاربردی می پردازیم.
ساختار کلی معماری MVVM در یک پروژه اندروید
در یک پروژه اندرویدی که از معماری MVVM استفاده میکند، بهتر است ساختار پوشه ها و فایل ها را به شکل مرتب و سازمان یافته ای ایجاد کنیم. این ساختار به ما کمک می کند که لایه ها به خوبی از هم جدا و هر بخش مسئولیت مشخصی داشته باشد. در پروژه های اندروید، ساختار پیشنهادی بصورت زیر است:
1- پوشه Model: شامل کلاس هایی که داده ها و منطق کسب و کار را مدیریت می کنند. به عنوان مثال، کلاس های مربوط به Repositoryها و Entityها در این پوشه قرار میگیرند.
2- پوشه View: شامل Activityها و Fragmentهایی است که رابط کاربری را به کاربر نمایش میدهند.
3- پوشه ViewModel: شامل کلاسهای ViewModel است که داده ها را از Model دریافت و برای View آماده میکنند.
4- پوشه Repository: برای مدیریت داده ها و ارتباط با منابع مختلف داده مانند APIها و پایگاه های داده.
مثال کاربردی از پیادهسازی MVVM برای نمایش لیست کاربران
در این مثال، اپلیکیشنی برای نمایش لیست کاربران با استفاده از API پیاده سازی می کنیم. این پروژه شامل سه بخش اصلی یعنی Model، View، و ViewModel است و در دو زبان کاتلین و جاوا پیاده سازی خواهد شد.
پروژه: اپلیکیشن نمایش لیست کاربران
این اپلیکیشن داده های کاربران را از یک API دریافت و در رابط کاربری نمایش می دهد. از ابزارهایی مانند Retrofit برای ارتباط با API، LiveData برای مدیریت داده ها و DataBinding برای اتصال داده ها به رابط کاربری استفاده می شود.
مرحله اول: پیاده سازی لایه Model
ابتدا کلاسی برای مدیریت داده ها از API در لایه Model ایجاد می کنیم. این کلاس شامل تابعی است که داده های کاربران را از API میخواند.
کد کاتلین برای لایه Model:

مرحله دوم: پیاده سازی لایه ViewModel
در این مرحله، یک کلاس ViewModel ایجاد می کنیم که داده های کاربران را از Model دریافت و برای View آماده می کند. از LiveData برای مدیریت داده ها استفاده می شود تا در صورت تغییر، داده ها در View بروز شوند.
کد کاتلین برای لایه ViewModel:

مرحله سوم: پیاده سازی لایه View
در این مرحله، یک Activity برای نمایش لیست کاربران ایجاد می کنیم و از DataBinding برای اتصال ViewModel به View استفاده می کنیم. در این مثال از RecyclerView برای نمایش لیست کاربران استفاده شده است.
کد کاتلین برای لایه View:

خوب تا اینجا آموزش معماری MVVM در اندروید تونستید یک استفاده خیلی کوچیک از این معماری ببرید.
نکات مهم در پیاده سازی MVVM
برای اینکه پروژه هایی با معماری MVVM به بهترین شکل ممکن عمل کنند و به مشکلات کمتری برخورد کنند، رعایت برخی نکات در پیاده سازی ضروری است:
1- تفکیک وظایف در سه لایه: یکی از اصول اساسی MVVM جدا نگه داشتن وظایف مختلف است. مطمئن شوید که هر کدام از لایه ها یعنی Model، View، و ViewModel فقط وظایف خود را انجام می دهند. به عنوان مثال، منطق کسب و کار و مدیریت داده ها باید در Model باشد و نه در View یا ViewModel.
2- جلوگیری از ایجاد وابستگی های غیرضروری: در پروژه های MVVM، وابستگی های مستقیم بین لایه های مختلف میتواند مشکلاتی ایجاد کند. توصیه می شود از الگوهای وابستگی معکوس مانند استفاده از Interfaceها برای کاهش وابستگی ها استفاده کنید.
3- استفاده از Repository Pattern: الگوی Repository به شما کمک میکند تا منابع داده ها (مانند APIها یا پایگاه داده ها) را از ViewModel جدا کنید. با این کار، تغییرات در منابع داده ها به راحتی قابل مدیریت خواهد بود.
4- تستپذیری بالا در MVVM: یکی از مزایای اصلی MVVM قابلیت تست پذیری است. با جدا کردن منطق کسب و کار و رابط کاربری، میتوانید Unit Test ها و تست های خودکار را بهراحتی برای ViewModelها انجام دهید.
ابزارها و کتابخانه های مفید برای پیادهسازی MVVM
برای پیاده سازی معماری MVVM در اندروید، چندین ابزار و کتابخانه وجود دارد که می توانند به افزایش کارایی، سرعت توسعه و بهبود کیفیت کد کمک کنند:
1- Retrofit: یک کتابخانه قدرتمند برای ارتباط با APIها است و به شما امکان می دهد درخواست های HTTP را بصورت ساده و خوانا ارسال و پاسخ ها را مدیریت کنید.
2- Room: یکی از ابزارهای پایگاه داده اندروید است که با ساختاری ساده و قابل فهم، مدیریت داده ها را در لایه Model آسانتر میکند. این ابزار به خوبی با LiveData و ViewModel یکپارچه میشود.
3- Hilt (برای Dependency Injection): برای کاهش وابستگی های ناخواسته بین لایه ها و افزایش انعطافپذیری، استفاده از Hilt برای مدیریت وابستگی ها پیشنهاد میشود. این ابزار بخصوص در ViewModelها مفید است.
4- Coroutines (کاتلین) یا RxJava (جاوا): استفاده از کاتلین Coroutines یا RxJava برای مدیریت عملیات ناهمزمان و جلوگیری از مسدود کردن رابط کاربری (UI) به ویژه در عملیات سنگین مانند درخواستهای شبکه ای پیشنهاد میشود.
مشکلات رایج و راهحلهای پیادهسازی MVVM در اندروید
در پیادهسازی معماری MVVM ممکن است به مشکلاتی برخورد کنید که با شناخت و رعایت راه حل های مناسب میتوانید از بروز آنها جلوگیری کنید:
1- مشکل مدیریت چرخه حیات View: اگر چرخه حیات View و ViewModel به درستی مدیریت نشود، ممکن است با مشکلاتی مانند از دست رفتن داده ها پس از چرخش صفحه مواجه شوید. استفاده از ViewModelها و LiveData به شما کمک میکند این مشکل را حل کنید.
2- پیچیدگی در وابستگی ها: اگر از ابزارهای وابستگی معکوس یا Dependency Injection استفاده نکنید، پروژه بهسرعت پیچیده خواهد شد و نگهداری آن دشوار خواهد بود. Hilt و Dagger ابزارهایی هستند که به ساده سازی این موضوع کمک میکنند.
3- مدیریت عملیات ناهمزمان: درخواستهای شبکه ای یا عملیات سنگین باید به صورت ناهمزمان مدیریت شوند. در کاتلین استفاده از Coroutines و در جاوا استفاده از RxJava یا AsyncTask می تواند این مشکلات را رفع کند.
مزایا و معایب معماری MVVM
استفاده از MVVM مزایا و معایب خاص خود را دارد که در ادامه به بررسی آنها می پردازیم.
مزایای معماری MVVM:
1- افزایش خوانایی و نگهداری کد: به دلیل جدا بودن لایه ها، کد تمیزتر و قابل نگهداری تر است.
2- تست پذیری بالا: جدا بودن منطق برنامه از رابط کاربری، انجام تست ها را آسانتر میکند.
3- کاهش وابستگی ها: با استفاده از ViewModel و LiveData وابستگیهای مستقیم بین لایه ها حذف شده است.
معایب معماری MVVM:
1- پیچیدگی بیشتر برای پروژه های کوچک: در پروژه های کوچک استفاده از MVVM ممکن است باعث پیچیدگی های اضافی شود.
2- نیاز به یادگیری بیشتر: برای کار با MVVM، باید با مفاهیم LiveData، ViewModel، DataBinding و برخی کتابخانه ها آشنا باشید.
جمع بندی و نتیجه گیری
در آموزش معماری MVVM در اندروید، به معرفی معماری MVVM پرداخته و سعی کریدم یک نمونه ساده پیاده سازی را پیاده سازی کنیم. با استفاده از این معماری، میتوانید پروژه های خود را بهصورت ماژولار و خواناتر پیاده سازی کرده و نگهداری کد را بهبود بخشید. همچنین، قابلیت تست پذیری بالای این معماری به شما کمک میکند تا کدهای خود را به راحتی بررسی و اشکالات را در کوتاه ترین زمان ممکن رفع کنید.