MVVM, היא תבנית עיצוב שממבט ראשון, מסבכת מאד את הפיתוח. אבל ממבט שני, אין כמוה...
בתכנות המסורתי, למשל WinForms, מעצבים את הטפסים, הלחצנים, תיבות הטקסט וכו', ומצמידים לכל פקד אירועים: לחיצה על buttone1, מגדירה textBox1.Value = "hello world.
אם אני רוצה לעשות טסט שהקוד עובד כמצופה? אני צריך להריץ את הפרוייקט, ללחוץ על הכפתור, ולקבל את התוצאה בדוגמא לעיל, זה לא נורא. אבל אם יש לי קוד מורכב, עם עיבודי נתונים מסובכים? מעצבן מאד להריץ בכל פעם את האפליקציה, לעבוד דרך כל המסכים עד שמשחזרים את מצב הבדיקה!
זה באה לפתור תבנית MVVM. אין יותר כזה דבר לערבב קוד עם UI! הקוד מופרד לגמרי מהתצוגה, ולא מכיר אותה בכלל!
הנה דוגמא פשוטה: אני רוצה לפתח אפליקציה, שהמשתמש מזין שם משתמש וסיסמא, האפליקציה מתחברת לdataBase של בנק הפועלים, ומציגה את התנועות האחרונות בחשבון הבנק. בWinForms, את כל הלוגיקה כותבים בתוך הטופס, שנקרא לו BankForm. בטופס יש תיבת טקסט UserName, תיבת טקסט Password, ולחצן login. לחיצה על הלחצן, שולחת אל הבנק את ערך תיבות הטקסט, ואז הבנק מחזיר את הנתונים, או מספר שגיאה.
בMVVM, כל הלוגיקה כתובה בתוך מחלקה שנקרא לו BankViewModel. למחלקה, יש פרופרטי UserName ופרופרטי Password ומתודה בשם Login. את כל המידע שהבנק מחזיר, המחלקה חושפת כפרופרטיז. המחלקה הזו, יש בה רק קוד, בלי שום UI. אני יכול לעשות לה טסטים באמצעות UnitText, ולדבג אותה כרצוני.
בנפרד מהמחלקה הזו, יש טופס שנקרא BandView, שמלבישים אותו על המחלקה BankViewModel. תיבות הטקסט של הטופס, מולבשות על הפרופרטיז, והלחצנים מולבשים על המתודות של המחלקה.
פשוט ומבריק! אם אני רוצה להוסיף גם אפשרות להתקשר לבנק בטלפון, להקיש את הסיסמא ולקבל נתונים על חשבון הבנק [כפי שכולנו עושים מפעם לפעם], אני פשוט צריך לכתוב מחלקה BankPhone, שגם היא תתלבש על המחלקה BankViewModel.
בכוונה הזכרתי את האפשרות להוסיף את BankPhone, כי זה ממצה את הרעיון של MVVM. ממשק המשתמש, הוא לבוש. בתוך הלבוש יש את הלוגיקה, שהיא הנשמה. הנשמה, לא מכירה את הלבוש החיצוני. אפשר לקחת את הנשמה, ולהלביש עליה כמה לבושים: פניה לבנק דרך האפליקציה, פניה טלפונית, דרך אתר אינטרנט וכו'.
איך מיישמים זאת בפועל? בהמשך.
 |
|
|