Uygun Model Görünümü-_____ tasarım


14

Model View Controller, Model View Presenter, Model View ViewModel vb. Hakkında okudum ve genel olarak, temel kavramın anlaşılması oldukça basit görünüyor: güzel görseller ve sciencey bağırsaklarını birbirinden ayrı ve cahil olarak tutun mümkün. Tasarım çikolata mantık fıstık ezmesi almak yok; çok hoşuma gitti.

Sorun şu ki, üçüncü bölümle ilgili olarak biraz bulanıkım ... model ya da görünüm değil. Herkesin neyi arayacağı, neyi yapması gerektiği, neyin doğru olduğu, sadece neyin yanlış olduğu hakkında kendi fikirleri var gibi görünüyor ... ve bir Sunucunun ViewModel olduğunda ve bir Görünümün ne zaman olması gerektiğini anlamaya çalışıyorum bunu yapmıyor çünkü Sunum Yapanın işi bu ve--

Şaşırıyorum.

Birinden aralarındaki farkı açıklamasını istemekten ziyade - çünkü bu zaten defalarca yapıldı (biliyorum; sayabileceğimden daha fazla makale okudum) - Bir düşünceyi duymak isterim Model üzerinde birkaç programcı kendim toplandım.

Bununla birlikte, bu tasarımı ne olarak sınıflandırırsınız ve belki de daha da önemlisi, bunun hakkında açıkça berbat bir şey görüyor musunuz? Tabii, bu gerçekten sağlam bir tasarımsa iyi yaptığımı duymak isterim, ama övgü konusunda sağlam bir tavsiye vermeyi tercih ederim.

Not: Model Görünümü'nün gizemli üçüncü kısmı için "Köprü" kullanacağım. "olması gereken" şeyin bilinçaltı önerilerinden kaçınmak için.

model

  • Veriler üzerinde otoritedir.
  • Köprüden istenen değişiklikler hakkında bilgi alır.
  • Verilerin diğer verilerle ilişkisine ilişkin tüm mantığı içerir ve gerçekleştirir.
  • Veri değiştiğinde Bridge'i bilgilendirir (Bridge'in ilgilendiğini ifade ettiği veriler için). Kelime düzenleme: Dış abonelerin (hakkında hiçbir şey bilmediği) durumunu veya hesaplama sonuçlarını izlemesine izin verir.
  • Görünüm hakkında sıfır bilgiye sahiptir.

Görünüm

  • Kullanıcıya verileri görüntülemek ve işlemek için bir yol sağlamakla ilgilenir.
  • Bridge'den veri güncellemeleri hakkında bilgi alır.
  • Kullanıcıya veri ve kontrollerin nasıl sunulacağı ile ilgili tüm mantığı içerir ve gerçekleştirir.
  • Kullanıcı, Modeli (muhtemelen) etkileyen bir eylem gerçekleştirdiğinde Bridge'i bilgilendirir.
  • Köprüye hangi bilgileri ilgilendirdiğini bildirir.
  • Model hakkında sıfır bilgiye sahiptir.

Köprü

  • Model ve Görünüm arasındaki koordinatör ve çevirmen.
  • Model ile Görünüm arasında iletilen bilgilerde uygun biçimlendirme değişikliklerini yapar.
  • "Kimin neyi bilmesi gerektiğine" ilişkin bilgileri tutar.
  • Hem Model hem de Görüş bilgisine sahiptir.

ek Notlar

  • Daha karmaşık programlarda, birden fazla Model olması yaygındır. Bu durumda, Köprü tipik olarak çoklu Modeller arasında koordinasyon / çeviri işini üstlenir ve böylece protocall / API / tasarım Modellerinin ne şekilde inşa edilmesi gerektiği konusunda otorite olur. (örneğin, bir kart oyunu programı oluşturuyorsanız ve alternatif bir deste karıştırma modeli oluşturmak istiyorsanız, Bridge ile düzgün iletişim için hangi işlevlerin gerekli olduğunu belirlemek için Bridge'i kullanmalısınız.)
  • Yalnızca bir Görünüm ve Model içeren küçük basit programlarda, Bridge'in her iki tarafta hangi işlevselliğin mevcut olduğunu "varsayması" yaygındır. Ancak, programlar daha karmaşık hale geldikçe, Görünümlerin ve Modellerin işlevlerini Köprü'ye rapor etmeleri önerilir, böylece verimsizliklerden ve buggy varsayımlarından kaçınabilir.

Bence neredeyse örtüyor. Elbette, kullanmaya eğilimli olduğum tasarımla ilgili sorularınızı memnuniyetle karşılıyorum ve aynı şekilde herhangi bir öneriyi teşvik ediyorum.

Ve her zaman olduğu gibi, zaman ayırdığınız için teşekkür ederim.


2
Görünüm bloğunda bir kopyala yapıştır hatası var. Sanırım son mermi "Modeli sıfır konwledge var" okumalıdır. Ve 1 ek notun son cümle muhtemelen "köprü" değil "model" ile bitmelidir ??
Johannes S.

Yanıtlar:


7

İfadeniz

"Model ve Görünüm arasındaki koordinatör ve çevirmen."

Bridge'inizin bir MVP mimarisinde Sunucu olduğunu belirtir.

MVP ve MVC çok benzerdir, ancak MVP'de yalnızca Sunum Yapan kişi Modeli gözlemler, MVC'de ise Görünüm doğrudan Modeli gözlemleyebilir (Sunum Yapan "Köprü" olmadan).

Model sorumluluğunuz

"Veri değiştiğinde Bridge'e bilgi verir (Bridge'in ilgilendiğini ifade ettiği veriler için)."

belki de yanlış bir şekilde ifade edilmiş olabilir veya belki de bir hatadır: Modelin Bridge / Presenter / Controller veya View'a bağımlı olmasını istemezsiniz. Bunun yerine, Bridge'in Modeldeki değişikliklere abone olmasına izin vermek için bir Gözlemci deseni, Olaylar veya Reaktif Programlama kullanırsınız . Ve sonra sorumluluğunuzu şöyle ifade edebilirsiniz:

"Dış abonelerin (hiçbir şey bilmediği) durumunu veya hesaplama sonuçlarını izlemesine izin verir."

Modelinizin Denetleyicinize veya Görünümünüze bağımlılığı yoksa, test edilmesi daha kolaydır ve çok daha taşınabilirdir.


1
Anahtar fark, Görünüm Modeli gözlemleyebiliyorsa veya gözlemleyemiyorsa, tasarım kesinlikle daha fazla MVP'dir; Görünüm ve Modelin asla kullandığım tasarımda konuşmasına izin verilmez.
KoratDragonDen

Bence Model sorumluluğu zayıf bir ifadeydi. Modelin, onu dinlemek isteyen şeylerin kim / ne / nedenleri hakkında bir ipucu veya ilgisi yoktur, ancak abonelerine yapılan değişiklikleri yayınlayacaktır. Herhangi bir aboneye ihtiyaç duymadan tek başına var olmak mükemmel bir içeriktir ve yeni aboneler istemeye teşebbüs etmez.
KoratDragonDen

1
Öyleyse iyi bir tasarımın varmış gibi görünüyor. Not: MVC'yi MVP üzerinden değerlendirmenin nedeni , disiplin olmadan Sunum Yapan'ın aşırı yük bindirilebilmesidir.
Larry OBrien

1
Sadece MVC ve MVP arasındaki farkı belirtmek için +1. OP gibi, internetin geri kalanı bu kısaltmaların en ufak bir fark olup olmadığı konusunda beni tamamen kaybetti.
Ixrec

5

Sizi şaşırtan şeylerden biri, her ikisi de yaygın olarak model-görünüm denetleyicisi olarak adlandırılan tamamen farklı iki şablon olduğundan şüpheleniyorum.

Smalltalk'te uygulanan ve yerel gui sistemleri için yararlı olan orijinal var ve denetleyicilerin sunucuda oturabilmesi için görünümlerin ve denetleyicilerin bazı sorumluluklarını değiştiren web-mvc olarak düşündüğüm şey var istemcide görüntülenme (belki de html olarak işlenmiş veya belki de ajax aracılığıyla).

Açıklamanız bana web-mvc'nin çoğu tanımında oturacakmış gibi geliyor.


Bu, neden kafamı kavramın etrafına sarmakta çok fazla sorun yaşadığımı açıklayabilir. Teşekkür ederim; MVC kavramıyla korkunç bir şekilde yanlış bir şey yapmadığımı (muhtemelen) bilmek güzel.
KoratDragonDen

Modern tek sayfalık web uygulamaları için, istemci tarafında klasik MVC modeline geri dönüyoruz.
kevin

2

Programlama camiasında bu isimlendirme hakkında çok fazla tartışma var. Hiç kimse bir şey hakkında anlaşamıyor gibi görünüyor.

Benim için köprünün görünüme nasıl bağlandığı çoğunlukla adı belirler.

  • Köprü başına bir görünüm koleksiyonu varsa, köprü bir denetleyicidir.
  • Köprü başına her zaman bir görünüm varsa, köprü bir sunumcudur.
  • Görünüm başına bir köprü koleksiyonu varsa, köprü bir görünüm modelidir.

Bazen işler o kadar net kesilmez. Örneğin, bir sunucu, birden fazla alt görünümden oluşan bileşik bir görünüme bağlanabilir veya kendi görüşlerini bilmeden bir denetleyici oluşturulabilir. Buna rağmen, kurallarımın iyi bir başlangıç ​​olduğunu düşünüyorum.


Bir yan not olarak, bu gibi sorumlulukları eşleştirmeyi seviyorum:

model

Birincil Sorumluluk: Kalıcı veriler
İkincil Roller: Güncellemeleri doğrulayın, gözlemcilere güncellemeleri bildirin

Görünüm

Birincil Sorumluluk: Mevcut veriler
İkincil Roller: Girişi kabul et, mevcut UX

Köprü

Birincil Sorumluluk: Verileri güncelleme
İkincil Roller: Girişi temizle, verileri ve görünümleri senkronize et


0

Önerdiğiniz desen yüzeyde doğru görünse ve şüphesiz küçük örnekler için çalışacak olsa da, uygulamanız daha karmaşık hale geldiğinde, neyi güncellediğinden, neyi nerede dinlediğinden ve neden denediğimden emin olmadığınız sorunlarla karşılaşırsınız. hepsi birbirinden erişime ihtiyaç duyan çok sayıda Görünüm içinden çok sayıda Modeli kontrol etmek için

Fikirlerinizi aşağıdaki modeli kullanarak genişletmenizi tavsiye ederim (Amy Palamountain'ın Enemy of the State'in konuşmasından alınmıştır ):

Modeller

  • Durumu veri deposuyla senkronize etme
  • Yeni / güncellenmiş verilerin doğrulanması
  • Durumu değiştirdiklerinde olayları yükseltme

Görüntüleme

  • İşleme şablonları
  • Model olaylarını işleme
  • DOM olaylarını işleme
  • Model ve DOM arasındaki etkileşime aracılık eder

Kontrolörler

  • En fazla birkaç Model ve Görünüm'ü yönetir
  • Bir kapsayıcıdaki Görüntüleme kaydını tutar

Modüller

  • Bir Denetleyicinin mantıksal gruplanması ve Görüşleri ve Modelleri
  • Test edilebilir
  • Küçük ve bakımı yapılabilir (Tek Sorumluluk)
  • İçerdiği Görünüm ve Modellerin durumunu ve olaylarını (Kontrolör aracılığıyla) koordine eder
  • Kendi görüşlerini sunmak ücretsiz
  • Görüşlerini nerede sunacağını seçmekte özgür değilim

Düzen Yöneticisi

  • Düzen kompozisyonundan sorumlu
  • DOM'da, Modüllerin içeriklerini sunabileceği alanlarla bir uygulama kabuğu tanımlar

hareket memuru

  • Etkinlikleri Dinler (global PubSub akışı üzerinden)
  • Etkinliklere dayalı yeni Modüllerin yüklenmesinden sorumludur
  • Yüklü Modülleri Layout Manager'a bırakma
  • Tüm Modül ömrünü yönetir (oluşturma, temizleme, önbellekleme, vb.)
  • Etkinlik örnekleri:
    • Rota değişiklikleri (ilk yükleme rotası dahil)
    • Kullanıcı etkileşimi
    • Modül olayı, sunucu tarafı durum değişikliği vb. Nedeniyle bir Model olayından köpürdü.

Uygulama

  • Genel kurulumdan sorumlu olan,
    • hareket memuru
    • Yönlendirici
    • PubSub akışı
    • zararlılarına
    • vb

Bu tür desen, uygulamanızın oluşturulabilir olmasını, birim test edilmesini sağlar, bir Köprünün zamanla oluşturacağı karmaşıklığı ortadan kaldırır, endişeleri güzelce ayırır, vb.

Amy'nin belirttiği gibi: İstemcide bir sunucu oluşturmamaya dikkat edin. Ve "MV * çerçevesi yapıyorum, bu yüzden ___!" Doktrininin içine düşmemeye dikkat edin. Bunun yerine, tüm bu fikirleri (ve diğer yanıtları burada) alın ve uygulamanız ve ekibiniz için en iyi olanı bulun.

Amy Palamountain'ın Enemy of the State (bu fikirlerin geldiği yer) konuşmasını izlemenizi ya da en azından konuşmadan slaytlara bakmanızı tavsiye ederim .

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.