Deneyimlerime göre, geleneksel bir masaüstü mvc gui programında, denetleyici görünüme göre spagetti ile sonuçlanıyor. Çoğu kişi denetleyici sınıfını etkisiz hale getirmek için zaman ayırmaz.
Smalltalk MVC'de Tasarım Desenleri
Sınıfların Model / View / Controller (MVC) üçlüsü [KP88], Smalltalk-80'de kullanıcı arayüzleri oluşturmak için kullanılır. MVC içindeki tasarım modellerine bakmak, "kalıp" terimiyle ne demek istediğimizi görmenize yardımcı olmalıdır.
MVC üç çeşit nesneden oluşur. Model uygulama nesnesi, Görünüm ekran sunumu ve Denetleyici, kullanıcı arabiriminin kullanıcı girdisine verdiği tepkiyi tanımlar. MVC'den önce, kullanıcı arayüzü tasarımları bu nesneleri bir araya getirme eğilimindeydi. MVC esnekliği artırmak ve tekrar kullanmak için onları ayırır.
MVC, aralarında bir abone olma / bildirme protokolü kurarak görünümleri ve modelleri ayırır. Bir görünüm, görünümünün modelin durumunu yansıtmasını sağlamalıdır. Modelin verileri değiştiğinde, model ona bağlı görünümleri bildirir. Yanıt olarak, her görünüm kendini güncelleme fırsatı buluyor. Bu yaklaşım, farklı sunumlar sağlamak için bir modele birden çok görünüm eklemenizi sağlar. Ayrıca, bir model için yeniden yazmadan yeni görünümler oluşturabilirsiniz.
Aşağıdaki şemada bir model ve üç görünüm gösterilmektedir. (Basitlik için denetleyicileri dışarıda bıraktık.) Model bazı veri değerleri içeriyor ve bir elektronik tablo, histogram ve pasta grafiğini tanımlayan görünümler bu verileri çeşitli şekillerde gösteriyor. Model, değerleri değiştiğinde görüşleri ile iletişim kurar ve bu değerlere erişmek için görünümler modelle iletişim kurar.
Gerçek değeri üzerinden alındığında, bu örnek modellerden görünümleri ayıran bir tasarımı yansıtır. Ancak tasarım daha genel bir soruna uygulanabilir: nesnelerin ayrıştırılması, böylece değişiklik yapılması, değiştirilen nesnenin diğerlerinin ayrıntılarını bilmesini gerektirmeden herhangi bir diğerini etkileyebilir. Bu daha genel tasarım, Gözlemci (sayfa 293) tasarım deseni ile tanımlanmıştır.
MVC'nin bir başka özelliği de görünümlerin iç içe geçebilmesidir. Örneğin, düğmelerin kontrol paneli iç içe düğme görünümleri içeren karmaşık bir görünüm olarak uygulanabilir. Bir nesne denetçisinin kullanıcı arayüzü, bir hata ayıklayıcıda yeniden kullanılabilecek iç içe görünümlerden oluşabilir. MVC, bir Görünümün alt sınıfı olan CompositeView sınıfıyla iç içe görünümleri destekler. CompositeView nesneleri, yalnızca View nesneleri gibi davranır; bir görüntünün kullanılabileceği her yerde bileşik görünüm kullanılabilir, ancak iç içe görünümleri de içerir ve yönetir.
Yine, bunu, bileşenlerinden birine yaptığımız gibi, bileşik bir görüntüye bakmamızı sağlayan bir tasarım olarak düşünebiliriz. Ancak tasarım, nesneleri gruplamak ve gruba bireysel bir nesne gibi davranmak istediğimizde ortaya çıkan daha genel bir soruna uygulanabilir. Bu daha genel tasarım, Kompozit (163) tasarım deseni ile tanımlanmaktadır. Bazı alt sınıfların ilkel nesneleri (örneğin, Düğme) tanımladığı bir sınıf hiyerarşisi oluşturmanıza izin verir ve diğer sınıflar, ilkelleri daha karmaşık nesnelere birleştiren bileşik nesneleri (CompositeView) tanımlar.
MVC ayrıca, görsel sunumunu değiştirmeden bir görüntünün kullanıcı girdisine yanıt verme şeklini değiştirmenizi sağlar. Örneğin, klavyeye tepki verme şeklini değiştirmek veya komut tuşları yerine bir açılır menü kullanmasını isteyebilirsiniz. MVC, cevap mekanizmasını bir Controller nesnesine yerleştirir. Sınıf kontrolörleri hiyerarşisi var ve mevcut kontrol cihazında bir varyasyon olarak yeni bir kontrol cihazı oluşturmayı kolaylaştırıyor.
Görünüm, belirli bir yanıt stratejisini uygulamak için Denetleyici alt sınıfının bir örneğini kullanır; farklı bir strateji uygulamak için örneği sadece farklı bir denetleyici ile değiştirin. Görünümün kullanıcı girişine yanıt verme biçimini değiştirmesine izin vermek için görünümün denetleyicisini çalışma zamanında değiştirmek bile mümkündür. Örneğin, bir görünüm, giriş olaylarını görmezden gelen bir denetleyici vererek girişi kabul etmemesi için devre dışı bırakılabilir.
View-Controller ilişkisi, Strateji (315) tasarım modelinin bir örneğidir. Strateji, bir algoritmayı temsil eden bir nesnedir. Algoritmayı statik veya dinamik olarak değiştirmek istediğinizde, algoritmanın çok fazla değişkenine sahip olduğunuzda veya algoritmanın kapsüllemek istediğiniz karmaşık veri yapılarına sahip olması yararlıdır.
MVC, bir görünüm için varsayılan denetleyici sınıfını belirtmek için Fabrika Yöntemi (107) ve bir görünüme kaydırma eklemek için Dekoratör (175) gibi diğer tasarım desenlerini kullanır. Ancak MVC'deki ana ilişkiler Gözlemci, Kompozit ve Strateji tasarım kalıpları tarafından verilmektedir.