Denetleyici Görünüm ve Model hakkında bilgi sahibi olmalı mı? ya da tam tersi?


13

Kavramsal olarak bunu yapmalı mıyım anlamaya çalışıyorum:

item = Model()
screen = View()
brain = Controller(item, screen)

veya bu..

brain = Controller()
item = Model(brain)
screen = View(brain)

veya bu..

class Controller():
    def __init__(self):
        item = Model(self)
        screen = View(self)

ya da tamamen başka bir şey?

Yanıtlar:


18

Bana göre ilk seçenek mantıklı. Kontrolörün görevi, görünüm ve model arasında koordinasyon sağlamaktır. Bu açıdan bakıldığında, denetleyicinin görünüme ve modele referansları kontrol eden denetleyici olması mantıklıdır.

Model ve Görünüm olmadan gerçekten bir kontrol cihazına sahip olamazsınız, ancak sadece bir Görünümünüz veya bir Modeliniz olması çok daha mantıklıdır (örneğin, birim testinde). Bu yüzden bu bağımlılıkları diğer ikisine değil, Denetleyiciye aktarmak istiyorsunuz.


9

ModelVe Viewbirbirinden bağımsızdır.

Düşünmeyin Controllerolarak beyinleri MVC yapısının. Olarak düşünün memuru tarayıcısından taleplerini ele almak ve gönderir onları Model. Daha sonra alır verileri gelen Modelbir yer ve paketleri bunu şablon dostu bir şekilde ve daha sonra gönderir View.

ModelOlduğu beyinleri MVC yapısında ve iş kurallarını koymak gerekir budur. İş kuralları birden fazla denetleyicide yaygındır . Bu nedenle, bir belge denetleyicisi ve bir rapor denetleyicisi, bunlara kimin erişebileceğini görmek için bir Kullanıcı modeli kullanabilir . Bu kuralları her iki denetleyicide de tekrarlamak istemezsiniz.

ViewOlmayan bir veri kaynağı belirli bir şekilde veri sunmak için HTML şablonu kullanmalıdır. Veritabanınızın şemasına sıkı sıkıya bağlı olmamalıdır. Bir belgenin başlığını göstermek için görünümün adı verilen bir şablon değişkeninin içeriğini çıktısı alırsınız document_titleve yalnızca Controllerbu değişkenin nasıl ayarlandığını Modelbilir ve yalnızca bu belgenin neden bu başlığa sahip olduğunu bilir.


1
Genel MVC anlayışımla birlikte geldiğinden cevabınızı seviyorum. Bununla birlikte, sorunun Triad'ın hangi bölümlerinin diğerlerine atıfta bulunduğu önemli bir bölümünü ele almıyor? Düşündüğüm karışıklık, açıkladığınız gerçeğin, Görünümlerin "delikli aptal şablonlar" olduğu gerçeğinden kaynaklanıyor (yani, Denetleyiciye referans yok, ancak Denetleyici Görünümleri biliyor ve Modelden verileri bunlara ekliyor). Aynı zamanda, görmeye devam ettiğim bir diğer yaygın nokta da Views'ın Denetleyiciye kullanıcı eylemleri göndermesi gerektiğidir. Views, C'ye başvurmadan bunu nasıl yapabilir?
alnafie

@alnafie Bir MVC çerçevesini sadece 3 sınıfa basitleştirdiniz. Mevcut MVC açık kaynak çerçevelerine bakın ve çalışmasını sağlamak için çok daha fazlasının gerekli olduğunu göreceksiniz. Çerçeve için tüm parçaları yöneten daha yüksek bir şey olmalı. Denetleyicileri çağıran ve Görünümlerdeki eylemlere yönlendirmeyi işleyen bir şey.
Reactgular

3

MVC başlangıçta masaüstü uygulamalarının programlanmasını kolaylaştırmak için tanımlanmıştır. Görünüm, model olaylarına abone oldu ve model değiştiğinde sunumu güncelledi. Kontrolör sadece kullanıcı arayüzü olaylarını (örneğin bir düğmeye basma) modele yapılan çağrılara çevirdi. Yani kontrolör ve görünüm modele bağlıydı, ancak birbirinden bağımsızdı. Model her ikisinden de bağımsızdı. Bu, birden çok görünüm ve denetleyicinin aynı model üzerinde çalışmasına izin verdi.

Web 1.0 uygulamaları (tam sayfa yenileme, AJAX yok) için kullanılan "MVC" mimarisi biraz farklıdır. Bir denetleyiciye bir web isteği gönderilir. Denetleyici bir şekilde model durumunu değiştirir, ardından bir görünüm tarafından oluşturulacak bir veya daha fazla modeli gönderir. Denetleyici ve görünüm her ikisi de modele bağlıdır, ancak denetleyici de görünüme bağlıdır.

Web 2.0 uygulamaları ile, istemci tarafında klasik MVC mimarisine dönüyoruz . Model, görünüm ve denetleyicilerin tümü istemci tarafında Javascript nesneleri olarak bulunur. Denetleyici kullanıcı olaylarını model eylemlerine çevirir. Model eylemleri, sunucuya bir AJAX isteğiyle sonuçlanabilir veya sonuçlanmayabilir. Görünüm yine model olaylara abone olur ve sunuyu buna göre günceller.


+1 iyi cevap. Masaüstü uygulamaları için model geri çağrılarını klasik anlamda anlayabiliyorum. Bana eski MFC'yi Microsoft'tan hatırlatıyor.
Reactgular

2

Görünüm, modeldeki değişikliklere abone olmalıdır. Aboneliklerin zenginliği konusunda ayrıntılı olabileceğinden (bu belirli öğe için bana envanter değişikliklerini göster) veya jenerik (model değiştiğinden) enlem var; görünüm, bildirim değişikliğine yanıt olarak modeli sorgulayabilir. Görünüm, değişiklik bildirimlerini işlerken olduğu gibi ekranı güncelleyerek ekranda istenen model öğeleri kümesini sunar.

Kontrolör, kullanıcı yönünün bir sonucu olarak modelde değişiklik yapmalıdır (örneğin klavye, fare ve menü komutları).

Model, modeli ve aboneliklerin bir listesini tutar ve uygulanabilir değişikliklerin görünümlerini abonelikleri aracılığıyla bilgilendirmelidir.

Ayrıca yeni görünümler ve denetleyiciler oluşturmak için bir mekanizma olması gerekir (MVC'de aynı modelin iki veya daha fazla görünümüne sahip olmanız gerekir (bunlar aynı görünüm (nokta) veya farklı görünüm (nokta) olabilir). Mantıksal olarak, kontrolörün kontrolörün veya başka bir bileşenin parçası olabilen bir görünüm ve kontrolör (çift) fabrikasını gerçekleştirmesi veya bunlara erişmesi gerektiğini düşünebiliriz.


-1 Modelsbildirmez Views. için değişiklikleri Controllerssorgulayın Modelve sonra Viewsbu değişiklikleri sunmak için oluşturun .
Reactgular

4
MVC'deki @MathewFoscarini, View, Modeldeki değişikliklere abone olur. Bkz . Örneğin, wiki.squeak.org/squeak/598 .

Sanırım mevcut bir MVC çerçevesindeki farklılıklar hakkında konuşmuyoruz. Zend MVC, C # .NET ve CakePHP Görünüm'e bir Model bağlamaz. Bu çerçevelerdeki bir Görünüm bağımsızdır. Hangi MVC ile çalıştığınızı bilmiyorum, ama buna geleneksel olmayan diyorum.
Reactgular

6
@ MathewFoscarini: Bunların hepsi web çerçeveleri ve kendilerine "MVC" demelerine rağmen, klasik MVC mimarisini takip etmiyorlar.
kevin cline

2
Herhangi bir MVC Smalltalk MVC daha "geleneksel" olduğundan emin değilim, desen açıklandığı ilk.

1

MVC daha çok bir modülerlik modeline benzer. Amacı, kullanıcı arabirimi düzenini (görünüm) değiştirmek istediğinizde, uygulama mantığını (denetleyici) veya dahili veri işlemlerini (model) değiştirmek zorunda kalmamanızdır.

Bunu başarmak için, model her bir MVC bileşeninin uygulama mantığını izole etmektir. Yine de, orada bileşenlerin birbirlerinin arayüzlerini tanıması kesinlikle normaldir .

Sık sık gördüğüm şey, denetleyicinin model ve görünüm oluşturması veya çağırmasıdır (bu nedenle arayüzlerini bilir) ve model veya görünümün kontrolcüyü karşılığında (daha çok bir geri arama veya gözlemci modeli gibi) bildirebilmesidir. Önemli olan, denetleyicinin düzen yapısının farkında olmamasıdır.

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.