MVC'de birkaç görünüm aynı denetleyiciye sahip olabilir mi veya bir görünüm bir benzersiz denetleyiciye sahip olmalıdır?


15

MVC etrafında bir proje için bir mimari tasarlarken bazı sorularım var. (Bu bir C ++ / Marmalade SDK projesi, herhangi bir MVC çerçevesi kullanmıyorum, bir tane yapıyorum.)

Birkaç makalede ( orijinal Steve Burbek makalesinde olduğu gibi ) bu kavramı kelimenin tam anlamıyla aldığımdan beri beni etkileyen "MVC triad" kavramını okumaya devam ediyorum. İlk okuduğumda, bir uygulama "MVC triad" birimleri etrafında inşa edilmiş gibi göründüm - her kullanıcı arayüzü parçası için bir tane - ama bunu oldukça esnek bulmuyorum ve bence MVC'nin bu şekilde kullanılması amaçlanmadı. Daha sonra, konuyla ilgili daha fazla araştırma yaparak, denetleyicinin ve görünümün sıkı bağlanması için birkaç örnek buldum, yani 1'e 1 ilişki - TextEditView, TextEditController'a sahiptir.

Ancak projeme geri döndüğümde, bir denetleyiciye (AddElementController gibi 'mantıksal birim') ve belirli bir denetleyici için çeşitli görünümlere sahip olmanın yararlı olabileceğini düşünüyorum.

Açıkça sekme kullanıcı arabirimi bir tür olması gereken bir AddElementController gibi bir şey düşünüyorum. Sekmeler için bir AddElementTabView ve birkaç AddImageView, AddSoundView, vb olan bir AddElementController var mı? Yoksa her sekme görünümü için farklı bir 'alt denetleyicim' olmalı mı?

Özetle ve MVC modeliyle ilgili olarak (X modelinin bu modelin özel olarak anlaşılması / uygulanması değil), bir denetleyici için birkaç görüşe sahip olmak doğru mu yoksa her görünümün belirli bir denetleyicisi mi olmalı?

Ayrıca, bazı durum bilgilerinin denetleyicide tutulması doğru mu yoksa vatansız mı olmalıdır (yani, durumun bazı etki alanı dışı durum modellerine yerleştirilmesi gerekir)?

Şimdiden teşekkürler.

Yanıtlar:


14

Sorun, MVC modelinin artık gerçekten var olmayan bir sistemde tasarlanmış olmasıdır. UI kütüphanelerinin olmadığı bir zamanda Smalltalk'ta icat edildi. Bir pencere iletişim kutusu oluşturmak için tüm kutuları çizdiniz, uygun kareleri vurguladınız, çizdiğiniz metnin doğru noktaya geldiğinden emin oldunuz ... vb ...

Büyük bir tuvalden başka bir şey kullanmadan bir iletişim uygulaması yazmanın nasıl bir şey olduğunu hayal edin. MVC'nin geldiği dünya bu.

Bu sistemdeki bir "görünüm" bir metin kutusuydu ve kutuyu, metni, seçilen alanları çizmeyi, metindeki değişikliklere cevap vermeyi vb. Sorumlu olan bir sınıftı.

Bir "denetleyici", fare hareket ettirme, tuş aşağı, tuş yukarı, tıklamalar, vb. Gibi bu kutuda gerçekleşen fare olaylarını alan başka bir sınıftı ve ne olduğuna karar verecekti. Metni değiştirmeli miyiz? Seçimi değiştirmeli miyiz? Onun gibi şeyler.

Bir "model", bileşenin temel verilerini ve durumunu temsil eden başka bir sınıftır. Bir metin kutusu modelinde elbette metin, yazı tipi, seçim vb.

Gördüğünüz gibi, böyle bir durumda üç bileşen tek bir fikrin temsili ile birbirine karışmış durumda. Bu bağlamda bir "üçlü" den bahsetmek mantıklıdır.

Bugün, bir UI kütüphanesi oluşturmaya ve ham çizim komutlarını kullanmaya çalışıyorsanız benzer bir şey yapabilirsiniz. Ancak "MVC" paterninin uygulanması ilk amacının ötesine yayılmıştır. Artık tam bir iletişim kutusu olabilecek bir "görünümünüz" ve "textChanged" veya "buttonClicked" gibi olaylara yanıt veren bir denetleyiciniz var. Bugünün MVC'sindeki model normalde sistemle oldukça bağlantısız bir şeydir (ancak genellikle bir çeşit gözlemci arabirimi sağlayarak görünüme bağlanır) ve bir modelle ilişkili birçok görüş olabilir.

Yakın zamanda mimarlık yaptığım bir sistemde, örneğin tek bir belgenin "sahibini" ve onun etkin belgesini gözlemleyen yaklaşık 10+ görüşümüz vardı. Bir ana çizim arabirimi, belgenin düzeniyle, seçilen öğeyi gözlemleyen ve bir kayıt arabirimi sağlayan çeşitli özellik görünümleriyle ve yalnızca görünür pencere yerine tüm belgeyi gösteren ana görünümün daha küçük ölçekli bir temsiliyle etkileşime girdi. Bu görünümlerin bazılarında, GUI olaylarını belgede yapılan değişikliklere dönüştüren ve çeşitli görünümlerini bildiren çeşitli karmaşıklık denetleyicileri vardı.

Yine de böyle bir ilişkiye “üçlü” diyebilir misiniz? Belki de, ancak eski, eski MVC uygulamasının çok fazla olduğunu ima ettiğini düşünüyorum.

Denetleyicileri farklı görünümlerle paylaşabilir misiniz? Görüntülemelerin ne kadar benzer olduğuna bağlıdır. Genel olarak bu tür nesnelerin konuşmasının kontrol ettiği görünüme ve çok yeniden kullanılabilir olması için manipüle ettiği modele özgü davranışları olduğunu gördüm ... ama her zaman istisnalar var.


5

Değişir. MVC'nin çeşitli varyantları vardır, bazıları sadece 1: 1 ilişkinin mantıklı olduğu ("mütevazi iletişim kutusu" gibi), diğerleri ise böyle değildir. En önemli MVC varyantlarını açıklayan " Kendi CAB'nızı Oluşturun " makalelerini okumanızı tavsiye ederim .


3

Görünümlerde MVC'de Denetleyici yoktur. Kontrolör patron, bu yüzden Kontrolör hangi Görünümün oluşturulacağına karar verir ve Görünümler hangi Kontrolörün Görünüm'ü istediğini umursamıyor / umursamıyor.

Bir Denetleyiciden kesinlikle birden fazla Görünümünüz olabilir / olacaktır. MVC desenine bağlı kalmak istiyorsanız, her görünüm için bir model oluşturmayı düşünün.


3

Denetleyicinin amacı, etki alanı modelinizle kullanıcı etkileşimlerini kontrol etmektir - yani, kullanıcının gördüğü (görünüm) ve uygulamalarınızın durumu (model) arasındaki dolaylı düzeydir.

Kullanıcı bir istekte bulunduğunda, bir denetleyiciye yönlendirilir. Denetleyici, genellikle bir tür hizmet sınıfı aracılığıyla bu isteğin uygulamaya nasıl aktarılacağına karar verir. Daha sonra bu hizmet sınıfından gelen yanıtı yorumlar ve kullanıcıya hangi görünümün geri gönderileceğine karar verir.

Kullanıcının denetleyiciden yalnızca bir tür istek gelmesi durumunda bir denetleyici her zaman aynı görünümü (1: 1) döndürebilir ve her zaman aynı yanıt türünü gerektirir. Örneğin, HelloWorldControllerher zaman HelloWorldView"Merhaba, Dünya!"

Öte yandan, bir kontrolör modelin söylediklerine bağlı olarak genellikle farklı görünümlere karar vermek zorundadır. TeamRosterControllerBir döndürebilir RugbyTeamRosterViewveya FootbalTeamRosterViewistenen ekibin türüne bağlı.

Genel olarak kontrolörlerin vatansız olması tercih edilir, ancak kullanıcı oturumunun durumuna biraz erişim gerekli veya istenebilir. Mümkünse bu duruma erişimi ayrı ayrı yönetmelisiniz.

Ne yaptığını ve nasıl çalıştığını görmek için gerçek bir MVC çerçevesine bakmanızı şiddetle tavsiye ederim. Kullanmak zorunda değilsiniz, ancak kendi başınıza yapmadan önce kesinlikle daha iyi bir anlayış kazanacaksınız.

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.