PDA

View Full Version : مقاله: معرفی الگوی M-V-VM -قسمت اول



piroozman
سه شنبه 07 خرداد 1392, 18:37 عصر
معرفی الگوی M-V-VM -قسمت اول

M-V-VM چیست؟

M-V-VM یا Model-View-ViewModel یکی از الگوهای محبوب طراحی رابط کاربر در WPF و Silverlight می باشد که توسط Jhon Gossman از تیم WPF ایجاد شده است و قدرت خود را مدیون توانمندی های BINGING پیشرفته WPF و SILVERLIGHT است. به کمک آن می توان VIEW (یا همان قسمتی از برنامه که کاربر با آن سر و کار دارد) را از کدهای مرتبط با داده ها و منطق برنامه مجزا ساخت. به این صورت در یک تیم افرادی می توانند بر روی VIEW در EXPRESSION BLEND کار کرده و همزمان تعدادی دیگر در VS.NET مشغول تهیه قسمت ViewModel ها باشند.


https://sites.google.com/site/daryasharp/_/rsrc/1369682263250/m-v-vm-pictuers/M-V-VM-1.jpg
https://sites.google.com/site/daryasharp/_/rsrc/1369682288295/m-v-vm-pictuers/M-V-VM-2.jpg
شکل یک - نمایی از قرارگیری و نحوه تعامل لایه های مختلف در یک برنامه با الگوی M-V-VM
روش متداول آموزش و کار با WPF و Silverlight همانند روزهای WinForms یا VB6 است. تمام کنترل های بصری نامگذاری می شوند. سپس رویدادها به صورت مستقیم تعریف شده و در Code behind صفحه« منطق مرتبط با آن پیاده سازی می شود( یعنی در کدهای View ارجاعات مستقیمی به Model خواهیم داشت). همچنین پیاده سازی به همراه استفاده مستقیم از نام اشیاء و کنترل هایی است که در View تعریف شد هاند. حاصل این عملیات متداول، گره خوردگی کدهای صفحه با View است که امکان نوشتن آزمون های واحد آن را به صفر می رساند. همچنین از امکانات پیشرفته ی WPF و Silverlight مانند انقیاد دوطرفه (Tow way binding) و بسیاری موارد دیگر نیز استفاده نخواهد شد. به علاوه با توجه به استفاده ی مستقیم از نام کنترل های بصری در code behind ، تغییر یا جایگزینی یک کنترل نیاز به تغییرات وسیعی در کدهای ما خواهد داشت. برای رفع این مشکلات، الگوی M-V-VM ارائه شده است که توسط خود مایکروسافت جهت بهره گیری از تمامی امکانات WPF و Silverlight ابداع گردیده و در تهیه ی محصولات مهم Microsoft Expression Blend نیز بکار گرفته شده است.
آشنایی با اجزای مختلف الگوی M-V-VM
به صورت خلاصه هدف اصلی الگوی M-V-VM جداسازی مسایل مرتبط با رابط کاربر (View) از اشیاء تجاری و حالات آنها (View Models) و همچنین از لایه داده ها و دسترسی به داده ها (Model) است.
https://sites.google.com/site/daryasharp/_/rsrc/1369682334713/m-v-vm-pictuers/M-V-VM-3.jpg
شکل دو - نمایی از نحوه تعاریف و تعاملات اجزای مختلف در الگوی M-V-VM


Model - گروهی از موجودیت ها می باشند که ارائه خواهند شد. برای مثال کلاس مشتری به همراه خواص نام و شماره شناسایی او. مدل های برنامه از اینکه اطلاعات آ نها از کجا تهیه خواهند شد یا چگونه به کاربر نمایش داده می شوند اطلاعاتی ندارند. یک مدل خوب نباید نیازی به ارجاعاتی به PresentationFramework.dll ، System.Windows.Forms ، PresentationCore و امثال آن ها داشته باشد. همچنین باید بتوان به سادگی از آن حتی در یک برنامه ی کنسول نیز استفاده کرد. البته باید در نظر داشت که پیاده سازی های متفاوتی از مدل یا سایر قسم تهای این الگو مشاهده می شود و الزامی به رعایت حتمی تک تک این موارد نیست.
View - همان کدهای Xaml ایی هستند که جهت نمایش رابط گرافیکی تهیه می شوند و نه بیشتر. View می تواند شامل کنترل های بصری، پویانمایی و غیره باشد به همراه تعاریف binding به اطلاعات؛ اما با این شرط که View نمی داند این اطلاعات در کجا قرار دارند و یا چگونه تهیه خواهند شد. عموماً از user control ها و یا Data Template ها برای تهیه View استفاده می کنند. یکی از اهداف الگوی M-V-VM داشتن View هایی است که دارای Conde behind نیستند و هیچ منطقی را پیاده سازی نمی کنند.
View Model - مدلی آینه ای از View است به شکل یک کلاس (Model of a View) که توسط آن می توان برای کل View به جای تعامل مستقیم با آن، آزمون واحد (Unit test) تهیه نمود. View Model محل اتصال View به دنیای خارج است (به آن meta-view نیز گفته می شود). توسط این کلاس که اطلاعات binding و Command در اختیار View قرار می گیرد. View Model بیانگر حالت و رفتار Viiew (های) متناظر آن است.

https://sites.google.com/site/daryasharp/_/rsrc/1369682369616/m-v-vm-pictuers/M-V-VM-4.jpg
شکل سه - نحوه ی ارتباط بین اجزای مختلف الگویM-V-VM


در اینجاهرخاصیتیکهقراراستدرbi nding شرکتداشتهباشدبایداینترفیس INotifyPropertyChangedراپیادهسازینما ید. دراینالگوحرکاتوتعاملاتکار برمانندکلیکبرروییکدکمه بهصورت Commands ارائهمیگردند. درزمانایجاد ViewModel تنهاساختارView استکهبایدمدنظرقرارگیردونه ظاهرکلیآن. همچنینجهتبالابردنقابلیتآز مونهایواحدآناینکلاسنبایده یچگونهارجاعیرابهکنترلهایب صریداشتهباشد.
درالگوی M-V-VM همانطورکهدرشکل3نیزمشخصشده ست، View تنهااز ViewModel اطلاعاتلازمرادریافتمیکند و هیچگونهاطلاعاتیاز Model ندارد.ViewModel اطلاعاتموردنیاز خودراازModel تهیهمیکند امااطلاعاتیاز View ندارد و Model تنهاخودشرامی شناسد.
در شکل 4 ارتباط مستقیم View با Model نیز نمایش داده شده است. گاهی از اوقات اگر ViewModel شما هیچگونه منطقی را پیاده سازی نم یکند، لزومی هم به ایجاد آن نیست؛ در غیر اینصورت حتما کار وفق دادن اطلاعات Model با View را از طریق ViewModel پیاده سازی نمائید.
View به خواص تعریف شده در ViewModel بایند (مقید) خواهد شد (توسط DataContext هر View). با توجه به پیاده سازی اینترفیس INotifyPropertyChanged، هر تغییری در خواص ViewModel بدون نیاز به کد نویسی، در UI و View برنامه منعکس می گردد. بنابراین تغییرات بر روی داده ها تنها در ViewModel باید صورت گیرد و نه در View .
https://sites.google.com/site/daryasharp/_/rsrc/1369682414128/m-v-vm-pictuers/M-V-VM-5.jpg
شکل چهار – نمایی از نحوه ی ارتباط بین ViewModel و Viewدر الگوی MVVM.
به صورت خلاصه نحوه ی تعامل بین View و ViewModel به شکل زیر است:


ارتباطات بین View و ViewModel از طریق data-binding فراخوانی متدها، خواص، رخ دادها، و پیغام ها است.
ViewModel علاوه بر ارائه ی خواص ضروری Model به View می تواند یک سری حالات و یا Commands را نیز در اختیار View قرار دهد.
رخ دادهای یک View از طریق Commands به ViewModel منتقل م یشوند.
خواص ارائ هی شده ی ViewModel به View از طریق binding دو طرفه به روز رسانی می شوند.

و نحوه ی تعامل بین ViewModel و Model به صورت زیر است:


ViewModel می تواند تمام خواص یا تعدادی از خواص مفید Model را جهت data-binding در اختیار View قرار دهد.
ViewModel می تواند شامل اینترفیس هایی به سرویس ها یا تنظیماتی خاص جهت دریافت و اعمال تغییرات بر روی اطلاعاتی باشد که به View ارائه می دهد.

شکل بعد روابط اجزای سه معماری *MV را بیان می کند و با توجه به آن کاملا مشخص است که یکی از اهداف اصلی الگوی MVVM، سهولت هرچه بیشتر انجام آزمو نهای واحد است و از هر دو معماری MVP و MVC قابلیت آزمایش پذیری بهتری را ارائه می دهد.
https://sites.google.com/site/daryasharp/_/rsrc/1369682449089/m-v-vm-pictuers/M-V-VM-6.jpg
شکل پنج – مقایسه ای از روابط اجزای مختلف سه معماری متفاوت *MV
در قسمت دوم به مزایای استفاده از الگوی M-V-VM را تشریح خواهیم کرد.
منبع: کتاب Silverlight 4، پژوهش و نگارش: آقای وحید نصری

piroozman
سه شنبه 07 خرداد 1392, 18:38 عصر
مزایای استفاده از الگوی M-V-VM- قسمت دوم


جدا سازی لایه ها از یکدیگر: به این صورت تغییرات صورت گرفته در هر کدام از لایه ها به علت عدم تنیدگی در دیگری، با سهولت بیشتری صورت خواهد گرفت و نگهداری برنامه را در دراز مدت ساده تر خواهد کرد.
امکان فعالیت تیمی بهتر : با توجه به جداسازی لایه ها، طراح رابط کاربر و برنام ه نویس ها همزمان می توانند کارهای خویش را انجام دهند (شکل 6).
تهیه آزمون های واحد : همیشه تهیه ی آزمون واحد برای UI و کدهای event driven کاری بسیار مشکل است. اما در اینجا ViewModel را به سادگی می توان با کمک آزمون های خودکار بررسی کرد و میزان کدهای View به حداقل ممکن می رسد.
پشتیبانی بهتر از چندین View: با توجه به جدا سازی لای ههای مختلف برنامه، امکان تهیه برنامه هایی که به سادگی قابل تبدیل به WPF و یا Silverlight هستند را خواهید داشت. همچنین می توان برای مثال دو View مختلف را ارائه داد به صورتیکه از یک ViewModel استفاده م یکنند و تفاوت آن ها در نحوه ی نمایش و قالب بندی اطلاعات ارائه شده توسط ViewModel است، بدون اینکه نیازی به تکرار کدها در برنامه وجود داشته باشد. به این صورت تغییر و یا تعویض یک View بدون تغییری در کدهای برنامه میسر خواهد شد.
سادگی استفاده از کنترل های WPF و Silverlight : کنترل های بصری WPF و Silverlight اساسا جهت کار با این الگو طراحی شد هاند و بسیاری از قابلیت های آن ها با کمک الگوی M-V-VM بهتر نمایان خواهند شد.
Blendability : به قابلیت ایجاد و ویرایش داد ههای آزمایشی در زمان طراحی رابط کاربر در Expression Blend ( و یا حتی طراح Visual Studio ) جهت مشاهد هی بهتر و نزدیک به واقعیت View تولید شده گفته م یشود که توسط این الگو بهتر از پیش میسر خواهد شد.
https://sites.google.com/site/daryasharp/_/rsrc/1369686595186/m-v-vm-pictuers/M-V-VM-7.jpg
شکل شش - یکی از مزایای الگوی M-V-VM امکان کار همزمان طراح رابط کاربر برنامه و برنامه نویس ها در یک تیم است.

اصول کاری و بایدها و نبایدهای الگوی M-V-VM
بایدها و نبایدهای یک View


وظیفه ی آن نگهداری حالات خود نیست. ViewModel است که این وظیف هرا به عهده م یگیرد.
نباید در آن کدهایی که نیاز به آزمون واحد دارند، پیاده سازی شوند. در حالت کلی، کد نویسی در Code behind یک View منعی ندارد اما اگر برای مثال در View قسمتی جهت انتخاب نام یک کشور و سپس قسمتی دیگر جهت نمایش مناطق مختلف آن کشور وجود دارد این مورد نیاز به نوشتن آزمون واحد داشته و نباید در Code behind پیاده سازی شود.
نباید در Code behind آن روال های رخداد گردان کلیک بر روی یک دکمه و مانند آن مشاهده شود.
می تواند یک user control و یا Data Template باشد.
View را تا حد امکان ساده نگه دارید، هر چند استفاده از Data Trigger، Value Converter و موارد دیگر منعی ندارند.
اگر عنصری به سادگی، قابلیت bind نداشت برای آن attached property تدارک ببینید.
تنها باید از اطلاعات ViewModel استفاده کرده و نباید به صورت مستقیم هیچگونه تعاملی با Model داشته باشد.
مهم ترین هدف و وظیفه ی یک View باید قالب بندی، بازآرایی و همچنین نمایش بصری اطلاعات باشد.

https://sites.google.com/site/daryasharp/_/rsrc/1369686730069/m-v-vm-pictuers/M-V-VM-8.jpg
شکل هفت - نمایی از روند کاری و ارتباطات قسمت های مختلف یک برنامه مبتنی بر الگوی M-V-VM .
بایدها و نبایدهای ViewModel


وظیفه ی آن شکل دهی به اطلاعات، مرتب سازی آ نها و سپس ارائ هی این داده ها به View است. برای مثال Model اطلاعات تاریخ را به فرمی خام نگهداری می کند، ViewModel به آن ها فرمت قابل ارائه به کاربر را بخشیده و سپس View این اطلاعات نهایی را نمایش می دهد.
هیچگونه ارجاعی از View نباید در آن وجود داشته باشد.
تا حد ممکن قابلیت آزمون واحد پذیری آن را درنظر داشته باشید. برای مثال فراخوانی کلاسی از نوع Singleton در آن نباید وجود داشته باشد.
نباید در آن اثری از کنترل های بصری View دیده شود. در غیر اینصورت علاوه بر مشکل شدن تهیه آزمو نهای واحد برای یک ViewModel، به محض تغییر View باید ViewModel ما نیز کلا تغییر کند. بنابراین ارجاعی از PresentationFramework در آن نباید وجود داشته باشد. به عبارت دیگر طراحی آن باید logical باشد و نه Visual .
تغییرات را باید از طریق پیاده سازی INotifyPropertyChanged به View منعکس کند ( الگوی Observer).
نوع خواص تعریف شده در آن باید محدود به یک ViewModel دیگر یا نوع های اصلی و پایه و یا مجموع های از آن ها باشد.
یکی از مکان هایی که می توان در آن پیاده سازی تعیین اعتبار ورودی کاربر را انجام داد ViewModel مرتبط است؛ زیرا لایه ای است میان Model و View برنامه. همچنین در این لایه بسیاری از اعمال تبدیلی را جهت حذف تبدیل کننده های WPF و Silverlight نیز م یتوان مد نظر داشت.

https://sites.google.com/site/daryasharp/_/rsrc/1369686748981/m-v-vm-pictuers/M-V-VM-9.jpg
شکل هشت – نحوه ی تعریف، حیطه ی عملکرد و ارتباطات اجزای الگوی M-V-VM
بایدها و نبایدهای Model


وظیفه ی آن مدیریت و ارائه ی اطلاعات به ViewModel است. مخزنی است از اطلاعات اما وظیفه ی آن دریافت اطلاعات از یک دیتابیس یا سرویس و یا تغییرات بر روی آن ها نیست. منطق تجاری باید از مدل مجزا شده و در کلا سهای دیگری نگهداری شود.
نباید ارجاعی از View و یا ViewModel در آن وجود داشته باشد. برای مثال نباید در یک مدل ارجاعی به PresentationFramework و موارد دیگری که پیشتر از آ نها یاد شد، مشاهده شود.
نباید در سایر لایه ها، نیازی به کلاس های دیگر برای کار با آن وجود داشته باشد. به بیان دیگر هر نوع عملیاتی که نیاز است بر روی داد هها صورت گیرد باید توسط این کلا سها انجام شده و سایر کلاس ها نباید به صورت مستقیم سر و کاری با بانک اطلاعاتی و ساختار آن و یا ذخیره یا بازیابی اطلاعات داشته باشند.
زمانیکه نیاز به درخواست بازخورد از کاربر در آن وجود داشت باید از Events استفاده گردد.
یک مدل می تواند با پیاده سازی IDataErrorInfo قسمتی از کار تعیین اعتبار داده ها را نیز به عهده بگیرد. به بیان دیگر تهیه ی مدلی که هیچگونه منطق تجاری را پیاده سازی نم یکند در اکثر مواقع میسر نیست و در این موارد بهتر است منطق تجاری اعمالی بر روی مدل، در کلاس های مجزایی نگه داری شوند.

مروری بر معایب الگوی M-V-VM


با توجه به اینکه این الگو توسط تیم WPF ارائه شده است اما هنوز استاندارد سازی نشده و همچنین روش ها یا ابزارهای استاندارد و کاملا مشخصی نیز برای پیاده سازی آن ارائه نشده است. به همین جهت امروزه شاهد چندین Framework توسعه یافته توسط برنامه نویس های مختلف در این زمینه هستیم و هر روز نیز تعداد آ نها افزایش می یابد ( مانند Microsoft WPF Toolkit ، Onyx ، Prism ، Crack.net ، Caliburn ، MVVM Light Toolkit و . . . ).
مطابق نظر خالق این الگو ، John Gossman، الگوی M-V-VM برای برنام ههای کوچک شاید مناسب نباشد و پیچیدگ یهای بی جهتی را به آن ها تحمیل کند.

هر چند مورد اول ذکر شده را می توان نوعی مزیت بر شمرد. به این صورت افراد مختلف با توانایی های متفاوت می توانند Framework در خوری را بیابند.
و در پایان باید در نظر داشت که برای توسع هی هر محصولی باید از ابزار متناسب با آن بهره جست. برای مثال در توسعه و طراحی یک بازی نوشته شده با WPF یا Silverlight الگوی M-V-VM شاید انتخاب مناسبی نباشد اما در سیستم های مبتنی بر داده و فر مهای ورود اطلاعات، انتخاب اول به شمار م یرود.
https://sites.google.com/site/daryasharp/m-v-vm-pictuers/M-V-VM-10.jpg
شکل نه – تصویری نمادین از قابلیت تغییر و نگهداری ساده تر برنامه های مبتنی بر MVVM

علی اکبر
چهارشنبه 08 خرداد 1392, 13:02 عصر
دوست عزیز تشکر خیلی لطف کردید اما اینها رو خیلی جاها دیدیم
اگه لطف کنی وبه صورت گام به گام یه مثال خیلی ساده بزنی خیلی عالی میشه

hamidhws
پنج شنبه 09 خرداد 1392, 03:41 صبح
ضمن تشکر از توضیحات شما , خواهشمندم با یه مثال عملی در مورد نحوه پیاده سازی این الگو به صورت قدم به قدم ارزش کار پرارزش خودتون رو صد چندان کنید

piroozman
چهارشنبه 15 خرداد 1392, 12:09 عصر
مثال ساده و عملی! کلیک کنید . . .
(http://barnamenevis.org/showthread.php?401946-RIATasks-%DB%8C%DA%A9-%D9%85%D8%AB%D8%A7%D9%84-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-CRUD-%D8%AF%D8%B1-Silverlight-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84&p=1786072#post1786072)

hamidhws
پنج شنبه 16 خرداد 1392, 00:02 صبح
ممنون دوست عزیز . فقط یه سوال داشتم در مورد معنی CRUD . یعنی یه توضیح که چی هست و...
مرسی

piroozman
پنج شنبه 16 خرداد 1392, 00:28 صبح
ممنون دوست عزیز . فقط یه سوال داشتم در مورد معنی CRUD . یعنی یه توضیح که چی هست و...
مرسی
C سرعبارت Create
R سر عبارت Read
U سر عبارت Update
و در نهایت D سرنام Delete، چهار عمل اصلی که می توانید بر روی داده ها یک بانک اطلاعاتی (مانند دیتابیس موجود در فرضا SQL Server) اعمال کنید.

hamidhws
پنج شنبه 16 خرداد 1392, 07:53 صبح
C سرعبارت Create
R سر عبارت Read
U سر عبارت Update
و در نهایت D سرنام Delete، چهار عمل اصلی که می توانید بر روی داده ها یک بانک اطلاعاتی (مانند دیتابیس موجود در فرضا SQL Server) اعمال کنید.

خیلی ممنون دوست عزیز.
فقط یه سوال دیگه . الان اون اعمال بر پایه الگوی mvvm پیاده سازی شده اند؟

piroozman
شنبه 18 خرداد 1392, 12:48 عصر
الان اون اعمال بر پایه الگوی mvvm پیاده سازی شده اند؟
بله، تماماً براساس الگوي mvvm پياده سازي شده است. اگر در برنامه ارائه شده دقت كنيد خواهيد ديد كه mainpage.xaml فاقد code behind مي باشد اين در حالي است كه مي توانستيم كدهاي مربوط به رويدادهاي هر يك از كنترل ها را در code behind وارد كرد. اما در اين صورت ديگر از قابليتهاي mvvm pattern محروم مي شديم. همانطور كه ذكر شد از جمله مزاياي اين روش داشتن كد كم، جدا شدن View از code behind بنابراين امكان ایجاد آزمون واحد و نيز امكان تفكيك پروژه بين برنامه نويسان و طراحان UI مي باشد. اما عيب عمده اين كار (به نظر بنده) پيچيدگي بيش از حد برنامه مي باشد. به خصوص براي مبتديان درك و اجراي آن به نظر مشكل مي رسد اما با تمرين و ممارست در استفاده از اين الگو مي توان بر آن این مشکل فائق آمد و مزاياي آن به معايبش مي چربد.

mohamad100000
شنبه 19 مرداد 1392, 11:49 صبح
منابع: پژوهش و نگارش: آقای وحید نصری
این فقط یک انتقاد از جناب مهندس است، امیدوارم به گوششون برسه


کاش آقای نصیری که اینقد به نویسندگی و توزیع علم علاقه دارند، یه خورده صبور بودند،
عزیز من کارت درسته، دمت گرم که اینقد آپدیتی، اما اینجوری آموزش دادن جوابگوی عام نیست
اگه می خوای یه منبع مطمن و آموزشی بدی بیرون مثلا توی الگوی mvvm که معرفی کردی ابتدا بیا
رابط های InotifyPeropertyChanged و Icommand رو بصورت کامل بهم معرفی کن که قورتش بدم و اصولشو یادبگیرم، بعدش که فهمیمدم چی به چیه اونوقت یه مثال ساده بزن که بتونم مطالبو طبقه بندی کنم.
ایشون در نویسندگی هیچ علاقه ای به سطح علمی خواننده نشون نمیدن و خواننده رو هم سطح خودشون تصور می کنن.
من از ایشون تقاضا دارم:
1- با توجه به سطح علمشون
2- با توجه به علاقه ایشون در نویسندگی
3- با توجه به کمبود منابع فارسی زبان به روز
4- با توجه به علوم برنامه نویسی که امروز یه سبک داری کار می کنی فردا منسوخ شده
و...
کمک کنن و با حوصله و دقت بیشتر در زمینه های مختلف کتاب هایی بصورت مرجع کامل بنویسن،و اونا رو از طریق یک انشارات به چاپ برسونن
برای خواندن یک کتاب جامع و به روز هر چقد هزینه کنی ارزشمنده
و برای یک کتاب که قدرت طبقه بندی و یادیگری مطالب رو در ذهن خواننده نداشته باشد ، فقط زمان رو + انگیزه یادگیری اون مبحث رو از دست خواهی داد.

piroozman
شنبه 19 مرداد 1392, 19:44 عصر
شما خودت این کتاب رو مطالعه کردید؟ من نمی خوام از نویسنده کتاب دفاع کنم. اما فکر می کنم شما هم کمی بی انصافی می کنید. به هر شکل کتابی که بخواهد به صورت رایگان در اختیار دیگران قرار بگیره لزومی نداره که خیلی جامع و کامل باشه همین که مطالب رو برسونه کافیه. هر چند ایشون در کتاب خود در خصوص این الگو مثال هایی رو هم اوورده که اگر مطالعه می کردید بد نبود. در ضمن بعضی وقتا برای قورت دادن باید خودت لغمه ات رو پیدا کنی. با این وجود اگر در امضاء ها دقت کرده باشی خواهی دید که یک مثال برای قورت دادن امثال شما وجود داره. موفق و موید باشید