Model View View-Model XAML va .NET tillarini ishlatadigan .NET platformalaridagi voqealarga asoslangan dasturlarni, xususan, Windows Presentation Foundation (WPF) va Silverlightni qo'llab-quvvatlaydigan UI ishlab chiqarish platformalarini maqsadlash uchun Microsoft tomonidan ishlab chiqilgan. Ko'p yillar davomida burchak, naqqosh va ExtJS kabi ko'plab Javascript ramkalar modelni qabul qildi.
Ko'pgina dasturiy ta'minot naqshlari kabi, MVVM ham o'z maqsadiga muvofiq foydalanadi va uni buzadi. Qanday sharoitlarda MVVM foydalanish muvofiq? Xo'sh qachon maslahat berilmaydi?
MVVM is intended to be used where complex user interactions using high-fidelity UI's are needed (i.e. WPF).
MVVM "zamonaviy" ishlab chiquvchilar platformasida ("Windows Presentation Foundation", "WPF" va "Silverlight") ishlab chiqilgan bo'lib, unda "an'anaviy" ishlab chiquvchidan farqli talablarga ega foydalanuvchi tajribasi (UXi) ishlab chiqaruvchisi mavjud (masalan, biznes mantiqiy va orqa so'nggi rivojlanish). MVVM ning "View-Model" asosan "steroidlarda qiymat o'zgaruvchisi" dir, ya'ni View-Model modeldagi ma'lumotlar moslamalarini ochish uchun mas'ul bo'lib, bu ob'ektlar osonlik bilan boshqariladi va iste'mol qilinadi. Shu nuqtai nazardan, View-Model modellashtirilganidan ko'ra ko'proq Modeldir va agar View ning butun ekran mantig'i emas, aksariyatini boshqaradi.
MVVM WPF-da o'ziga xos funktsiyalardan foydalanish uchun mo'ljallangan View layer rivojlanishining qolgan qismlaridan ajratilishini osonlashtiradi ko'rinishdan deyarli barcha "kod-orti" ni olib tashlash yo'li qatlam. Interaktiv Dizaynerlar View ni yozishni talab qilish o'rniga kodi, ular mahalliy WPF formatlash tilini XAML dan foydalanishi va yaratishi mumkin ViewModel-ga bog'langan va yozib olingan dastur ishlab chiquvchilar. Rollarni ajratish interaktivlikka imkon beradi Dizaynerlar programma yoki biznes o'rniga UXga e'tibor berishlari kerak mantiqiy, dasturning qatlamlarini ishlab chiqishga imkon beradi bir nechta ish oqimi.
UI uchun bunday boy muloqotga muhtoj bo'lmagan joyda, MVVM juda ko'p bo'lishi mumkin; MVP ko'proq tabiiy tanlov bo'lishi mumkin. Veb-ilovalar uchun MVC yaxshi moslashtirilgan. Hech qachon kattaroq (kichik Winforms utilities kabi) o'sib chiqadigan juda kichik ilovalar uchun kod orqasi etarli.
Ba'zida MVVM tuzoq bo'lishi mumkin. Mening tajribamdan CRUD-shunga o'xshash ilovalarga (ma'lumotlarni shakllar bo'yicha) ko'proq vazifaga yo'naltirilgan UI-larga qarshidir. Men dasturning orqa qismidagi/boshqalar uchun yomon me'morchilikni nazarda tutmayman, lekin "DDD light" me'morchiligi bilan juda ko'p MVVM ilovalarini ko'rganman. Nimaga bog'lanish juda oson ekanligi va nima uchun ORM va MVVM/Binding bilan POCO/Anemic domen ob'ektlarini qo'llashni o'rnatish juda oson.
MVVM kam ma'lumotli ulanish qatlamlari uchun tarmoqli yordamdir. Xususan, WPF/XAML da ma'lumotlar ulashda cheklovlar tufayli WPF/silverlight/WP7 dunyosida juda ko'p foydalanishni ko'rgan.
Bundan buyon men WPF/XAML haqida gapirayotganimizni taxmin qilmoqchiman, chunki bu narsalarni yanada aniqroq qiladi. MVVM ning WPF/XAML da hal qilish uchun qo'yadigan kamchiliklarini ko'rib chiqaylik.
Data shakli va UI shakli
MVVM'dagi 'VM' XAML da belgilangan bir qator taqdimot moslamalarini to'plash uchun C # da belgilangan ob'ektlar majmuasini yaratadi. Ushbu C # moslamalarni odatda XAMLga DataContext xususiyatlari orqali taqdimot moslamalarini ulanadi.
Natijada, viewmodel ob'ektlar grafigi ilovangizning taqdimot obyekti grafigida xaritalanishi kerak. Bu, xaritalashning bemalol bo'lishi kerakligini ta'kidlamaslik kerak, lekin agar ro'yxatni boshqarish oynani boshqarishda bo'lsa, deraza DataContext ob'ektidan ushbu ro'yxatning ma'lumotlarini ta'riflaydigan ob'ektga ega bo'lishning yo'li bo'lishi kerak.
Viewmodel ob'ekt grafigi, model obyektlari grafiğini ui ob'ektlar grafigidan muvaffaqiyatli o'zgartiradi, lekin tuzilishi va saqlanishi kerak bo'lgan qo'shimcha viewmodel qatlami hisobidan.
Agar men A ekranidan B ekraniga ba'zi ma'lumotlarni ko'chirmoqchi bo'lsam, viewmodels bilan gaplashishim kerak. Biznes odamning fikriga ko'ra, bu UI o'zgarishi. faqat XAML dunyosida bo'lishi kerak. Afsuski, bu kamdan-kam hollarda. Afsuski, viewmodels qanday tuzilganiga va ma'lumotlar qanchalik o'zgarganiga qarab, bu o'zgarishlarni amalga oshirish uchun ma'lumotni qayta yo'naltirishning deyarli bir qismi talab qilinishi mumkin.
Unexpressive ma'lumotlarga ulanishda ishlash
WPF/XAML bog'lanishlari etarli darajada ifodalanmagan. Siz, asosan, ob'ektga, yo'lga o'tish uchun mulkka yo'l berishga va ma'lumotlar moslamasining qiymatini taqdim etish ob'ektini talab qiladigan narsaga moslash uchun ulashadigan konvertorlarga yo'l berishingiz mumkin.
Agar siz C # -dan mulkni boshqa narsalarga qaraganda murakkabroq bog'lashingiz kerak bo'lsa, siz asosan omadsizsiz. Men hech qachon WPF dasturini hech qachon haqiqiy/noto'gri Visible/Collapsed ko'rinishiga aylantiruvchi konvertorisiz ko'rmaganman. Ko'pgina WPF ilovalari, shuningdek, NegatingVisibilityConverter yoki shunga o'xshash biror narsaga ega bo'lishga moyildir. Bu signalni qo'ng'iroqlarni o'chirib qo'yish kerak.
MVVM sizga ushbu cheklovni yumshatish uchun ishlatilishi mumkin bo'lgan C # kodini tuzish bo'yicha ko'rsatmalar beradi. SomeButtonVisibility deb atalgan viewmodel xususiyatini ochishingiz va shu tugmani ko'rishga bog'lashingiz mumkin. Sizning xamlingiz yaxshi va yoqimlidir ... lekin siz o'zingizni o'zingizning xizmatchisiga aylantirdingiz, endi siz UI rivojlanishi bilan siz ikkita joyda (UI va C # kodlari) yangiliklarni joylashtirishingiz kerak. Agar siz boshqa ekranga kirish uchun bir xil tugma kerak bo'lsa, siz ekranga o'xshash xususiyatni ushbu ekranga kirishga ruxsat berishingiz kerak. Afsuski, men XAMLga qaramasdan va tugma endi ko'rinadiganini ko'rmayman. Bindings biroz nostermik holga kelishi bilanoq, men C # kodidagi detektiv ishni bajarishim kerak.
Ma'lumotlar odatda DataContext xususiyatlari orqali foydalanuvchi interfeysiga kirganligi sababli, global yoki sessiya ma'lumotlarini ilovangiz davomida izchil ravishda ko'rsatish qiyin.
«Hozirda kirib kelgan foydalanuvchi» g'oyasi ajoyib misoldir - bu sizning ilovangizning misolida ko'pincha haqiqatan ham global narsa. WPF/XAML tizimida mavjud bo'lgan foydalanuvchilarga izchil ravishda global kirishni ta'minlash juda qiyin.
Nima qilishni xohlasam, "CurrentUser" so'zini ma'lumotni bog'lashda hozirda kirgan foydalanuvchiga murojaat qilish uchun erkin foydalaning. Buning o'rniga, har bir har DataContext'in menga joriy foydalanuvchi ob'ektini olish uchun bir yo'l beradi ishonch hosil qilish kerak. MVVM bularni moslashtirishi mumkin, ammo viewmodels bu global ma'lumotlarga kirishni ta'minlashi kerak, chunki ular allaqachon buzilib ketadi.
Do'stlaringiz bilan baham: |