MVP ve MVC nedir ve fark nedir?


2133

RAD (sürükle bırak ve yapılandır) yönteminin ötesine bakarken , birçok aracın sizi Model-View-Controller , Model-View-Presenter ve Model-View-ViewModel olarak adlandırılan üç tasarım deseni ile karşılaşma olasılığını teşvik eder . Sorumun üç kısmı var:

  1. Bu kalıplar hangi sorunları ele alıyor?
  2. Nasıl benzerler?
  3. Nasıl farklılar?


2
IDK, ancak orijinal MVC için, küçüklerde kullanılması gerekiyordu. Her düğmenin, etiketin vb kendi görünümü ve denetleyici nesnesi vardı, ya da en azından Bob Amca'nın iddia ettiği şey bu. Sanırım Smalltalk hakkında konuşuyordu. YouTube'daki konuşmalarına bakın, büyüleyici.
still_dreaming_1

MVP, View-Controller'ı bir View ve Presenter'a bölerek fazladan bir
dolaylama

2
Temel fark, MVC'de Kontrolörün Modelden Görünüme herhangi bir veri aktarmamasıdır. Sadece Modelin kendisinden veri alması için Görünüm'ü uyarır. Ancak, MVP'de Görünüm ve Model arasında bağlantı yoktur. Presenter'ın kendisi Modelden gereken tüm verileri alır ve göstermek için Görünüm'e iletir. Tüm mimari desenlerde bir android örneği ile birlikte daha fazlası burada: digigene.com/category/android/android-architecture
Ali Nem

Onlar denir mimari desenleri değil desen tasarım . Aradaki farkı bilmek istiyorsanız, kontrol bu
Hasan El-Hefnawy

Yanıtlar:


1997

Model-View-Presenter

In MVP , Sunucu Görünümü için UI iş mantığı içerir. Görünüm'deki tüm çağrılar doğrudan Sunum Yapan kişiyi temsil eder. Sunucu aynı zamanda doğrudan Görünüm'den ayrılır ve bir arayüz üzerinden konuşur. Bu, birim testinde Görünümün alay edilmesine izin vermek içindir. MVP'nin ortak bir özelliği, çok sayıda iki yönlü sevkiyat olması gerektiğidir. Örneğin, birisi "Kaydet" düğmesini tıkladığında, olay işleyicisi Sunum Yapanın "Kaydetme" yöntemine delege eder. Kaydetme işlemi tamamlandıktan sonra Presenter, Görünüm'ün kaydetme işleminin tamamlandığını görüntüleyebilmesi için arabirimi yoluyla Geri'yi arar.

MVP, Web Formlarında ayrı sunum yapmak için çok doğal bir model olma eğilimindedir. Bunun nedeni, Görünümün her zaman önce ASP.NET çalışma zamanı tarafından oluşturulmasıdır. Her iki değişken hakkında daha fazla bilgi edinebilirsiniz .

İki birincil varyasyon

Pasif Görüş: Görüş mümkün olduğunca aptal ve neredeyse sıfır mantık içeriyor. Sunucu, Görünüm ve Model ile konuşan ortada bir adamdır. Görünüm ve Model birbirinden tamamen korumalıdır. Model etkinlikleri artırabilir, ancak Presenter, Görünümü güncellemek için bunlara abone olur. Pasif Görünüm'de doğrudan veri bağlaması yoktur, bunun yerine Görünüm, Sunum Yapanın verileri ayarlamak için kullandığı ayarlayıcı özelliklerini ortaya çıkarır. Tüm durum Görünüm'de değil Sunumda yönetilir.

  • Pro: maksimum test edilebilirlik yüzeyi; Görünüm ve Modelin temiz bir şekilde ayrılması
  • Con: tüm verileri kendiniz bağladığınız için daha fazla çalışma (örneğin tüm ayarlayıcı özellikleri).

Denetleyici Denetleyici: Sunucu, kullanıcı hareketlerini yönetir. Görünüm, modele doğrudan veri bağlama yoluyla bağlanır. Bu durumda, Sunucunun görevi Modeli ona Görünümden geçirmek böylece ona bağlanabilir. Presenter ayrıca bir düğmeye basma, navigasyon vb. Hareketler için mantık içerecektir.

  • Pro: veri tabanından yararlanarak kod miktarı azalır.
  • Con: daha az test edilebilir yüzey var (veri bağlama nedeniyle) ve Görünümde doğrudan Model ile konuştuğu için daha az kapsülleme var.

Model-View-Controller

In MVC , Kontrolör Görünüm zaman uygulama yükler dahil olmak üzere herhangi bir eylem yanıt olarak gösterilecek olan belirlemekten sorumludur. Bu, eylemlerin Görünüm'den Sunum Yapan kişiye yönlendirildiği MVP'den farklıdır. MVC'de, Görünüm'deki her eylem bir eylemle birlikte bir Denetleyiciye yapılan çağrı ile ilişkilidir. Web'de her eylem, diğer tarafında yanıt veren bir Denetleyici bulunan bir URL'ye bir çağrı içerir. Bu Denetleyici işlemeyi tamamladığında, doğru Görünümü döndürür. Sekans, uygulamanın ömrü boyunca bu şekilde devam eder:

    Görünümdeki İşlem
        -> Denetleyiciye Çağrı
        -> Denetleyici Mantığı
        -> Denetleyici Görünümü döndürür.

MVC ile ilgili bir diğer büyük fark, Görünümün Model'e doğrudan bağlanmamasıdır. Görünümü basitçe oluşturur ve tamamen vatansızdır. MVC uygulamalarında Görünüm genellikle arkadaki kodda herhangi bir mantık içermez. Bu, kesinlikle gerekli olduğu MVP'ye aykırıdır, çünkü Görünüm Sunum Yapan temsilci seçmezse asla çağrılmaz.

Sunum Modeli

Bakılacak diğer bir model de Sunum ModeliDesen. Bu modelde Sunucu yoktur. Bunun yerine Görünüm doğrudan bir Sunum Modeline bağlanır. Sunu Modeli, Görünüm için özel olarak hazırlanmış bir Modeldir. Bu, bu Modelin, endişelerin ayrılmasının ihlali olacağı için bir kişinin bir alan modeline asla koyamayacağı özellikleri gösterebileceği anlamına gelir. Bu durumda, Sunum Modeli etki alanı modeline bağlanır ve bu Modelden gelen etkinliklere abone olabilir. Görünüm daha sonra Sunu Modeli'nden gelen olaylara abone olur ve kendisini buna göre günceller. Sunu Modeli, görünümün eylemleri çağırmak için kullandığı komutları gösterebilir. Bu yaklaşımın avantajı, PM görünümün tüm davranışlarını tamamen kapsadığı için arkadaki kodu tamamen kaldırabilmenizdir.Model-Görünüm-ViewModel .

Sunu Modeli hakkında bir MSDN makalesi ve WPF (eski Prizma) için Kompozit Uygulama Kılavuzu'nda Ayrılmış Sunu Kalıpları hakkında bir bölüm bulunmaktadır.


27
Lütfen bu cümleyi açıklığa kavuşturabilir misiniz? Bu, eylemlerin Görünüm'den Sunum Yapan kişiye yönlendirildiği MVP'den farklıdır. MVC'de, Görünüm'deki her eylem bir eylemle birlikte bir Denetleyiciye yapılan çağrı ile ilişkilidir. Bana göre, aynı şey gibi geliyor, ama eminim farklı bir şey tarif ediyorsun.
Panzercrisis

16
@Panzercrisis Yazarın bu anlama gelip gelmediğinden emin değilim, ama söylemeye çalıştıklarını düşünüyorum. Bu cevap gibi - stackoverflow.com/a/2068/74556 , MVC'de, denetleyici yöntemlerinin davranışlara dayandırıldığı anlamına gelir - başka bir deyişle, birden çok görünümü (ancak aynı davranış) tek bir denetleyiciyle eşleyebilirsiniz. MVP'de, sunumcu görünüme daha yakındır ve genellikle bire bire yakın bir eşleme ile sonuçlanır, yani bir görünüm eylemi karşılık gelen sunum yapan kişinin yöntemiyle eşleşir. Genellikle başka bir görünümün eylemlerini başka bir sunucunun (başka bir görünümden) yöntemiyle eşlemezsiniz.
Dustin Kendall

2
Not MVC gibi sık sık web çerçeveler tarafından kullanılır Laravel(belki kullanıcıları tarafından yapılan) alınan URL istekleri ile işlendiği yerlerde, Controllerve tarafından oluşturulan HTML Viewistemciye gönderilir - So, Viewbir parçasıdır arka uç ve kullanıcı asla doğrudan erişemez ve tam tersi bir yerde yaşıyorsanız bunu bir MVC uzantısı (hatta ihlali) olarak düşünün. @Panzercrisis, Bu MVP( AndroidOS'de kullanılan gibi ) actions route through the View to the Presenterve kullanıcının doğrudan erişime sahip olduğu yerden farklıdır View.
Top-Master

455

Bu, bu tasarım modellerinin birçok varyantının aşırı basitleştirilmesidir, ancak bu ikisi arasındaki farkları düşünmeyi seviyorum.

MVC

MVC

MVP

resim açıklamasını buraya girin


10
Bu, sunum yapan kişinin API'sından herhangi bir GUI ile ilgili (görünümü görüntülemek) soyutlamayı ve tamamen izole edilmesini gösteren şemanın büyük bir tasviridir. Küçük bir nokta: Ana sunucu, görüntüleme başına bir değil, yalnızca bir sunum yapan kişinin bulunduğu yerde kullanılabilir, ancak diyagramınız en temiz olanıdır. MVC / MVP arasındaki en büyük fark, MVP'nin Model nesneleri hakkında herhangi bir bilgiye izin vermemekle birlikte, mevcut 'görünüm durumunu' (görünüm verilerini) görüntülemek dışında herhangi bir şeyi tamamen geçersiz tutmaya çalışmasıdır. Böylece, bu duruma enjekte etmek için orada olması gereken arayüzler.

4
İyi resim. MVP'yi çok kullanıyorum, bu yüzden bir noktaya değinmek istiyorum. Deneyimlerime göre, Sunum Yapanlar birbirleriyle sık sık konuşmalıdır. Aynı şey Modeller (veya İş nesneleri) için de geçerlidir. MVP resminizde olacak olan bu ek "mavi çizgiler" nedeniyle, Presenter-Model ilişkileri oldukça karışabilir. Bu nedenle, bire bir Presenter-Model ilişkisini bire çok karşı tutmaya eğilimliyim. Evet, Model üzerinde bazı ek temsilci yöntemleri gerektirir, ancak Modelin API'sı değişirse veya yeniden düzenleme gerekiyorsa birçok baş ağrısını azaltır.
splungebob

3
MVC örneği yanlış; görünümler ve denetleyiciler arasında sıkı bir 1: 1 ilişki vardır. Tanım olarak, bir kontrolör model için olaylar üretmek ve tek bir kontrol için benzer şekilde görüntülemek için insan hareketi girdisini yorumlar. Daha basit olarak, MVC'nin yalnızca bireysel widget'larla kullanılması amaçlanmıştır. Bir widget, bir görünüm, bir kontrol.
Samuel A.Falvo II

3
@ SamuelA.FalvoII her zaman değil, bir 1: ASP.NET
MVC'deki

4
@StuperUser - Bunu yazarken ne düşündüğümden emin değilim. Tabii ki haklısınız ve yazdıklarıma geri dönüp baktığımda, eklemleyemediğim başka bir bağlamım olup olmadığını merak etmeliyim. Düzeltme için teşekkürler.
Samuel A.Falvo II

421

Bir süre önce bu konuda blog yazdım, Todd Snyder'ın ikisi arasındaki fark üzerine mükemmel gönderisini alıntıladım :

Desenler arasındaki temel farklar şunlardır:

MVP Kalıbı

  • Görünüm modele daha gevşek bağlıdır. Sunum yapan kişi, modeli görünüme bağlamaktan sorumludur.
  • Görünümle etkileşim bir arayüz üzerinden yapıldığı için birim testi daha kolay
  • Genellikle sunucu haritasını bire bir görüntüleyin. Karmaşık görünümlerin çoklu sunumcuları olabilir.

MVC Kalıbı

  • Denetleyici davranışlara dayanır ve görünümler arasında paylaşılabilir
  • Hangi görünümün görüntüleneceğini belirlemekten sorumlu olabilir

Web'de bulabildiğim en iyi açıklama.


15
Her iki durumda da tüm bunları tamamen birbirinden ayırmak olduğunda, görünümde modele nasıl daha fazla veya daha az yakından bağlanabileceğini anlamıyorum. Yanlış bir şey söylediğini ima etmiyorum - ne demek istediğinle ilgili kafan karıştı.
Bill K

18
@pst: MVP ile gerçekten 1 View = 1 Presenter. MVC ile, Controller birden fazla görünümü yönetebilir. Gerçekten bu kadar. "Sekmeler" modeliyle, her sekmenin, tüm sekmeler için tek bir Denetleyici yerine kendi Presenter'ı olduğunu hayal edin.
Jon Limjap

4
Başlangıçta iki tür denetleyici vardır: birden çok görünümde paylaşılmasını söylediğiniz ve özellikle paylaşılan denetleyicinin arabirimini uyarlamak için tasarlanmış görünümlere özgü olanlar.
Acsor

1
@JonLimjap Yine de tek bir görüşle ne anlama geliyor? İOS programlama bağlamında, tek ekranlı mı? Bu iOS'un denetleyicisini MVC'den daha fazla MVP yapıyor mu? (Öte yandan, ekran başına birden fazla iOS denetleyicisine de sahip olabilirsiniz)
huggie

2
Todd'un MVC'nin şematik gösterimi, Görünüm ve Modeli ayrıştırma fikrine tamamen aykırıdır. Şemaya bakarsanız, Model güncellemeleri Görünümü (Modelden Görünüme ok) yazıyor. Hangi evrenin, Modelin Görünümle doğrudan etkileşime girdiği bir sistem olduğu, ayrıştırılmış bir sistem ???
Ash

260

İşte iletişim akışını temsil eden çizimler

resim açıklamasını buraya girin

resim açıklamasını buraya girin


44
MVC diyagramıyla ilgili bir sorum var. Veri almak için görünümün çıktığı kısmı alamıyorum.Kontrolörün gerekli verilerle görünüme yönlendireceğini düşünürdüm.
Brian Rizo

54
Bir kullanıcı bir düğmeyi tıklarsa, bu görünümle nasıl etkileşime girmez? MVC gibi hissediyorum, kullanıcı denetleyicisi daha görünümü ile etkileşim
Jonathan

5
Bu eski bir cevap olduğunu biliyorum - ama kimse @JonathanLeaders noktasında cevap verebilir? Bazı benzersiz kodlama yapmadığınız sürece, Winforms arka planından geliyorum, UI / View'ı tıkladığınızda, başka bir şeyden önce o tıklamayı öğrenir. En azından bildiğim kadarıyla?
Rob P.

6
@RobP. Bu tür tabloların her zaman çok karmaşık veya çok basit olma eğiliminde olduğunu düşünüyorum. MVP şemasının akışı bir MVC uygulaması için de geçerlidir. Dillerin özelliklerine (veri bağlama / gözlemci) bağlı olarak varyasyonlar olabilir, ancak sonunda fikir uygulamanın veri / mantığından ayrıştırılmasıdır.
Luca Fülbier

15
@JonathanLeaders İnsanlar "MVC" derken akıllarında gerçekten farklı şeyler var . Bu grafiği oluşturan kişinin muhtemelen klasik Web MVC'si göz önünde bulundurularak, "kullanıcı girişi" HTTP istekleri ve "kullanıcıya döndürülen görünüm" oluşturulmuş bir HTML sayfasıdır. Bu nedenle, bir kullanıcı ve bir görünüm arasındaki herhangi bir etkileşim, klasik Web MVC uygulamasının bir yazarının bakış açısından "mevcut değildir".
cubuspl42

170

MVP, Görünüm'ün sorumlu olduğu bir senaryo olmak zorunda değildir (örneğin Taligent'in MVP'sine bakın).
İnsanların bunu "sadece bir görünüm" (Pragmatik Programcı) ile çeliştiği için bir anti-paternin aksine hala bir kalıp olarak (sorumlu görüntü) vaaz ettiğini talihsiz buluyorum. "Bu yalnızca bir görünümdür" kullanıcıya gösterilen son görünümün uygulamanın ikincil bir endişesi olduğunu belirtir. Microsoft'un MVP modeli, Görünümlerin yeniden kullanımını çok daha zorlaştırıyor ve Microsoft'un tasarımcısını kötü uygulamaları teşvik etmekten uygun bir şekilde mazur görüyor.

Açıkçası, MVC'nin altında yatan kaygıların herhangi bir MVP uygulaması için geçerli olduğunu düşünüyorum ve farklılıklar neredeyse tamamen anlamlıdır. Görünüm (verileri görüntüleyen), denetleyici (kullanıcı etkileşimini başlatan ve kontrol eden) ve model (temeldeki veri ve / veya hizmetler) arasındaki endişelerin ayrılmasını izlediğiniz sürece MVC'nin avantajlarını elde edersiniz . Faydaları elde ediyorsanız, modelinizin MVC, MVP veya Denetleyici Denetleyici olup olmadığını kim gerçekten önemsiyor? Tek gerçek desen MVC olarak kalır, gerisi sadece farklı lezzetlerdir.

Bu farklı uygulamaların birçoğunu kapsamlı bir şekilde listeleyen bu son derece heyecan verici makaleyi düşünün . Hepsinin temelde aynı şeyi yaptığını, ancak biraz farklı olduğunu fark edebilirsiniz.

Şahsen MVP'nin yakın zamanda, bir şeyin gerçekten MVC olup olmadığını savunan semantik bigotlar arasındaki tartışmaları azaltmak veya Microsofts Rapid Application Development araçlarını haklı çıkarmak için akılda kalıcı bir terim olduğunu düşünüyorum. Kitaplarımdaki bu nedenlerin hiçbiri, ayrı bir tasarım deseni olarak varlığını haklı çıkarmıyor.


28
MVC / MVP / MVVM / etc arasındaki farklar hakkında birçok cevap ve blog okudum '. Aslında, işiniz bittiğinde hepsi aynıdır. Arayüzünüzün olup olmadığı ve ayarlayıcı (veya başka bir dil özelliği) kullanıp kullanmadığınız önemli değildir. Bu örüntüler arasındaki farkın, bir kavram meselesinden ziyade, çeşitli çerçeve uygulamalarının farkından kaynaklandığı anlaşılmaktadır.
Michael

6
Ben MVP bir anti-desen demezdim, sonrası "" geri kalan [MVP] dahil [MVC] sadece farklı tatlar vardır .. ", ki MVP bir anti-desen olsaydı, yani MVC idi ... bu sadece farklı bir çerçevenin yaklaşımı için bir lezzet. (Şimdi, bazı belirli MVP uygulamaları , farklı görevler için bazı belirli MVC uygulamalarından daha fazla veya daha az arzu edilebilir ...)

@Quibblsome: “Ben şahsen MVP sadece yakın zamanda bir şey gerçekten MVC olup olmadığını tartışan semantik bigotlar arasındaki argümanları azaltmak için akılda kalıcı bir terim olarak yeniden tanıtıldığını düşünüyorum […] Kitaplarımdaki bu nedenlerin hiçbiri ayrı tasarım deseni. ” . Onu farklı kılmak için yeterince farklı. MVP'de, görünüm önceden tanımlanmış bir arabirimi karşılayan herhangi bir şey olabilir (MVP'de Görünüm bağımsız bir bileşendir). MVC'de, Denetleyici belirli bir görüş için yapılır (eğer ilişkinin kurumları birisinin başka bir terime değdiğini hissettirebilirse).
Hibou57

6
@ Hibou57, MVC'nin görünümü bir arabirim olarak referans göstermesini veya birkaç farklı görünüm için genel bir denetleyici oluşturmasını engelleyecek hiçbir şey yoktur.
Quibblesome

1
Samuel lütfen neden bahsettiğini açıkla. Bana MVC'yi "icat eden" takımın tarihini söylemezseniz, metniniz hakkında inanılmaz derecede şüpheliyim. Sadece WinForm hakkında konuşuyorsanız, o zaman bir şeyler yapmanın başka yolları da var ve ben kontrol bağlarının "bireysel kontroller" değil, kontrolör tarafından yönetildiği WinForm projeleri oluşturdum.
Quibblesome

110

MVP: görünüm sorumlu.

Görünüm, çoğu durumda sunucusunu oluşturur. Sunucu modelle etkileşime girecek ve bir arayüz aracılığıyla görünümü değiştirecektir. Görünüm bazen sunum yapan kişi ile, genellikle bir arayüz aracılığıyla etkileşime girer. Bu uygulamaya dönüşüyor; görünümün sunucudaki yöntemleri çağırmasını veya görünümün, sunucunun dinlediği etkinlikleri olmasını ister misiniz? Şuna bağlı: Görüş, sunum yapan kişiyi biliyor. Görünüm, sunucuya delege verir.

MVC: kontrolör sorumlu.

Denetleyici, bazı olay / isteklere göre oluşturulur veya bunlara erişilir. Daha sonra kontrolör uygun görünümü oluşturur ve görünümü daha fazla yapılandırmak için modelle etkileşime girer. Aşağıya doğru kaynar: denetleyici görünümü oluşturur ve yönetir; görünüm denetleyiciye bağımlıdır. Görünüm denetleyici hakkında bilmiyor.


3
"Görünüm Denetleyici hakkında bilmiyor." Sanırım bu görüşün modelle doğrudan teması yok mu?
Lotus Notes

2
görüş asla daha ürkütücü bir model hakkında bilmemelidir.
Brian Leahy

4
@Brian: “Görünüm, çoğu durumda Sunucuyu oluşturur.” . Sunucunun hem Modeli hem de Görünümü başlatmasıyla çoğunlukla tam tersini gördüm. Görünüm, Sunum Yapan Kişiyi de başlatabilir, ancak bu nokta gerçekten en belirgin değildir. En önemli şey daha sonra ömür boyu olur.
Hibou57

2
Cevabınızı daha fazla açıklamak için düzenlemek isteyebilirsiniz: Görünüm, Denetleyici hakkında bilgi sahibi olmadığından, kullanıcının ekranda gördüğü 'görsel' öğeler (yani Görünüm) üzerinde Denetleyiciye iletilen kullanıcı eylemleri nasıl gerçekleştirilir? ...
Kül

77

resim açıklamasını buraya girin

MVC (Model Görüntüleme Denetleyicisi)

Giriş, görünümde değil, önce Kontrolöre yönlendirilir. Bu girdi, bir sayfa ile etkileşime giren bir kullanıcıdan geliyor olabilir, ancak aynı zamanda tarayıcıya belirli bir url girmek de olabilir. Her iki durumda da, bazı işlevleri başlatmak için arayüzlü bir Denetleyici. Denetleyici ile Görünüm arasında birebir ilişki var. Bunun nedeni, tek bir denetleyicinin yürütülen işleme bağlı olarak oluşturulacak farklı görünümleri seçebilmesidir. Denetleyiciden Görünüm'e tek yönlü oku not edin. Bunun nedeni, Görünüm'ün denetleyici hakkında herhangi bir bilgisi veya referansı olmamasıdır. Denetleyici Modeli geri aktarır, bu nedenle Görünüm ile ona geçirilen beklenen Model arasında bilgi vardır, ancak ona hizmet veren Denetleyici yoktur.

MVP (Model Görünümü Sunucusu)

Giriş, Presenter ile değil View ile başlar. Görünüm ile ilişkili Sunucu arasında bire bir eşleme vardır. Görünüm, Sunum Yapan kişi için bir referans tutar. Presenter aynı zamanda Görünüm'den tetiklenen olaylara da tepki gösterir, bu yüzden onunla ilişkili Görünüm'ün farkındadır. Presenter, Görünümü Model üzerinde gerçekleştirdiği istenen eylemlere göre günceller, ancak Görünüm Modelden haberdar değildir.

Daha fazla Referans için


Ancak, MVPdesen, uygulama ilk kez yüklendiğinde, sunucunun ilk görünümü yüklemesinden sorumlu değildir mi? Örneğin facebook uygulamasını yüklediğimizde, sunum yapan kişi giriş sayfasını yüklemekle yükümlü değil mi?
engerek

2
MVC'de Modelden Görünüme bir bağlantı mı? Cevabınızı, bu bağlantı göz önüne alındığında nasıl 'ayrıştırılmış' bir sistem haline getirdiğini açıklamak için düzenlemek isteyebilirsiniz. İpucu: Zor bulabilirsiniz. Ayrıca, okuyucunun tüm yaşamları boyunca yanlış hesaplama yaptıklarını mutlu bir şekilde kabul edeceğini düşünmüyorsanız, kullanıcı ekrandaki 'görsel' öğelerle etkileşime girmesine rağmen (örn. Görünüm), işlemenin arkasında oturan bazı soyut katmanlar değil.
Ash

3
Bu açıkça yanlıştır ... MVC'de, model asla doğrudan görüşle konuşmaz ve bunun tersi de geçerlidir. Başka birinin var olduğunu bile bilmiyorlar. Kontrolör, onları bir arada tutan tutkaldır
MegaManX

1
Ash ve MegaManX ile hemfikirim. MVC diyagramında ok, Modelden Görünüme değil, Model'e (veya ViewModel veya DTO) işaret eden Görünüm'den olmalıdır; çünkü Model Görünüm hakkında bilgi sahibi değildir, ancak Model hakkında bilgi sahibi olabilir.
Jboy Flaga

57

Sorunun birçok cevabı var, ama ikisini açıkça karşılaştıran gerçekten basit bir cevaba ihtiyaç olduğunu hissettim. Bir kullanıcı bir MVP ve MVC uygulamasında bir film adı aradığında yaptığım tartışma şu şekildedir:

Kullanıcı: Tıklayın…

Görünüm : Kim bu? [ MVP | MVC ]

Kullanıcı: Ara düğmesini tıkladım…

Görünüm : Tamam, bir saniye ... [ MVP | MVC ]

( Sunucu | Denetleyiciyi çağıran görünüm …) [ MVP | MVC ]

Görünüm : Hey Sunucu | Denetleyici , bir Kullanıcı ara düğmesini henüz tıkladı, ne yapmalıyım? [ MVP | MVC ]

Sunucu | Kontrolör : Hey Görünüm , bu sayfada herhangi bir arama terimi var mı? [ MVP | MVC ]

Görünüm : Evet,… işte burada… “piyano” [ MVP | MVC ]

Presenter : Thanks View ,… Bu arada Model üzerindeki arama terimini arıyorum , lütfen ona bir ilerleme çubuğu gösterin [ MVP | MVC ]

( Sunucu | Denetleyici Modeli çağırıyor …) [ MVP | MVC ]

Sunucu | Denetleyici : Hey Model , Bu arama terimi için eşleşmeniz mi var ?: “piyano” [ MVP | MVC ]

Model : Hey Sunucu | Kontrolör , kontrol edeyim… [ MVP | MVC ]

( Model film veritabanına sorgu yapıyor…) [ MVP | MVC ]

( Bir süre sonra ... )

-------------- Bu, MVP ve MVC'nin ayrılmaya başladığı yerdir ---------------

Model : Sizin için bir liste buldum, Presenter , işte JSON “[{" name ”:" Piyano Öğretmeni "," yıl ": 2001}, {" name ":" Piyano "," yıl ": 1993} ] ”[ MVP ]

Model : Elde edilen bazı sonuçlar var, Kontrolör . Örneğimde bir alan değişkeni oluşturdum ve sonuçla doldurdum. Adı "searchResultsList" [ MVC ]

( Sunucu | Kontrolör sayesinde Modeli ve geri alır Görünüm ) [ MVP | MVC ]

Sunucu : Beklediğiniz için teşekkürler View , sizin için eşleşen sonuçların bir listesini buldum ve bunları sunulabilir bir biçimde düzenledim: ["Piano Teacher 2001", "Piano 1993"]. Lütfen kullanıcıya dikey bir listede gösterin. Ayrıca lütfen ilerleme çubuğunu şimdi gizleyin [ MVP ]

Kontrolör : Beklediğiniz için teşekkürler View , Model'e arama sorgunuzu sordum . Eşleşen sonuçların bir listesini bulduğunu ve bunları örneğinin içindeki "searchResultsList" adlı bir değişkende sakladığını söylüyor. Oradan alabilirsiniz. Ayrıca lütfen ilerleme çubuğunu şimdi gizleyin [ MVC ]

Görünüm : Çok teşekkür ederim Sunucu [ MVP ]

Görünüm : Teşekkürler "Denetleyici" [ MVC ] (Şimdi Görünüm kendisini sorguluyor: Modelden elde ettiğim sonuçları kullanıcıya nasıl sunmalıyım? Filmin yapım yılı önce mi yoksa son mu olmalı ...? dikey mi yatay mı? ...)

İlgilenmeniz durumunda, burada Github repo eşliğinde uygulama mimari desenleri (MVC, MVP, MVVP, temiz mimari, ...) ile ilgili bir dizi makale yazıyorum . Örnek android için yazılsa bile, temel prensipler herhangi bir ortama uygulanabilir.


Temel olarak söylemeye çalıştığınız şey, denetleyicinin görünüm mantığını mikro yönetmesi mi? Yani ne olacağını ve nasıl göründüğünü sunarak görünümü dumber yapar?
Radu

@Radu, Hayır, mikro yönetim değil, sunucunun manzarayı pasif veya aptal yaparak yaptığı şey bu
Ali Nem

4
Uygun bir MVC'de, görünüm denetleyicideki işlevselliği çağırır ve modeldeki veri değişikliklerini dinler. Görünüm, denetleyiciden veri almaz ve denetleyici, görünüme örneğin bir yükleme göstergesi görüntülemesini bildirmemelidir. Uygun bir MVC, görünüm bölümünü temelde farklı olanla değiştirmenizi sağlar. Görünüm kısmı, bir yükleme göstergesi içeren görünüm mantığını içerir. Görünüm talimatları (denetleyicide) çağırır, denetleyici modeldeki verileri değiştirir ve model dinleyicilerini verilerindeki değişiklikleri bildirir, böyle bir dinleyici görünümdür.
Tommy Andersen

35
  • MVP = Model-View-Presenter
  • MVC = Model-Görünüm-Denetleyici

    1. Her iki sunum modeli. Bir Model (Domain nesnelerini düşün), ekran / web sayfanız (Görünüm) ile kullanıcı arayüzünüzün nasıl davranması gerektiği arasındaki bağımlılıkları ayırırlar (Sunucu / Denetleyici)
    2. Konseptte oldukça benzerler, insanlar Presenter / Controller'ı tada bağlı olarak farklı şekilde başlatırlar.
    3. Farklılıklar hakkında harika bir makale burada . En dikkat çekici olanı, MVC modelinin Görünümü güncelleyen Modeline sahip olmasıdır.

2
Model VIew'in güncellenmesi. Ve bu hala ayrıştırılmış bir sistem mi?
Ash

34

Model-View-Controller

MVC bir yazılım uygulamasının mimarisi için bir modeldir. Uygulama mantığını üç ayrı parçaya ayırır, modülerliği ve işbirliği ve yeniden kullanım kolaylığı sağlar. Ayrıca, uygulamaları daha esnek ve yinelemelere karşı hoş hale getirir.Bir uygulamayı aşağıdaki bileşenlere ayırır:

  • Veri ve iş mantığını işlemek için modeller
  • Kullanıcı arayüzünü ve uygulamasını yönetmek için kontrolörler
  • Görüntüleme grafik kullanıcı arayüzü nesneleri ve sunum kullanımı için

Bunu biraz daha açık hale getirmek için, basit bir alışveriş listesi uygulaması düşünelim. Tek istediğimiz, bu hafta satın almamız gereken her öğenin adı, miktarı ve fiyatının bir listesidir. Aşağıda, bu işlevselliğin bir kısmını MVC kullanarak nasıl uygulayabileceğimizi açıklayacağız.

resim açıklamasını buraya girin

Model-View-Presenter

  • Model görünüşüdür (kullanıcı arabirimi) görüntülenir verilerdir.
  • Görünüşüdür Sunucuya verileri görüntüler (modeli) ve rotalar, kullanıcı komutları (olaylar) bu verilere göre hareket için bu bir arayüzdür. Görünümün genellikle Sunucusuna referansı vardır.
  • Sunum (MVC denetleyicisi tarafından oynanan) “orta erkek” ve, görünümü ve modelin her iki başvuru var. “Model” kelimesinin yanıltıcı olduğunu lütfen unutmayın . Bir Modeli geri alan veya işleyen bir iş mantığı olmalıdır . Örneğin: Kullanıcı'yı bir veritabanı tablosunda depolayan bir veritabanınız varsa ve Görünümünüzde bir kullanıcı listesi görüntülemek istiyorsanız, Sunum Yapan Kişinin bir listeyi sorgulayacağı veritabanı iş mantığınıza (DAO gibi) bir referansı olur. Kullanıcıların.

Basit bir uygulamaya sahip bir örnek görmek istiyorsanız lütfen bu GitHub yayınını kontrol edin

Veritabanındaki kullanıcıların listesini sorgulamak ve görüntülemek için somut bir iş akışı şu şekilde çalışabilir: resim açıklamasını buraya girin

MVC ve MVP modelleri arasındaki fark nedir ?

MVC Kalıbı

  • Denetleyici davranışlara dayanır ve görünümler arasında paylaşılabilir

  • Hangi görünümün görüntüleneceğini belirlemekten sorumlu olabilir (Ön Denetleyici Deseni)

MVP Kalıbı

  • Görünüm modele daha gevşek bağlıdır. Sunum yapan kişi, modeli görünüme bağlamaktan sorumludur.

  • Görünümle etkileşim bir arayüz üzerinden yapıldığı için birim testi daha kolay

  • Genellikle sunucu haritasını bire bir görüntüleyin. Karmaşık görünümlerin çoklu sunumcuları olabilir.


2
nah, mvc'de görünüm ve model arasında doğrudan bir bağlantı yoktur. diyagramınız yanlış.
Özgür

33

Ayrıca hatırlamakta fayda var, farklı MVP türleri de var. Fowler, paterni iki pasif görünüm ve denetleyici denetleyiciye ayırdı.

Pasif Görünümü kullanırken, Görünümünüz genellikle altta yatan kullanıcı arayüzü widget'ına az çok doğrudan eşlenen özelliklerle ince taneli bir arayüz uygular. Örneğin, Ad ve Adres gibi özelliklere sahip bir ICustomerView'ünüz olabilir.

Uygulamanız aşağıdaki gibi görünebilir:

public class CustomerView : ICustomerView
{
    public string Name
    { 
        get { return txtName.Text; }
        set { txtName.Text = value; }
    }
}

Presenter sınıfınız modelle konuşacak ve onu görünümle "eşleyecek". Bu yaklaşıma "Pasif Bakış" denir. Avantajı, görünümün test edilmesinin kolay olması ve UI platformları (Web, Windows / XAML vb.) Arasında hareket etmenin daha kolay olmasıdır. Dezavantajı, veri bağlama gibi şeylerden ( WPF ve Silverlight gibi çerçevelerde gerçekten güçlü ) yararlanamamanızdır.

MVP'nin ikinci aroması Denetleyici Denetleyicidir. Bu durumda, Görünümünüzde Müşteri adında bir özellik olabilir ve bu da yine kullanıcı arayüzü widget'larına veri bağlanır. Görünümü senkronize etmeyi ve mikro yönetmeyi düşünmek zorunda değilsiniz ve Denetleyici Denetleyici, örneğin tamamlanmış etkileşim mantığı gibi, gerektiğinde devreye girebilir ve yardımcı olabilir.

MVP'nin üçüncü "lezzeti" (veya belki de ona ayrı bir desen diyebilir) Sunum Modeli'dir (veya bazen Model-View-ViewModel olarak adlandırılır). MVP ile karşılaştırıldığında M ve P'yi bir sınıfa "birleştirirsiniz". Kullanıcı arabirimi widget'larınızın verilere bağlı olduğu müşteri nesneniz var, ancak "IsButtonEnabled" veya "IsReadOnly" vb. Gibi ek UI'ye özgü alanlarınız da var.

UI mimarisine bulduğum en iyi kaynak, Jeremy Miller tarafından Kendi CAB Serisi İçindekiler Tablosunda yapılan blog yayınları dizisidir . MVP'nin tüm lezzetlerini kapladı ve bunları uygulamak için C # kodunu gösterdi.

Ayrıca YouCard'da Silverlight bağlamında Model-View-ViewModel kalıbı hakkında blog yazdım Yeniden ziyaret edildi: ViewModel kalıbını uygulama .


25

Her biri farklı sorunlara hitap eder ve hatta aşağıdaki gibi bir şeye sahip olmak için birleştirilebilir.

Birleşik Desen

Burada MVC, MVP ve MVVM'nin tam bir karşılaştırması da var


1
Çok karmaşık şeyler yerine, soruyu cevaplamış olabilirsiniz. Bu yüzden çoğumuz buradayız. Mvp ve mvc arasındaki karşılaştırmayı araştırdı ve buraya yönlendirildiniz ve OP ile ilgisi olmayan mimarilerin uyumundan bahsediyorsunuz.
Farid

18

Bu çerçevelerin her ikisi de, örneğin bir veri kaynağı (model), uygulama mantığı (veya bu verileri faydalı bilgilere dönüştürmek) (Denetleyici / Sunum Yapan Kişi) ve ekran kodu (Görünüm) gibi etkileşimleri ayırmayı amaçlamaktadır. Bazı durumlarda, model bir veri kaynağını daha yüksek bir soyutlamaya dönüştürmek için de kullanılabilir. Bunun iyi bir örneği MVC Storefront projesidir .

Burada MVC ile MVP arasındaki farklar hakkında bir tartışma var .

Bir ayrım, bir MVC uygulamasında geleneksel olarak görüş ve kontrolörün modelle etkileşime girmesi, ancak birbiriyle etkileşmemesidir.

MVP tasarımları Presenter'ın modele erişmesini ve görünümle etkileşimini sağlar.

Bunu söyledikten sonra, ASP.NET MVC bu tanımlarla bir MVP çerçevesidir, çünkü Denetleyici, mantık içermeyen Görünümü doldurmak için Modele erişir (yalnızca Denetleyici tarafından sağlanan değişkenleri görüntüler).

MVP'den ASP.NET MVC ayrımı hakkında bir fikir edinmek için Scott Hanselman'ın bu MIX sunumuna göz atın.


7
MVC ve MVP, çerçeveler değil kalıplardır. Dürüstçe düşünürseniz, bu konu .NET framework hakkındaydı, o zaman "internet" duymak ve IE hakkında olduğunu düşünmek gibidir.
tereško

Sorunun 2008'de ilk kez sorulduğu andan itibaren önemli ölçüde geliştiğinden eminim. Ayrıca, cevabımı geri bakarak (ve bu 4 yıl önceydi, bu yüzden senden çok daha fazla bağlamım yok) Genel olarak başladığımı söyleyebilirim ve somut bir örnek olarak .NET MVC kullanın.
Matt Mitchell

13

Her ikisi de sunum ve iş mantığını ayırmaya çalışan ve iş mantığını UI yönlerinden ayıran kalıplardır

Mimari olarak, MVP, MVC'nin Ön Denetleyici tabanlı bir yaklaşım olduğu Sayfa Denetleyici tabanlı bir yaklaşımdır. Bu, MVP standart web formu sayfa yaşam döngüsünün, iş mantığının arkasındaki koddan çıkarılmasıyla artırıldığı anlamına gelir. Başka bir deyişle, sayfa http hizmetini veren kişidir. Başka bir deyişle, MVP IMHO web form evrimsel bir geliştirme türüdür. Diğer yandan MVC oyunu tamamen değiştirir, çünkü istek sayfa yüklenmeden önce kontrolör sınıfı tarafından kesilir, iş mantığı orada yürütülür ve daha sonra kontrolörün sayfaya yeni dökülen verileri işlemesi sonucunda ("görünüm") MVC, yönlendirme motoruyla geliştirilmiş MVP'nin Denetleyici Kontrolörü lezzetine çok benziyor (en azından bana)

Her ikisi de TDD'yi etkinleştirir ve olumsuz ve olumsuz yanları vardır.

Bunlardan birini seçmek için karar IMHO bir ASP NET web formu türü web geliştirme yatırım ne kadar zaman dayalı olmalıdır. Web formlarında kendini iyi görürse MVP'yi öneririm. Bir sayfa yaşam döngüsü vb şeylerde çok rahat hissetmezseniz MVC buraya gitmek için bir yol olabilir.

İşte bu konuda biraz daha ayrıntı veren başka bir blog yazısı bağlantısı

http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx


9

Hem MVP hem de MVC kullandım ve geliştiriciler olarak her iki modelin teknik farklılıklarına odaklanma eğilimimiz olmasına rağmen, IMHO'daki MVP'nin noktası, benimsenme kolaylığıyla her şeyden çok daha fazla ilişkili.

Zaten web form geliştirme tarzı üzerinde iyi bir arka plan olarak bir ekip içinde çalışıyorsanız MVP tanıtmak MVC daha çok daha kolay. Bu senaryoda MVP'nin hızlı bir kazanç olduğunu söyleyebilirim.

Deneyimlerim, bir takımı web formlarından MVP'ye ve sonra MVP'den MVC'ye taşımanın nispeten kolay olduğunu söylüyor; web formlarından MVC'ye geçmek daha zordur.

Burada bir arkadaşımın MVP ve MVC hakkında yayınladığı bir dizi makaleye bir bağlantı bırakıyorum.

http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx


8

MVP'de görünüm, modelden veri çizen ve hazırlayan / normalleştiren sunucudan veri çekerken MVC'de denetleyici, görünümü iterek modelden ve setten veri alır.

MVP'de birden çok sunum türü ile çalışan tek bir görünüm ve farklı birden çok görünüm ile çalışan tek bir sunum yapan kişi olabilir.

MVP genellikle Microsoft WPF bağlama çerçevesi veya HTML5 ve Java için çeşitli bağlama çerçeveleri gibi bir tür bağlama çerçevesi kullanır.

Bu çerçevelerde, UI / HTML5 / XAML, her bir UI öğesinin sunum yapan kişinin hangi özelliğinin görüntülendiğinin farkındadır, bu nedenle bir sunumu bir sunucuya bağladığınızda görünüm özellikleri arar ve bunlardan nasıl veri çekileceğini ve nasıl kullanıcı tarafından kullanıcı arayüzünde bir değer değiştirildiğinde bunları ayarlamak için.

Örneğin, model bir araba ise, sunumcu bir çeşit araba sunumcusu ise, araba özelliklerini (yıl, yapımcı, koltuklar, vb.) Görünüme maruz bırakır. Görünüm, 'araba üreticisi' adı verilen metin alanının, sunucu Maker özelliğini görüntülemesi gerektiğini bilir.

Daha sonra görünüme birçok farklı sunucu türünü bağlayabilirsiniz, hepsi Maker özelliğine sahip olmalıdır - bir uçak, tren veya herhangi bir şey olabilir, görünüm umursamıyor. Görünüm, kararlaştırılan bir arabirimi uyguladığı sürece, sunucudan veri alır - hangisi olursa olsun.

Bu bağlayıcı çerçeve, eğer onu soyursanız, aslında denetleyici :-)

Ve böylece, MVP'yi MVC'nin bir evrimi olarak görebilirsiniz.

MVC harika, ama sorun genellikle görünüm başına denetleyicisidir. Denetleyici A, Görünüm A'nın alanlarının nasıl ayarlanacağını bilir. Şimdi, Görünüm A'nın B modelindeki verileri görüntülemesini istiyorsanız, Model B'yi tanımak için Denetleyici A'ya ihtiyacınız vardır veya arabirim içeren bir nesne almak için Denetleyici A'ya ihtiyacınız vardır. MVP yalnızca bağlamalar olmadan veya Denetleyici B'deki UI set kodunu yeniden yazmanız gerekir.

Sonuç - MVP ve MVC'nin her ikisi de UI modellerinin ayrıştırılmasıdır, ancak MVP genellikle altında MVC olan bir bağlama çerçevesi kullanır. THUS MVP, MVC'den daha yüksek bir mimari seviyededir ve MVC'nin üzerinde bir sargı kalıbıdır.


6

Benim mütevazı kısa görüşüm: MVP büyük ölçekler için ve MVC küçük ölçekler için. MVC ile, bazen V ve C'nin doğrudan M'ye bağlı oldukça tek bir bölünmez bileşenin iki yüzü olduğunu hissediyorum ve UI kontrolleri ve temel widget'lar gibi daha kısa ölçeklere inerken kaçınılmaz olarak buna düşüyor. Bu ayrıntı düzeyinde MVP çok az mantıklı. Aksine biri daha büyük ölçeklere gittiğinde, uygun arayüz sorumlulukların açık bir şekilde atanmasıyla aynı hale gelir ve burada MVP gelir.

Öte yandan, başparmağın bu ölçek kuralı, platform özellikleri, MVC'nin uygulanmasının daha kolay olduğu web'de olduğu gibi MVP'den daha kolay olduğu gibi bileşenler arasında bir tür ilişkileri desteklediğinde çok az ağırlık alabilir.


4

Erwin Vandervalk (ve beraberindeki makale ) tarafından hazırlanan bu imajın MVC, MVP ve MVVM, benzerlikleri ve farklılıklarının en iyi açıklaması olduğunu düşünüyorum. Makale makalenin başlığında "MVC" ve "MVP" içermediği için "MVC, MVP ve MVVM" konulu sorgular için arama motoru sonuçlarında görünmüyor; ama en iyi açıklama bence.

MVC, MVP ve MVVM açıklayan resim - Erwin Vandervalk

( Makale ayrıca Bob Martin Amca görüşmelerinde söyledikleriyle de eşleşiyor: MVC'nin aslında sistemin mimarisi için değil, küçük UI bileşenleri için tasarlandığını)


3

MVC'nin birçok sürümü vardır, bu cevap Smalltalk'taki orijinal MVC ile ilgilidir. Kısacası, mvc adlı kullanıcının görüntüsü vs mvp

Bu konuşma droidcon NYC 2017 - Mimari Bileşenleri ile temiz uygulama tasarımı bunu netleştiriyor

resim açıklamasını buraya girin resim açıklamasını buraya girin


6
MVC'de Model asla doğrudan görünümden çağrılmaz
rodi

5
Bu yanlış bir cevap. Yanlış yönlendirmeyin. @ rodi yazdığı gibi, Görünüm ve Model arasında hiçbir etkileşim yoktur.
Shawn Mehan

MVC görüntüsü yanlış veya en iyi yanıltıcıdır, lütfen bu cevaba dikkat etmeyin.
Jay

2
@ Jay1b Sizce hangi MVC "doğru"? Bu cevap orijinal MVC ile ilgilidir. Platforma adapte olmak için değiştirilen başka birçok MVC (iOS'ta olduğu gibi) varUIKit
onmyway133

Oklar ne anlama geliyor?
sorunlu memur

3

Orada bu o kısaca açıklar Amca Bob güzel bir video MVC & MVP sonunda.

IMO, MVP, MVC'nin gelişmiş bir sürümüdür ve burada göstereceğiniz şeyin (veriler) endişesini nasıl göstereceğinizden (görünüm) ayırırsınız. Sunucu, UI'nizin iş mantığını içerir, hangi verilerin sunulması gerektiğini dolaylı olarak dayatır ve size aptal görünüm modellerinin bir listesini verir. Verileri gösterme zamanı geldiğinde, görünümünüzü (muhtemelen aynı kimlikleri içerir) bağdaştırıcınıza takmanız ve minimum görünüm kodunun girildiği bu görünüm modellerini kullanarak (yalnızca ayarlayıcıları kullanarak) ilgili görünüm alanlarını ayarlamanız yeterlidir. Başlıca faydası, UI iş mantığınızı yatay bir listede veya dikey listede öğeleri göstermek gibi birçok / çeşitli görünüme karşı test edebilmenizdir.

MVC'de, farklı katmanları yapıştırmak için arayüzler (sınırlar) üzerinden konuşuyoruz. Bir denetleyici mimarimize bir eklentidir, ancak ne gösterileceğini empoze etmek için böyle bir kısıtlama yoktur. Bu anlamda, MVP bir çeşit MVC'dir ve görüş kavramı adaptöre adaptöre takılabilir.

Umarım bu daha iyi olur.


2
Bob Amca'dan önemli nokta: Başlangıçta Trygve Reenskaug tarafından icat edildiğinde, MVC formun tamamı için değil, her widget için tasarlanmıştır .
Basil Bourque

2

Action-Domain-Responder'ı ( ADR ) unuttun .

Yukarıdaki bazı grafiklerde açıklandığı gibi, Model ile MVC'deki Görünüm arasında doğrudan bir ilişki / bağlantı vardır . Bir eylem gerçekleştirilir Denetleyicisi bir eylemi çalıştırır, Model . Bu işlem, Model , bir tepki tetikleyecek içinde Görünüm . Görünüm zaman, her zaman güncellenir Modeli 'nin devlet değiştirir.

Bazı insanlar unutmaya devam ediyor, MVC 70'in sonlarında yaratıldı ve Web sadece 80 "/ 90'ın başlarında" yaratıldı. MVC başlangıçta Web için değil, Denetleyici yerine Masaüstü uygulamaları için oluşturuldu. , Model ve Görüş birlikte varolacaktı.

Hala aynı adlandırma kurallarını ( model-görünüm-denetleyicisi ) kullanan web çerçeveleri ( örneğin: Laravel ) kullandığımız için , MVC olması gerektiğini düşünüyoruz, ancak aslında başka bir şey.

Bunun yerine, Action-Domain-Responder'a bir göz atın . ADR'de, Denetleyici Model / Etki Alanında bir işlem gerçekleştirecek bir Eylem alır . Şimdiye kadar aynı. Fark, daha sonra bu işlemin yanıtını / verilerini toplar ve işlemek için bir Yanıtlayıcıya ( örneğin:) iletir. Aynı bileşen üzerinde yeni bir işlem istendiğinde, Denetleyici tekrar çağrılır ve döngü kendini tekrar eder. ADR olarak, orada hiçbir bağlantı Modeli / Domain ve Görünüm (arasında Reponser tepkisi ).view()

Not: Wikipedia, " Her ADR eyleminin ayrı sınıflar veya kapanışlarla temsil edildiğini " belirtir . Bu mutlaka doğru değildir . Birkaç İşlem aynı Denetleyicide olabilir ve model hala aynıdır.


2

En basit cevap, görünümün modelle nasıl etkileşime girdiğidir. MVP'de görünüm, görünüm ve model arasında aracı görevi gören sunum yapan kişi tarafından güncellenir. Sunucu girişi görünümden alır, bu da verileri modelden alır ve sonra gerekli olan iş mantığını gerçekleştirir ve görünümü günceller. MVC'de model, denetleyiciden geri dönmek yerine görünümü doğrudan günceller.


Ben indirdim, çünkü afaik modeli MVC görünümü hakkında hiçbir şey bilmiyor ve yazarken doğrudan güncelleme mümkün değildir.
sorunlu memur

1
Wikipedia'da MVC'ye bakın, tam olarak böyle çalışır.
Clive Jefferies

1
Okuyucular ister beğenip beğenmesin, googling ile bulunabilen bol miktarda kaynak MVC'de görünümün modeldeki güncellemelere abone olduğunu belirtir. ve bazı durumlarda kontrolör bile olabilir ve bu nedenle bu tür güncellemeleri başlatır . Eğer bu hoşunuza gitmiyorsa, o makalelere şikayette bulunun ya da orada mevcut olan diğer bilgileri aktaran cevapları indirmek yerine, tek meşru kaynak olduğunu düşündüğünüz 'İncil' yazınız!
underscore_d

1
İfadeler kesinlikle geliştirilebilir, ancak görünümün MVC'deki modeldeki değişikliklere abone olduğu doğrudur. Modelin MVC'deki Görünümü bilmesi gerekmez.
elysium

Teşekkür ederim .. Bana çok yardımcı oldu
Dvyn Resh

1
  • MVC'de, View kullanıcı arabirimi parçasına sahiptir, kontrolör görünüm ve model arasındaki aracıdır ve model iş mantığını içerir.
  • MVP'de View, sunumun hem kullanıcı arayüzünü hem de uygulamasını içerir, çünkü burada sunum yapan kişi sadece bir arayüzdür ve model aynıdır, yani iş mantığı içerir.

-1

MVP

MVP, Model - View-Presenter anlamına gelir. Bu, 2007'nin başlarında Microsoft'un Smart Client windows uygulamalarını tanıttığı bir resme geldi.

Bir sunucu, MVP'de View olaylarını ve iş mantığını modellerden bağlayan denetleyici bir rol oynar.

View olay bağlama, bir görünüm arayüzünden Presenter'da uygulanacaktır.

Görünüm, kullanıcı girişlerinin başlatıcısıdır ve daha sonra olayları Sunum Yapan kişiye verir ve sunum yapan kişi olay bağlarını işler ve modellerden veri alır.

Artıları: Görünüm sadece kullanıcı arayüzü yok mantık değil Yüksek seviyede test edilebilirlik

Eksileri: Olay bağlamaları uygulanırken biraz karmaşık ve daha fazla çalışma

MVC

MVC, Model-View-Controller'ın kısaltmasıdır. Denetleyici, modeller oluşturmaktan ve bağlama modelleriyle görünümler oluşturmaktan sorumludur.

Denetleyici başlatıcıdır ve hangi görünümün oluşturulacağına karar verir.

Artıları: Tek Sorumluluk İlkesine Vurgu Yüksek düzeyde test edilebilirlik

Eksileri: Aynı denetleyicide birden çok görünüm oluşturmaya çalışırsanız, bazen Denetleyiciler için çok fazla iş yükü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.