Geçmişte MVP ve MVC kullandım ve bence yürütme akışını çok daha iyi kontrol ettiği için MVP'yi tercih ediyorum.
Altyapımı (veri deposu / depo sınıfları) oluşturdum ve örnek verileri sabit kodlarken sorunsuz bir şekilde kullanıyorum, bu yüzden şimdi GUI'ye geçiyorum ve MVP'mi hazırlıyorum.
Bölüm A
MVP görünümü giriş noktası olarak kullanarak gördüm, görünümleri oluşturucu yönteminde, sunum yapan, bu da olayları gerektiği gibi kablolama modeli oluşturur.
Sunumu, bir görünüm, model ve sunum yapan kişinin oluşturulduğu giriş noktası olarak gördüm, bu sunum yapan kişiye olayları bağlamak için yapıcısında bir görünüm ve model nesnesi verilir.
2'de olduğu gibi, ancak model sunucuya geçmez. Bunun yerine model, yöntemlerin çağrıldığı ve yanıtların doğrudan döndürüldüğü statik bir sınıftır.
B bölümü
Görünümü ve modeli senkronize tutma açısından gördüm.
Görünümdeki bir değer her değiştiğinde, yani
TextChanged
.Net / C # içindeki olay. BuDataChangedEvent
, her zaman senkronize kalması için modele aktarılan a'yı ateşler . Modelin değiştiği yerde, yani dinlediği bir arka plan olayı, görünüm aynı aDataChangedEvent
. Bir kullanıcı değişiklikSaveEvent
yapmak istediğinde, kayıt yapmak için modele geçer. Bu durumda model, görünümün verilerini taklit eder ve eylemleri işler.Ancak # b1'e benzer şekilde görünüm her zaman modelle senkronize edilmez. Bunun yerine kullanıcı değişiklik yapmak istediğinde
SaveEvent
, işten çıkarılır ve sunum yapan kişi en son ayrıntıları alır ve bunları modele aktarır. bu durumda model, üzerinde işlem yapılması gerekene kadar görünüm verileri hakkında bilgi sahibi olmaz, bu durumda gerekli tüm ayrıntılar iletilir.
Bölüm C
İşletme nesnelerinin görünümde görüntülenmesi, yani ilkel veriler olmayan bir nesne (Sınıfım) (int, double)
Görünüm, etki alanı / iş nesneleri olarak göstereceği tüm verileri için özellik alanlarına sahiptir. Bu gibi
view.Animals
gösterir birIEnumerable<IAnimal>
özelliği, görünüm bir önizleme Düğümler içine bu işler halde. Sonra seçilen hayvan için mülkiyetSelectedAnimal
olarak ortaya çıkardıIAnimal
.Görünüm, etki alanı nesneleri hakkında bilgi sahibi değildir, yalnızca ilkel / çerçeve (.Net / Java) dahil nesne türleri için özellik sunar. Bu durumda, sunucu bir bağdaştırıcı nesnesini etki alanı nesnesini geçirir, bağdaştırıcı daha sonra belirli bir iş nesnesini görünümde görünen denetimlere çevirir. Bu durumda bağdaştırıcının görünümdeki gerçek denetimlere erişimi olmalıdır, yalnızca herhangi bir görünüm değil, daha sıkı bir şekilde bağlanır.
Bölüm D
Tek bir denetim oluşturmak için kullanılan birden çok görünüm. Yani, farklı türdeki nesneleri kaydetmek gibi basit bir modelle karmaşık bir görüşe sahipsiniz. Bir öğeye her tıklandığında uygun kontroller gösterilen bir menü sisteminiz olabilir.
Görünümler arabirimi aracılığıyla açığa çıkarılan tüm denetimleri içeren büyük bir görünüm oluşturursunuz.
Birkaç görüşünüz var. Menü için bir görünümünüz ve boş bir paneliniz var. Bu görünüm gerekli diğer görünümleri oluşturur, ancak bunları görüntülemez (visible = false), bu görünüm aynı zamanda içerdiği her görünüm (yani alt görünümler) için arabirimi uygular, böylece bir sunucuya gösterebilir. Boş panel diğer görünümlerle (
Controls.Add(myview)
) ve ((myview.visible = true
) doldurulur . Bu "çocuk" görüşlerinde ortaya çıkan olaylar, olayı sunum yapan kişiye ileten ebeveyn görünümü tarafından ve alt öğelere geri olayların sağlanması için tam tersi şekilde gerçekleştirilir.İster ana ebeveyn olsun, ister küçük çocuk görüşleri olsun her görünüm kendi sunucu ve modeline bağlanır. Edebiyatla sadece bir görünüm kontrolünü mevcut bir forma bırakabilirsiniz ve işlevselliği hazır olacak, sadece sahne arkasındaki bir sunucuya kablolama gerekiyor.
Bölüm E
Her şeyin bir arayüzü varsa, şimdi yukarıdaki örneklerde MVP'nin nasıl yapıldığına dayalı olarak, çapraz uyumlu olmayabileceğinden bu yanıtı etkileyecektir.
Her şeyin bir arayüzü vardır, Görünüm, Sunucu ve Model. Bunların her birinin açıkça somut bir uygulaması vardır. Sadece bir somut görüşünüz, modeliniz ve sunumcunuz olsa bile.
Görünüm ve Modelin bir arayüzü vardır. Bu, görünümlerin ve modellerin farklı olmasına izin verir. Sunucu, görünüm ve model nesneleri oluşturur / verilir ve aralarında mesajlar iletmeye yarar.
Yalnızca Görünüm'ün bir arayüzü vardır. Model statik yöntemlere sahiptir ve yaratılmamıştır, bu nedenle bir arayüze gerek yoktur. Farklı bir model istiyorsanız, sunucu farklı bir statik sınıf yöntemi kümesi çağırır. Statik olduğundan, Modelin sunum yapan kişiyle bağlantısı yoktur.
Kişisel düşünceler
Sunmuş olduğum tüm farklı varyasyonlardan (çoğu muhtemelen bir şekilde kullandım) daha fazlası olduğundan eminim. İş mantığını daha az veri çoğaltması ve daha az olay tetiklenmesi için sadece MVP, B2 dışında yeniden kullanılabilir olarak tutmayı tercih ediyorum. C1 başka bir sınıfa eklemediği için, bir görünüme (bir etki alanı nesnesinin nasıl görselleştirildiği) az miktarda birimsel test edilemez mantık koyduğundan emin olun, ancak bu kod incelenebilir veya uygulamada kolayca görüntülenebilir. Mantık karmaşık olsaydı, her durumda bir adaptör sınıfını kabul ederdim. D bölümü için, D1'in bir menü örneği için çok büyük olmayan bir görünüm oluşturduğunu hissediyorum. Daha önce D2 ve D3 kullandım. D2 ile ilgili sorun, sunum yapan kişiden olayları doğru alt görünüme yönlendirmek için çok sayıda kod yazmak zorunda kalmanız ve sürükle / bırak uyumlu olmaması, her yeni kontrol, tek sunucuyu desteklemek için daha fazla kablolamaya ihtiyaç duyar. D3 benim tercih ettiğim seçim olsa da, görünüm çok basit veya yeniden kullanılmaya gerek olmasa bile, görünümle ilgilenmek için sunum yapan kişiler ve modeller olarak daha fazla sınıf ekler. D2 ve D3'ün karışımının en iyi koşullara bağlı olduğunu düşünüyorum. E bölümüne gelince, bir arayüze sahip olan her şeyin aşırıya kaçmış olabileceğini düşünüyorum. Bunu zaten etki alanı / iş nesneleri için yapıyorum ve genellikle "tasarım" da böyle bir avantaj görmüyorum, ancak testlerde nesneleri alay etmeye yardımcı oluyor. Şahsen E2'yi daha önce üzerinde çalıştığım 2 projede kullanılmış olmasına rağmen klasik bir çözüm olarak görecektim. D2 ve D3'ün karışımının en iyi koşullara bağlı olduğunu düşünüyorum. E bölümüne gelince, bir arayüze sahip olan her şeyin aşırıya kaçmış olabileceğini düşünüyorum. Bunu zaten etki alanı / iş nesneleri için yapıyorum ve genellikle "tasarım" da böyle bir avantaj görmüyorum, ancak testlerde nesneleri alay etmeye yardımcı oluyor. Şahsen E2'yi daha önce üzerinde çalıştığım 2 projede kullanılmış olmasına rağmen klasik bir çözüm olarak görecektim. D2 ve D3'ün karışımının en iyi koşullara bağlı olduğunu düşünüyorum. E bölümüne gelince, bir arayüze sahip olan her şeyin aşırıya kaçmış olabileceğini düşünüyorum. Bunu zaten etki alanı / iş nesneleri için yapıyorum ve genellikle "tasarım" da böyle bir avantaj görmüyorum, ancak testlerde nesneleri alay etmeye yardımcı oluyor. Şahsen E2'yi daha önce üzerinde çalıştığım 2 projede kullanılmış olmasına rağmen klasik bir çözüm olarak görecektim.
Soru
MVP'yi doğru şekilde uyguluyor muyum? Bunun için doğru bir yol var mı?
Martin Fowler'in varyasyonları olan çalışmasını okudum ve MVC yapmaya ilk başladığımda konsepti anladım, ama başlangıçta giriş noktasının nerede olduğunu, her şeyin kendi işlevi var ama orijinali kontrol eden ve yaratan şeyi hatırlayamıyorum nesneleri kümesi.