الگوی MVVM ، یک الگوی طراحی نرم افزاری است که برای جداسازی منطق برنامه و کنترل های رابط کاربری ساخته شده است، MVVM همچنین به عنوان model-view-binder شناخته می شود و توسط معماران مایکروسافت کن کوپر و جان گاسمن ساخته شده است.
مانند بسیاری از الگوهای طراحی دیگر، MVVM به سازماندهی کد و تبدیل برنامه ها به ماژول ها کمک می کند تا توسعه، به روز رسانی و استفاده مجدد از کد را ساده تر و سریع تر کند. این الگو اغلب در ویندوز و نرم افزارهای ارائه گرافیک وب استفاده می شود.
الگوی MVVM در Windows Presentation Foundation (WPF) استفاده می شود که بر روی دات نت مایکروسافت اجرا می شود حتی در. Silverlight، که یک پلاگین چند رسانه ای معادل اینترنت مایکروسافت WPF، از MVVM استفاده شده است.
حالا چرا به این الگوهای معماری نیاز داریم؟ و اینکه چرا امروزه لازم است همه با آنها آشنایی داشته باشیم؟، تنها یک پاسخ وجود دارد، ساده کردن زندگی. بله، این الگوها به شما کمک میکنند تا معماری پیچیده پشت برنامههای بزرگ را، در لایهها ساده کنید. این لایه ها به حدی از هم جدا شده اند که اشکال زدایی، تست و نگهداری اپلیکیشن را بسیار آسان می کند.یکی از این الگوها که امروز بررسی میکنیم MVVM هست که شباهت زیادی به الگوی MVC دارد.(چنانچه در زمینه MVC آشنایی ندارید ابتدا پیشنهاد میکنم توضیح اختصاصی الگویMVC را مطالع کنید.)
این الگو از سه بخش(Model,View,ViewModel) تشکیل شده است:
این سه بخش، برنامه ی شما را به سه بخش اصلی تقسیم میکند. سه بخشی که هر کدام می توانند به صورت جدا توسعه داده شود تا وابستگی بخش ها به هم دسیگر کمتر شود وهمچنین توسعه ی موازی قابل اجرا شود. در زیر به بررسی هر بخش می پردازیم:
وویو(View): مجموعه ای از عناصر قابل مشاهده است که ورودی کاربر را نیز دریافت می کند. این شامل رابط های کاربری (UI)، انیمیشن ها و متن است. اینکه اطلاعات مدل چگونه و به چه سبکی نمایش داده شود، وظیفه ویوو است. محتوای View مستقیماً برای تغییر آنچه ارائه شده است، در تعامل نیست. در واقع به ظاهر و پوستهی و جایی که یک کاربر می تواند ببیند می گویند. و با ان در ارتباط و تعامل است .ویوو شامل رفتارها و سرویسهایی (مثل رویدادهای کلیک، لمس) است که طی ان اطلاعات مدل میتواند تغییر کنند. مثلا یک فرم برای ثبت یک کاربر جدید. وقتی کاربر اطلاعاتی را از طریق فرم ارسال کرد، دستوراتی دربرنامه تعریف می شود که این اطلاعات در مدل ذخیره گردد.
وویومدل(ViewModel): بین لایه های View و Model قرار دارد، یعنی همان واسط مدل و ویوو است. چیزی شبیه نقش کنترلر در. MVC اینجا جایی است که کنترلهای تعامل با View قرار میگیرند، در حالی که از binding برای اتصال عناصر UI در View به کنترلهای ViewModel استفاده میشود .ویوومدل اطلاعات مدل، عملکردها و ویژگیهایی ارائه میدهد که توسط ویوو استفاده می شود و همچنین عملکردهایی (مثل متدها، توابع و ...) که با انها اطلاعات مدل دستکاری می شود را شامل می شود. به بیان سادهتر، ویوومدل تبدیلکننده اطلاعات است. میتونه اطلاعات رو طوری به ویوو تحویل بده که ویوو میخواد. همچنین اطلاعات رو طوری به مدل تحویل میده که مدل میخواد. فرض کنیم توی ویوو یک رویداد(مثلا submit فرم کاربر جدید) رخ دهد. خب انتظار داریم این اطلاعات در مدل ثبت شود. ویوو این اطلاعات را به متدی میفرستد که در ویوومدل وجود دارد. وظیفهی این متد این است که اطلاعات را از ویوو بگیرد، یک سری کارها (مثلا اعتبارسنجی) انجام دهد و نهایتا انها رو به مدل اضافه کند.
مدل (Model): منطق برنامه را در خود جای می دهد که توسط ViewModel پس از دریافت ورودی خود از کاربر از طریق View بازیابی می شود. مدل جایی است که فقط اطلاعات نگهداری می شود. برای مثال اطلاعات یک مدل، کاربرها، پستها و دستهبندیهای برنامه است. وظیفهی مدل این نیست که رفتارها و سرویسهایی برای ویرایش و دستکاری اطلاعات ارائه دهد. همچنین مدل مسئول نحوهی نمایش اطلاعات نیست. وظیفهی مدل نگهداری، حفظ و ارائه اطلاعات مورد نیاز است. در یک برنامه اینکه اطلاعات چگونه دریافت شود و چگونه نمایش داده شود، بر عهده مدل نیست. مدل مسئول نگهداری اطلاعات تا حد امکان خام است.
تفاوت زیادی بین الگوی MVP و MVVM وجود ندارد به جز اینکه Presenter اکنون با viewModel جایگزین شده است. این انعطاف پذیری زیادی را به همراه دارد زیرا View اکنون از طریق مفهومی به نام Data Binding با مدل ارتباط برقرار می کند. View Model مسئول نمایش روشها، دستورات و سایر ویژگیهایی است که به حفظ وضعیت نما، دستکاری مدل به عنوان نتیجه اقدامات روی نما، و راهاندازی رویدادها در خود view کمک میکند.
مزایا:
· قابلیت نگهداری : می تواند چابک باقی بماند و نسخه های متوالی را به سرعت منتشر کند
· توسعه پذیری: قابلیت جایگزینی یا اضافه کردن کدهای جدید را داشته باشید
· تست پذیری : نوشتن تست های واحد در برابر منطق اصلی آسان تر است.
· ارتباط شفاف :مدل view یک رابط شفاف برای کنترلکننده view ارائه میکند که از آن برای پر کردن لایه view و تعامل با لایه مدل استفاده میکند که منجر به یک ارتباط شفاف بین لایههای برنامه شما میشود.
معایب:
· برخی از مردم فکر می کنند که برای رابط های کاربری ساده، MVVM می تواند زیادی باشد.
· در موارد بزرگتر، طراحی ViewModel ممکن است سخت باشد.
· هنگامی که پیوندهای پیچیده داده ای داریم، اشکال زدایی کمی دشوار خواهد بود.
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است»
منابع:
https://www.linkedin.com/pulse/mvc-mvp-mvvm-architecture-patterns-shashank-gupta
https://www.geeksforgeeks.org/introduction-to-model-view-view-model-mvvm/
https://whatis.techtarget.com/definition/Model-View-ViewModel