MVC və MVVM arasındakı fərq nədir?

Standart "Model View Controller" şablonu və Microsoft Model / View / ViewModel şablonu arasında fərq varmı?

1154
20 марта '09 в 23:09 2009-03-20 23:09 Bjorn Reppen 20 Mart 'da 23:09' də soruşdu . 2009-03-20 23:09
@ 22 cavab

MVC / MVVM deyil / və ya bir seçim.

İki nümunə həm ASP.Net, həm də Silverlight / WPF-də fərqlənir.

ASP.Net üçün MVVM, fikirlərdə iki yollu məlumat bağlama üçün istifadə olunur. Bu, adətən, bir müştərinin tətbiqidir (məsələn, Knockout.js istifadə). Digər tərəfdən, MVC, server tərəfində problemləri bölüşmək üçün bir yoldur.

Silverlight və WPF üçün, MVVM şablonu daha çox əhatə edir və MVC (və ya digər proqram təminatı şablonlarının ayrı vəzifələri üçün əvəz edilməsi) kimi fəaliyyət göstərə bilər. Tez-tez bu şablonu tərk edən fərziyyələrdən biri ViewModel sadəcə MVC də nəzarətçini əvəz etməsi idi (sanki VM i qısaldılmış formada VM əvəz edə bilər və hər şey əfv olunacaq).

ViewModel mütləq ayrı nəzarətçilərə olan ehtiyacları əvəz etmir.

Problem müstəqil sınaq üçün * və xüsusilə zəruri hallarda təkrar istifadə edildikdə, nümayəndəlik modeli hansı görünüşün təmsil olunduğunu bilmir, amma daha vacib olaraq, onun məlumatlarının harada olduğu barədə heç bir fikri yoxdur.

* Qeyd: praktikada, nəzarətçilər vahid testi tələb edən ViewModel-dən məntiqin əksəriyyətini aradan qaldırırlar. Sonra virtual maşın, sanki bir konteyner olur, bu isə az test tələb edir. Bu, yaxşı bir şeydir, çünki virtual maşın dizayner və kodlayıcı arasında bir körpüdür, ona görə də sadə olmalıdır.

Hətta MVVM-də, nəzarətçilər, bir qayda olaraq, bütün emal məntiqini ehtiva edir və hansı məlumatların nümayiş olunacağını müəyyənləşdirir, hansı ki modelləri istifadə edən görünüşlər istifadə olunur.

Bu günə qədər gördüklərimizdən, ViewModel şablonunun əsas üstünlüyü XAML-ni daha müstəqil tapşırığı dəyişdirmək üçün XAML kodundan çıxarmaqdır. Biz hələ də lazım olan və zamanlarda tətbiqetmələrin ümumi mantığını idarə etmək üçün nəzarətçiləri yaradırıq (puns olmadan).

MVCVM-in əsas təlimatları aşağıdakılardır:

  • Görünüşlər xüsusi bir forma təqdim edir. Məlumatların nereden geldiğini bilmirlər.
  • ViewModels xüsusi məlumat və əmr formalarını ehtiva edir, onlar məlumatın və ya kodun nereden gəldiyini və ya necə göstərildiyini bilmirlər.
  • Modellər faktiki məlumatları ehtiva edir (müxtəlif kontekstlər, depolar və ya digər üsullar).
  • Controllers hadisələri dinləyin və dərc edin. Nəzarətçilər hansı məlumatların göründüyü və harada olduğunu nəzarət edən məntiq təqdim edirlər. Controllers ViewModel üçün əmr kodu təmin edir, belə ki ViewModel həqiqətən yenidən istifadə olunur.

Biz həmçinin heykəltəraşlıq kodlu nəsil quruluşu MVVM və prizma ilə oxşar bir nümunə tətbiq etdiyini və bütün istifadə məntiqini ayırmaq üçün nəzarətçiləri geniş şəkildə istifadə etdiyini qeyd etdik.

Görünüş modelləri ilə nəzarət edənlər köhnəlir.

Mən bu mövzu ilə bağlı bir bloga başladım. Mən bunu nə vaxt və nə vaxt edəcəyimi əlavə edəcəyəm . MVCVM-nin ümumi naviqasiya sistemləri ilə birləşməsi ilə bağlı problemlər var, çünki naviqasiya sistemlərinin əksəriyyəti Baxış və VM-ni sadəcə istifadə edir, amma daha sonra bu məqalələrdə dərc edəcəyəm.

MVCVM modelinin istifadəsinin əlavə üstünlüyü tətbiqin bütün xidmət müddəti ərzində yalnız nəzarət obyektlərinin olması və nəzarətçilər əsasən kod və kiçik dövlət məlumatları (məsələn, kiçik yaddaş yığımı) daxildir. Bu, böyük ölçüdə yaddaş tələb edən proqramların sayını əhəmiyyətli dərəcədə azaldır ki, bu da görüntü modelini saxlamaq üçün lazım olan həllərdən və müəyyən növ mobil tətbiqlər üçün idealdır (məsələn, Silverlight / Prism / MEF istifadə edərək, Windows Mobile). Əlbəttə ki, tətbiqin növündən asılıdır, hətta hələlik ayrı-ayrı cached virtual maşınları saxlamaq lazımdır.

Qeyd Bu mesaj çox dəfə düzəldilmişdir və xüsusilə də bu dar məsələ üçün nəzərdə tutulmamışdır, buna görə ilk hissəni onu əhatə edirəm. Aşağıdakı şərhlərdə müzakirə çoxu yalnız ASP.Net üçün tətbiq edilir və daha böyük şəkil deyil. Bu mesaj Silverlight, WPF və ASP.Net-də MVVM-in istifadəsini artırmaq və PeopleModels ilə nəzarətçiləri əvəz edən insanların qarşısını almaq üçün nəzərdə tutulmuşdur.

600
22 авг. Cavab Gone Coding verilir 22 aug. 2010-08-22 12:19 '10 at 12:19 2010-08-22 12:19

Hesab edirəm ki, bu abbreviatura nə deməkdir anlamaq üçün ən asan yol bir an üçün onlar haqqında unutmaqdır. Bunun əvəzinə, hər birinin yaratdıqları proqramı düşünün. Bu, həqiqətən, erkən bir veb-sayt və masa üstü arasında fərqə düşür.

İlk kronik, MVC, İnternetdə ortaya çıxdı. (Bəli, bəlkə əvvəllər idi, ancaq Internetdə bu, veb-geliştiricilerin kütlələri üçün necə məşhurlaşdı.) Bir verilənlər bazası, HTML səhifələr və aralıq kodu düşünün. MVC-ə gəlmək üçün bunu bir qədər aydınlaşdırsın: "verilənlər bazası" üçün veritabanı kodu və interfeysdən istifadə edək. "HTML pages" üçün, HTML şablonları və şablon emal kodu etibarlıdır. "Inbetween code" üçün, istifadəçi kliklərinin kodlaşdırma əməliyyatları vergilərə təsir göstərə biləcəyini varsayarız ki, bu da mütləq başqa bir növü göstərməyə səbəb olur. Ən azı bu müqayisənin məqsədi nədir.

Bu web materialının bir xüsusiyyəti bu günkü kimi deyil, ancaq on il bundan əvvəl olduğu kimi, JavaScript həqiqətən proqramçıların bu işi yaxşı gördüyü təvazökar, hörmətli bir narahatlıq olduğunda qaldığına görə: HTML səhifəsi əsasən darıxdırıcı və passivdir. Bir brauzer nazik müştəridir və ya, üstünlük əldə etsəniz, pis bir müştəri. Brauzerin heç bir fikri yoxdur. Tam səhifə yenidən yüklə. "View" hər dəfə yenidən yaranır.

Bütün qəzəbinə baxmayaraq, bu web yolunun masa üstü kompüterlə müqayisədə olduqca geridə qaldığını unutmayın. Istədiyiniz halda masaüstü proqramları yağ müştəriləri və zəngin müştərilərdir. (Microsoft Word kimi bir proqram belə bir müştəri növü, sənədlər üçün müştəri kimi baxıla bilər). Bunlar müştərilərin məlumatları ilə dolu zəkaya doludur. Onlar məhdudlaşdırılır. Onlar yaddaşda işləyən məlumatları önbelleğe alırlar. Tam səhifə yenidən yüklənməsinə bənzəyir.

Və bu zəngin masa üstü yəqin ki, ikinci abbreviaturadır MVVM çıxdı. Məktublar, aldatma ilə aldanmayın, nəzarətçilər hələ də var. Onlar olmalıdır. Heç bir şey silinməz. Biz sadəcə bir şey əlavə edirik: dövlət, müştəriyə məlumatların yığılması (və bu məlumatları emal etmək üçün kəşfiyyat). Bu məlumat, əsasən, müştəridə olan önbellek, indi "ViewModel" adlanır. Zəngin interaktivliyə imkan verən bu. Və budur.

border=0
  • MVC = model, nəzarətçi, görünüş = əsasən bir istiqamətdə ünsiyyət = aşağı interaktivlik
  • MVVM = model, nəzarətçi, önbellek, görünüş = iki yönlü kommunikasiya = zəngin interaktivlik

Görürük ki, Flash, Silverlight və ən başlıcası, JavaScript istifadə edərək, veb-interfeys MVVM-ni əhatə edir. Brauzerlər artıq qanuni olaraq nazik müştərilər deyilə bilməz. Onların programlanmasına baxın. Onların yaddaş istehlakına baxın. Javascriptin bütün interaktivliyini müasir veb səhifələrə baxın.

Şəxsən düşünürəm ki, bu nəzəriyyə və biznesin kısaltması konkret reallıqda nəzərdə tutulanlara baxaraq anlamaq daha asandır. Xülasə konsepsiyaları xüsusilə müəyyən bir material üzərində nümayiş olunduqda faydalıdır, belə ki anlayış tam dairəyə sahib ola bilər.

222
13 февр. Cavab Lumi 13 fevralda verilir. 2013-02-13 17:11 '13 'da 17:11' də 2013-02-13 17:11

MVVM Model-View ViewModel MVC, Model-View Controller ilə bənzərdir

Controller ViewModel ilə əvəz olunur. ViewModel istifadəçi interfeysi səviyyəsinin altındadır. ViewModel, görünüş üçün lazım olan məlumat obyektləri və əmrləri təmin edir. Bunu, məlumatları və hərəkətləri barədə bir fikir sahibi olan bir konteyner olaraq düşünə bilərsiniz. ViewModel modeldən məlumatları alır.

Russel Şərq MVVM-in MVC-dən fərqli olduğunu nəşrə daha ətraflı müzakirə edir

167
20 марта '09 в 23:18 2009-03-20 23:18 Cavab TStamper tərəfindən 20 Mart 'da 23:18' də verildi. 2009-03-20 23:18

Birincisi, MVVM ekranı idarə etmək üçün XAML istifadə edən MVC modelinin inkişafıdır. Bu yazıda bu ikisinin bir çox aspektləri təsvir edilmişdir.

Model / View / ViewModel arxitekturasının əsas məqsədi data ("Model") üzərində məlumatın təqdimat konsepsiyalarına daha çox bağlı olan məlumatların konsepsiyalarını əks etdirən qeyri-vizual komponentlərin ("ViewModel") bir qatının olmasıdır Görünüş "). Görünüşün bağlı olduğu ViewModel, modeli birbaşa deyil.

86
20 марта '09 в 23:17 2009-03-20 23:17 Chris Ballance tərəfindən verilən cavab 20 Mart 'da 23:17' da 2009-03-20 23:17

Windows ortamında MVVM modelinin bir izahını görə bilərsiniz:

Model-View-ViewModel dizayn modelində tətbiqi üç ümumi komponentdən ibarətdir. 2019

45
12 июня '13 в 23:48 2013-06-12 23:48 Cavab 12 iyun 2013-cü il saat 23: 00-da verilir. 2013-06-12 23:48

Məncə əsas fərqlərdən biri MVC-də sizin M-nin birbaşa M-i oxuduğunu və məlumatları idarə etmək üçün C-dən keçdiyini düşündüm. MVVM-də virtual maşın M-proxy kimi fəaliyyət göstərir və sizin üçün mövcud funksionallığı təmin edir.

Mən zibil dolu deyiləmsə, heç kimin virtual maşınınızın bir proxy server M olduğu bir hibrid yaratdığını və C bütün funksiyaları təmin etdiyini təəccüb edirəm.

39
21 мая '10 в 14:38 2010-05-21 14:38 George R 21 may '10 saat 14: 38-də cavab verib 2010-05-21 14:38

Sadə fərq: (Yaakov Coursera AngularJS kursundan ilhamlandı)

2019

14 дек. Cavab Pritam Banerjee 14 dekabr. 2016-12-14 03:20 '16 'da 3:20' də 2016-12-14 03:20 'də

MVVM təqdimat modeli nümunəsinin zərifliyi (müzakirə). Mübahisə edirəm, çünki yalnız fərq WPF məlumatların bağlanması və əmr prosesinin yerinə yetirilməsini təmin edir.

17
28 марта '09 в 0:22 2009-03-28 00:22 cavab martın 28-də '09 'da 0:22' da verilmişdir 2009-03-28 00:22

ViewModel istifadəçi interfeysi elementləri üçün "abstrakt" bir modeldir. Göründüyü kimi görünməz şəkildə (məsələn, test etmək üçün) əmr və əməllər yerinə yetirməyə imkan verməlidir.

MVC ilə işlədiyiniz halda, ehtimal ki, görünüşünüzün vəziyyətini əks etdirmək üçün model obyektləri yaratmaq faydalıdır, məsələn, bəzi redaktə məlumat qutularını göstərmək və gizlətmək. Bu halda, görünüş modelini istifadə edirsiniz.

MVVM şablonu bütün interfeys elementləri üçün sadəcə bu təcrübənin xülasəsidir.

Və bu, Microsoft şablonu deyildir ki, WPF / Silverlight data bağlamaları xüsusilə bu şablonla işləmək üçün uyğun gəlir. Lakin heç bir şey java sərhəd faylları ilə istifadə etməyə mane olur. Məsələn:

13
23 марта '10 в 13:16 2010-03-23 13:16 Cavab DaniCE 23 mart 'da 10 Mart 2010 tarixində 13:16' də verildi

MVC nəzarət mühitidir və MVVM reaktiv mühitdir.

Kontrollü mühitdə daha az kod və ümumi bir məntiq qaynağı olmalıdır; həmişə nəzarətçi daxilində olmalıdır. Lakin; İnternet dünyasında MVC asanlıqla fikir yaradan məntiqə bölünür və dinamik məntiqə baxır. Yaratma server üzərində yaşayır və dinamik şəkildə müştəri üzərində yaşayır. Sunucunun görünüşü yaratmaq və ötürmək və müştəriyə göndərmək edərkən, bu ASP.NET MVC ilə AngularJS birləşməsi ilə bir çox görürsünüz. Müştəri daha sonra görünüşü ilə qarşılıqlı fəaliyyət göstərir, bu halda AngularJS yerli nəzarətçi kimi daxil olur. Model və ya yeni modeli göndərdikdən sonra server nəzarətçi qaytarılır və işlənir. (Beləliklə, dövr davam edir və sockets və ya AJAX, və s. İlə işləyərkən bu prosesin bir çox digər tərcümələri var, amma memarlıq boyunca eynidır.)

MVVM reaktiv bir mühitdir, yəni bir hadisəyə əsasən aktivləşdirilən kodu (məsələn, tetikleyiciler) yazırsınız. MVVM-nin inkişaf etdiyi XAML-də bütün bunlar daxili bir məlumat bağlama quruluşu ilə asandır. AMA, artıq qeyd olunduğu kimi, istənilən proqramlaşdırma ilə hər hansı bir sistemlə işləyəcəkdir. MS MS-dən asılı deyil. ViewModel (adətən, mülk dəyişikliyinə malik bir hadisə) çalışır və Baxış yaratdığınız tetikleyiciler əsasında ona cavab verir. Bu texniki ola bilər, amma alt xətt dövlət olmadan və məntiqsiz bir görünüşdür. Bu, sadəcə dəyərlərə əsaslanan dövləti dəyişir. Bundan əlavə, ViewModels çox az mantıksız vatansızdır və modellər sıfır məntiq mantığı olan dövlətdir, çünki onlar yalnız dövləti dəstəkləməlidirlər. Mən bunu bir tətbiq dövlət (model), bir dövlət tərcüməçisi (ViewModel), sonra görsel dövlət / qarşılıqlı (baxış) kimi təsvir edirəm.

MVC masa üstü tətbiqində və ya müştəri tərəfində modeliniz olmalıdır və model nəzarətçi tərəfindən istifadə edilməlidir. Modelə əsasən nəzarətçi təqdimatı dəyişəcək. Baxışlar adətən interfeyslər olan nəzarətçilərlə əlaqələndirilir, buna görə nəzarətçi fərqli görünüşlərlə işləyə bilər. ASP.NET-də, MVC üçün məntiq serverdən bir az geridə qalır, çünki nəzarətçi modelləri idarə edir və Modelləri seçilmiş görünüşə ötürür. Görünüş sonra modelə əsaslanan məlumatlarla doldurulur və öz məntiqinə (ümumiyyətlə, başqa bir MVC dəsti, məsələn, AngularJS istifadə edilir) malikdir. İnsanlar mübahisə edəcək və MVC proqramı ilə qarışdırılacaq və hər ikisini də etməyə çalışacaq və bu nöqtədə layihə üçün dəstək nəticədə bir fəlakət olacaq. MVC istifadə edərkən həmişə məntiq və nəzarət bir yerdə qoydu. Görünüş məntiqini nəzarətçi və ya model məlumatları yerləşdirmək üçün Görünüşün (və ya İnternet üçün JS baxımından) arxasına yazmayın. Denetleyicinin sunumu değiştirmesine izin verin. Təqdimatda yaşamaq üçün lazım olan yeganə məntiq, istifadə edilən interfeysdən yaranmaq və işləmək üçün tələb olunan şeydir. Bunun bir nümunəsi bir istifadəçi adı və şifrə girir. Masaüstü və ya veb səhifəsi (müştəri haqqında) "Görüntüləmə" "Göndər" işini başlatdıqda nəzarətçi göndərmə prosesini işləməlidir. Düzgün işlər görsəniz, həmişə MVC veb-saytında və ya yerli proqram vasitəsilə yolunuzu asanlıqla tapa bilərsiniz.

MVVM tamamilə reaktiv olduğu üçün şəxsən mənim sevimli. Modeli dəyişirsə, ViewModel bu vəziyyəti dinləyir və tərcümə edir və bunun !!! Viewer daha sonra ViewModel-dən dövlətin dəyişdirilməsi və həmçinin ViewModel-dən tərcüməə əsaslanan yenilikləri dinləmək üçün dinləyir. Bəzi insanlar saf MVVM adlandırırlar, amma həqiqətən yalnız birdir və mənim necə iddia etdiyin umurumda deyil və həmişə Pure MVVM.

Burada kiçik bir nümunə: Bir düyməni basaraq menyunu aktivləşdirməsini istəyirik. MVC-də interfeysinizdə MenuPressed bir fəaliyyətiniz olacaq. Nəzarətçi, "Menyu" düyməsini tıkladığınızda və SlideMenuIn kimi başqa bir interfeys metoduna əsaslanan menyuda slayda "View" deyəcəyini biləcək. Nədənsə gəzinti gəzintisi? Nəzarətçi, nəyə görə başqa bir şey edə bilməyəcəyini və ya başqa bir şey etmək istəmədiyini anlayır. Nəzarətçi görünməməsi üçün məsuliyyət daşıyır, əgər nəzarətçi belə deyirsə, heç bir şey etməz. Hələ də; в MVVM меню слайдов в анимации должно быть встроено и универсально, и вместо того, чтобы говорить, чтобы сместить его, сделайте это на основе некоторого значения. Поэтому он прослушивает ViewModel, и когда ViewModel говорит, IsMenuActive = true (или, тем не менее), анимация для этого происходит. Теперь, когда я сказал, что хочу сделать еще один пункт ДЕЙСТВИТЕЛЬНО ЧИСТИТЬ и ПОЖАЛУЙСТА, обратите внимание. IsMenuActive - это, вероятно, BAD MVVM или дизайн ViewModel. При проектировании ViewModel вы никогда не должны предполагать, что представление будет иметь какие-либо функции вообще и просто передать состояние переведенной модели. Таким образом, если вы решите изменить свой вид, чтобы удалить меню, и просто показать данные/параметры по-другому, ViewModel не волнует. Итак, как бы вы управляли меню? Когда данные имеют смысл, как. Таким образом, один из способов сделать это - предоставить меню список опций (возможно, массив внутренних ViewModels). Если в этом списке есть данные, Меню затем знает, что нужно открыть через триггер, если нет, то он знает, что нужно скрыть триггер. У вас просто есть данные для меню или нет в ViewModel. НЕ решайте показывать/скрывать эти данные в ViewModel.. просто переведите состояние модели. Таким образом, представление является полностью реактивным и универсальным и может использоваться во многих разных ситуациях.