Model-View-Controller: Kullanıcı View veya Controller ile etkileşime giriyor mu? [kapalı]


14

Geçenlerde MVC tasarım modelini öğrendim. Head First Design Pattern kitabından öğreniyorum.

Bu kitaba göre (doğru anlarsam):

Model , uygulama mantığı ve verilerinin çoğudur.

Görünüm temel olarak Modeli görsel olarak kullanıcıya gösteren GUI'dir.

Kontrolör , Görüş ile Model arasında 'aracılıktan' ve 'aracı' olarak hareket etmekten sorumludur. Görünüm, Denetleyiciye kullanıcının bir eylem gerçekleştirdiğini bildirir ve Denetleyici bunu Modeldeki yöntem çağrılarına dönüştürür.

Ancak, web'deki birçok yer bu kitaptan anladığımla çelişiyor. Genellikle kullanıcının Görünümle değil, Kontrolörle etkileşime girdiğini iddia ederler.

Hangisi doğru veya daha yaygın? Kullanıcı Denetleyici ile doğrudan mı yoksa doğrudan Görünüm ile etkileşime giriyor mu? Her iki yaklaşım da kabul edilebilir mi? Hangisi daha yaygın?


4
Bu soru, yazdığınız şekilde anlamlı bir şekilde cevaplanmamaktadır. Web'de kitabın birbiriyle çeliştiği yerlerden birine bir örnek verin, açıklamaya çalışacağız. Örneğinize özgü olun .
Robert Harvey

1
2 cevap, her ikisi de upvoted, bir "görünümü ile etkileşim" diyor diğeri "denetleyici ile etkileşim" diyor .... MVC bu kadar temel bir düzeyde karıştırılırsa oldukça iyi bir mimari olmadığını düşündürüyor!
gbjbaanb


Uygulamanın denetimlerine mi yoksa veritabanı sorgularına mı tıklıyorsunuz? Etkileşim, doğrudan kendisi olan bir görünüm olan kullanıcı arabirimidir. Görünüm genellikle sunucuya (web uygulamaları durumunda) istekleri çağırır veya üzerlerine kaydedilmiş kancaları çağırır (istemci uygulamaları durumunda). Bunun yanında tüm MVC sadece saçmalık.
luke1985

@spectre Bir açıklama ve ideal olarak bir alternatif sunmadan MVC'yi kapatmak yararlı değildir. Aksi takdirde işten çıkarılma hiçbir işe yaramaz ve yorumunuzun dışında bırakılmış olmalıdır. Ayrıca, bununla bile, hala konu dışı olurdu.
underscore_d

Yanıtlar:


18

Kullanıcı Görünüm ile etkileşime girer , ancak Görünüm eylemleri Denetleyiciye iletmelidir . Denetleyici güncelleyebilir Modeli , ama her / herhangi bir değişiklik ile gerekli değildir.

Sağladığım açıklama, MVC'nin .NET uygulamasıyla ilgili kişisel deneyimime dayanıyor. Uygulamanız farklı olabilir.

Kontrolör eylemler, temelde bir iş katmanı işlendiği yerdir. Basit bir denetleyici, Modelden Görünüm'e beslenecek verileri almaktan başka bir şey yapmaz. Karmaşık bir Denetleyici, güvenlik yönetimi, kimlik doğrulama, yetkilendirme, kayıt ve diğer birçok şeye kadar her türlü eylemi gerçekleştirecektir.

Görünüm sadece kullanıcı anlayabileceği bir şekilde bilgi görüntülemek için sorumlu olmalıdır. Tek Sayfa Uygulamaları (SPA'lar) gibi şeyler kullanıcı için veri doğrulama geri bildirimi içereceğinden, hem Denetleyici hem de Model ile bir miktar çaprazlama olabilir. Diğer çapraz geçişler büyük ölçüde kaşlarını çattı.

Model verileri ile ilgilenir. Bu, verilerin doğrulanmasını da içerir (varsa). Veri depolama ve alma da bu katmanda ele alınır.


GÜNCELLEME

Kimin ne zaman ne yaptığını çevreleyen bir karışıklık var gibi görünüyor. MVC mimarilerine iki farklı genel bakış ekledim, çünkü benzer ancak aynı değiller. Her iki yoruma da yer vardır. Muhtemelen, çok daha fazlası. Yukarıdaki açıklamalar, MVC'yi bu metodolojiyi kullanarak kendi deneyim geliştirme uygulamalarım da dahil olmak üzere birçok kaynaktan yorumlamamdır. Umarım, bu güncelleme bu karışıklığın bir kısmını gidermeye yardımcı olacaktır.

MVC, yazılım geliştirme için bir Endişeler Ayrımı tasarım modeli oluşturma girişimidir . Öncelikle web tabanlı uygulamalarda (bildiklerime göre) uygulandı.

Görünüm kullanıcı etkileşimi tüm işler. Kullanıcınız bir düğmeyi tıklarsa, Görünüm, tıklamanın bir kullanıcı arayüzü etkileşimi mi yoksa endişesinin ötesinde bir şey mi olduğunu belirler (Denetleyici etkileşimi). Düğme, değerleri bir alandan diğerine kopyalamak gibi bir şey yaparsa, uygulamanız bunun bir Görünüm endişesi mi yoksa Denetleyici endişesi mi olduğunu belirler. Büyük olasılıkla tek bir Sayfa Uygulaması (SPA) ile uğraşırken endişeleriniz bu şekilde bulanıklaşacaktır.

Denetleyici Eylemleriniz işlendiği yerdir. Görünüm, kullanıcının bazı alanların değerlerini değiştirmeye karar verdiğini bildirmiştir. Kontrolör bu veriler üzerinde doğrulama yapabilir veya Model tarafından işlenebilir. Yine bu uygulamaya bağlıdır. Denetleyicide güvenlik özellikleri varsa, kullanıcının eylemi gerçekleştirmek için yeterli ayrıcalığa sahip olmadığını belirleyebilir. Değişiklikleri reddedecek ve Görünümü buna göre güncelleyecektir. Denetleyici ayrıca Modelden hangi verilerin alınacağını, nasıl paketleneceğini ve Görünümü bu verilerle güncelleyeceğini belirler.

Model nerede ve nasıl veri depolamak için belirler. Ayrıca, saklanmadan önce bu verilerin doğrulanmasını da yapabilir (bunu yapmalıdır çünkü insanlar Görünüm'ü zaman zaman atlayacaklardır).


Wikipedia'nın MVC hakkında bir makalesi var .

  • Bir model, kendi halinde bir değişiklik olduğu zaman ilişkili görünüm / görüş ve denetleyicileri bildirir. Bu bildirim, görünümlerin sunumlarını güncellemesine ve denetleyicilerin kullanılabilir komut kümesini değiştirmesine izin verir. Bazı durumlarda bunun yerine bir MVC uygulaması "pasif" olabilir, böylece diğer bileşenler bildirilmek yerine modeli güncellemek için çağırmalıdır.
  • Bir görünüm , kontrolör tarafından kullanıcıya bir çıktı gösterimi oluşturmak için ihtiyaç duyduğu tüm bilgileri söyler. Ayrıca denetleyiciyi kullanıcı girdisi hakkında bilgilendirmek için genel mekanizmalar sağlayabilir.
  • Bir denetleyici , modelin durumunu güncellemek için modele komutlar gönderebilir (örneğin, bir belgeyi düzenleme). Ayrıca görünümün modelin sunumunu değiştirmek için ilişkili görünüme komutlar gönderebilir (örneğin, bir belgeyi kaydırarak).

Microsoft'un MVC'ye Genel Bakışından .

  • Modelleri. Model nesneleri, uygulamanın veri etki alanı için mantığı uygulayan bölümleridir. Genellikle, model nesneleri bir veritabanında model durumunu alır ve depolar. Örneğin, bir Product nesnesi bir veritabanından bilgi alabilir, üzerinde çalışabilir ve daha sonra güncellenmiş bilgileri bir SQL Server veritabanındaki Ürünler tablosuna geri yazabilir.

    Küçük uygulamalarda, model genellikle fiziksel olandan ziyade kavramsal bir ayrımdır. Örneğin, uygulama yalnızca bir veri kümesini okur ve görünüme gönderirse, uygulamanın fiziksel bir model katmanı ve ilişkili sınıfları yoktur. Bu durumda, veri kümesi bir model nesnesinin rolünü üstlenir.

  • Görüntüleme. Görünümler, uygulamanın kullanıcı arabirimini (UI) görüntüleyen bileşenlerdir. Tipik olarak, bu kullanıcı arayüzü model verilerinden oluşturulur. Örnek olarak, bir Product nesnesinin geçerli durumunu temel alan metin kutularını, açılır listeleri ve onay kutularını görüntüleyen bir Ürünler tablosunun düzenleme görünümü verilebilir.

  • Kontrolörler. Denetleyiciler kullanıcı etkileşimini işleyen, modelle çalışan ve sonuçta kullanıcı arayüzünü görüntüleyecek bir görünüm seçen bileşenlerdir. Bir MVC uygulamasında görünüm yalnızca bilgileri görüntüler; denetleyici kullanıcı girişini ve etkileşimini işler ve yanıtlar. Örneğin, denetleyici sorgu dizesi değerlerini işler ve bu değerleri modele iletir; bu da veritabanını sorgulamak için bu değerleri kullanabilir.


Tüm eylemler için GUI'niz yoksa ne olur? Belirli bazı parçalar için yalnızca API uyguladıysanız ne olur? Bu, kullanıcının bazen Görünümle, bazen de Denetleyiciyle doğrudan etkileşime girdiği anlamına mı geliyor?
Mehdi

1
Benim açımdan, hayır. API, görünümün yerini alır.
Adam Zuckerman

ancak API url-routes, içine yerleştirilmiş basit olabilir Controller. Demek istediğim hiç
Mehdi

1
@AdamZuckerman Yanıtladığınız için teşekkürler. Bir sonraki yorumda , ortak bir MVC uygulamasının nasıl çalıştığını düşündüğümü açıklayacağım , lütfen doğru olup olmadığını onaylayın. Teşekkürler
Aviv Cohn

2
@Mahdi Bir API, tanım gereği, bir kullanıcı arayüzü değil, bir programlama arayüzü olarak bulunur . Programlar API ile, kullanıcılar Görünüm ile etkileşime girer.
Eric King

4

Kullanıcı Denetleyici ile etkileşime girer . Etkileşim değiliz teknik noktası görünümünden Görünüm , sadece konum kullanarak etkileşim için Kontrolör .

Ayrıca bu daha mantıklı olmayan bir programcı için, ancak temelde konuştuğunuz bir düğmeye tıklayarak - Yüzeyde kullanıcı GUI ile etkileşim gibi görünüyor Kontrolör değil Görünüm .

Ayrıca tüm uygulamalar - hatta MVC web uygulamaları bile bir GUI'ye sahip değildir. Denetleyici ile bir API aracılığıyla etkileşimde bulunabilirsiniz - url-routesörneğin Denetleyicinin kendisine yerleştirilmiş olan basittir .

Kontrolör yer olmalı alır ve kolları kullanıcı isteklerini. Bir şekilde erişiyorsanız Yani Modeli doğrudan Görünüm - o zaman değil, nasıl fark etmez MVC artık.


2
+1 Bu doğrudur. Menüler ve araç çubukları gibi şeyler GUI'nin bir parçasıdır, ancak görünümün bir parçası değildir ve doğrudan denetleyiciye gider. Aynı şekilde tuş vuruşları.
david.pfx

1
Görüşlerin bir soyutlama olarak var olmasının nedeni, gerektiğinde bunları kolayca değiştirebilmemizdir. Çeşitli platformlardaki bir uygulama için bir denetleyici aynı olabilir, ancak görünümler kullanıcı hareketlerini farklı şekilde tanımalı ve bunları denetleyici işlemlerine dönüştürmelidir. Bu nedenle, kullanıcıların doğrudan denetleyicilerle etkileşime girdiğine katılmıyorum.
Fuhrmanator

1
@Mahdi Bu durumda hiçbir kullanıcı etkileşimi olmadığını söyleyebilirim, bu denetleyiciyle programlı iletişim kurar. Kullanıcı tarafından başlatılan etkileşimler yalnızca görünümdür.
Eric King

1
@ david.pfx Tuş vuruşları doğrudan tarayıcı penceresinden Denetleyiciye gidemez.
Adam Zuckerman

1
@Izkata "Görünüm, isteklerin gönderildiği kodun bir parçasıdır" - Üzgünüm ama bu, burada duyduğum en kötü şey. Bu nasıl mümkün olabilir? Bir makalede veya kitapta referans vererek yedekleyebilir misiniz?
Mehdi

1

Kullanıcıların neden denetleyicilerle değil görünümlerle doğrudan etkileşime girdiğinin somut bir örneğini kullanalım.

İPhone'daki müzik uygulamasında, üst düzey bir özellik bir çalma listesi çalmaktır. "Bir çalma listesi çal" app denetleyicinin bir işlevidir.

Bu işlevi etkinleştirmenin birden fazla yolu vardır. Uygulamanın içindeki çalma listesine tıklayabilirim veya Siri'den (ses arayüzü) aynı işlevi gerçekleştirmesini isteyebilirim. Bunlar çeşitli görüşlerle tanınan iki farklı harekettir .

Her görünümdeki geri bildirim de farklıdır. Siri, istediğiniz müziği çaldığını söyleyecektir. Müzik uygulaması, çalma listesini çaldığına dair görsel bir geri bildirim gösterir.

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.