Bir manken ve manken iletişim kurmalı mı, istememeli mi?


33

MVC mimarisinin wikipedia sayfasına göre , görüş model tarafından bildirilmekte özgürdür ve aynı zamanda modeli mevcut durumu hakkında sorgulamakta özgürdür. Bununla birlikte, Paul Hegarty'nin Stanford'daki iOS 5'teki kursuna göre , 1. ders, sayfa 18, tüm etkileşimlerin denetleyiciden geçmesi gerekir, Model ve View hiçbir zaman birbirlerini tanımaz. Hegarty'nin açıklamasının kurs için basitleştirme amaçlı olması gerekip gerekmediği bana açık değil, ancak tasarımı bu şekilde niyetlendiğini söylemek için sabırsızlanıyorum.

Bu iki zıt görüşü nasıl açıklarsınız?

Yanıtlar:


26

Bu, MVC / MVVM'deki tartışmalı bir konudur. Bazıları Görünümün Modellere doğrudan erişmesinin uygun olmadığını, bazıları Görünümden uzaklaşmak için Modelleri ViewModels'a sarmanız gerektiğini söylüyor. Şahsen ben her iki yaklaşımın hayranı değilim.

MVC / MVVM'nin temel amaçlarından biri, kullanıcı arayüzünü, işletme mantığını ve verileri ayırmaktır. Dolayısıyla, bu kavram göz önünde bulundurulduğunda, Görünümün Modellere doğrudan erişmesini sağlamak, sahip olmak istemediğiniz bir bağımlılık yaratır. Öte yandan, Modelleri ViewModels'e sarmak genellikle sıkıcıdır ve ViewModels Modellere doğrudan bir geçiş görevi görmeye meyilli olduğu için çok yararlı değildir.

Modellerinizin belirli bir arayüze sahip olma yaklaşımını seviyorum, IModel diyelim. ViewModel sınıfınız daha sonra View tüketimi için IModel uygulayan nesnelerin örneklerini sunabilir. Görünüm, ViewModel'den aldığı IModel nesneleriyle çalıştığını bilir. Bu, yabancı ViewModel sarıcı kodunu kaldırır ve IModel'in somut uygulamasını Görünüm'den gizler. Daha sonra View bir bitini etkilemeden bir IModel uygulamasının bir diğeri için takas edebilirsiniz.


1
Bir modelin bir görünüm modeline eşleştirilmesinin sıkıcı yönleriyle ilgili olarak, haritalama ağrısını kolaylaştırabilecek araçların olduğu belirtilmelidir. EG: (.NET AutoMapper) (JAVA model eşleştiricisi)
Jesse,

+1 Harika cevap! Bu, modelinizin karmaşıklığına bağlı olarak harika bir yaklaşımdır, ancak günümüzde çoğu model Anemik tipindedir. Modelin unsurları, davranışı olmayan veri nesnelerinden biraz daha fazla olduğu için, Görünümünüzün Modelinize doğrudan ulaşması için böyle bir soyutlamaya ve çok az tehlikeye gerek olmadığını çok az görüyorum.
maple_shaft

2
Ne dediğini duyuyorum; IModel arabirimlerinin çoğu, basitçe bir sürü özellik bildirimi ve birkaç (varsa) yöntem bildirimi içerir. Ancak, Modeller anemik olsa bile, arayüz, Görünümü somut uygulamalarından hala ayırıyor. Bu ayrım her proje için gerekli olmayabilir, ancak seçeneklerinizi açık tutmak her zaman iyi bir fikirdir.
Raymond Saltrelli

1
Kafam karıştı, eğer kesinlikle farklı bir görünümünüz varsa, bir arayüze tıkanmadan nasıl güvenebilirsiniz? Bence Görünüm Modelleri harika .. Uygulamanız boyunca kullanılabilecek kadar jenerik olan Modeller yaratıyorsunuz ve bir veya daha fazla Model tüketmek ve ek olarak yalnızca bu görünüm tarafından kullanılacak işlemleri uygulamak için Görünüm Modelleri oluşturuyorsunuz.
Çörek Adam

12

İnternette, herkes ayrılma MVC'sini çağırır.

C # gibi bazı teknolojiler MVVM kullanır, çünkü Görünüm ile diğerleri arasında hiçbir bağlantı yoktur, her şey servis bulucudan geçer ve değişkenleri bağlar.

Saf MVC'de View, doğrudan Model ile ve tam tersi olarak konuşuyor. Denetleyici yalnızca herhangi bir değişiklik olduğunda var olur.

Ve sonra, PAC (Sunum Soyutlama Kontrolü) adı verilen bir tane var. Bu mimaride, Görünüm ve Model birbirleriyle konuşmuyor. Denetleyici, Görünüm veya Model ile herhangi bir şey yapmanıza izin verilen tek kişidir. İnsanlar bunu genellikle MVC ile karıştırırlar.

Burada daha iyi bir açıklama göreceksiniz: http://www.garfieldtech.com/blog/mvc-vs-pac


7

Benim için bir mimarinin temel amacı, geleceğin yeniden yapılanma girişimlerini engellememesidir. Tipik olarak, bu gereksinimle doğrudan modellerin birbiriyle etkileşime girdiği görünümler ve bu olmadığı zaman oldukça açıktır.

Bir görünüm bir modelle çok yakından ilgilendiğinde, bir ViewModel güzel bir şey olabilir, ama genellikle benim için çağrıldığı örneklerin azınlıkta olduğu durum benim için geçerli.


6

In MVC Paul Hegarty yanlıştır. Denetleyici, model-görüş iletişimi değil kullanıcı olaylarıyla ilgilidir. Klasik MVC'de görünüm (ler) modeli gözlemler (gözlemci deseni).

Arabuluculuk yapmak arasındaki adamla, örüntüye MVP adı verilmelidir ve aslında bugünlerde MVC olarak sunulanların çoğu MVP'ye daha yakındır.

O zaman her ikisine de benzer olan, ama biraz daha farklı ve uzun zaman önce var olan MVVM var ... bunu görmek için en iyisi, viewmodel nesnesiyle birbirine bağlanmış iki MVC / MVP olarak görülmesi en iyisidir - "müşteri" onun modeli ve "sunucu" MVC görünüm olarak viewmodel vardır.


1
Bugün (2014'ün başlarında) bana (düğüm ve açısal yığımla birlikte) "müşteri" MVC ve "sunucu" MVC'deki bu ayrım çok alakalı ve bir şekilde aydınlatıcı görünüyor. (teşekkür ederim)
slacktracer

4

Özellikle Stanford'daki konferanslardaki materyalleri sorduğun için, Hegarty'nin tutumu hakkında iki şeyi göz önünde bulundurmaya değer:

  1. Bahsettiğiniz gibi, l00 seviyeli bir Computer Sci kursu dersi veriyor. Derslerinde basitleştiği, ayrıntılara dolaştığı veya “sadece bu şekilde yapın” dediği birçok ders var, temel olarak öğretirken yapacağı gibi, yani kuralları çiğnemeden önce ustalaşmalısın.
  2. İOS SDK ile olan deneyimim, View ve Model arasında kesin bir ayrım yapmayı zorlamadığı durumlarda , bu desene yoğun bir şekilde yönelik olmasıdır. Özellikle iOS uygulamalarını yazarken, model görünüm ayrımına uymak, çerçevenin beklentileri doğrultusunda kod yazmanıza yardımcı olur. Hegarty'nin ifadelerini diğer platformlarda veya genel olarak geliştirme konusunda genelleştirmek konusunda tereddüt ediyorum.

1

Paul Hegarty ile aynı fikirdeyim ve Görünümün Modeli hakkında bilmemesi gerektiğine inanıyorum. Ulaşılması o kadar zor değil ama tasarımınıza ve gelecekteki esnekliğinize ilave faydalar sağlıyor.

"Sahte" ViewModel sınıflarından kaçınmak ve her şeyi basit tutmak istediğim küçük uygulamalarda (genellikle masaüstü), IModel arabirimini de kullanıyorum (yukarıdaki cevaba bakın) ve Modelin Görünümle ilgili hiçbir fikri olmamasına dikkat edin (aboneleri kullanın) klasik MVC'deki gibi).

Ayrıca, bu durumda Kontrolör, Görünüm ile tamamen eşleşmiştir ve basitlik için, onları her zaman açıkça ayırmıyorum.

İkinci model “basitleştirilmiş” yaklaşım, aynı model için birkaç görüşünüz olabilirken tamamdır, ancak aynı görünümü farklı modeller için kullanmak istiyorsanız bunu tavsiye etmem. Farklı olarak, ana modeli “takip eden” sadece JUnit test sınıfları değil, tabiat itibariyle gerçekten farklı demek istiyorum.


1

Bunun için hızlı ve sert bir kural olmadığına inanıyorum, tamamen sizin ihtiyaçlarınıza bağlı.

Farklı inançlara sahip insanları bulacaksınız. Mimariler, daha iyi çözümler tasarlamaya yardımcı olan kavramlardır.

Model görünümü iletişiminden ayrı olarak, MVC'deki iş mantığı ile ilgili bir çelişki daha var. Birçok insan tüm iş mantığının bir model olması gerektiğine inanıyor ( bu SO sorusuna bakın ), diğer yandan Florian'ın paylaştığı bağlantı (cevabında) iş mantığının denetleyici üzerinde olması gerektiğini söylüyor.

Bunun dışında iş mantığını Uygulama mantığına (kontrol ünitesine koy) ve Etki alanı girişini (modele koyma) bölme olasılığı vardır.

Öyleyse, hikayenin ahlaki MVC anlamına gelir modeli, görünüm ve denetleyici ayrı olmalıdır. Bunun dışında size en uygun olanı.


0

Model görünümü iletişimi için DTO kullanıyorum.

Örneğin:

  • Kullanıcı Güncelleme Formunu doldurur (Görüntüle)
  • Kullanıcı form gönderir
  • Denetleyici form verilerini UserUpdateDTO'ya bağlar
    • DTO ve UserModel POJO'lar, ancak DTO'nun kimliği ve kullanıcı adı yok, çünkü kullanıcı adını güncelleyemiyoruz.
    • Başka bir fark Model sınıfının ilişkileri ve ilişkileri vardır, ancak DTO yalnızca verileri depolar ve buna JSR 303 doğrulayıcıları ekleyebiliriz.
  • Kontrolörler tasarruf için servis katmanına diyor
  • Servis katmanı, verileri sürdürmek için DAO katmanına diyor.

-1

Manzaranın asla modelle iletişim kurmaması gerektiğini söyleyen kamptayım. Kontrolör her zaman her şey için go-to-go olmalı, daha sonra ne yapılacağına karar verir (onayla, modelden veri iste, vb.).

Daha fazla herhangi bir şeyi örgütsel bir mesele olarak görmeye meyilliyim.


-1

Görünümün ve modelin farklı bağlamlarda özgürce neden etkileşime girmesi gerektiğine dair birçok önerildiği gibi, ancak iOS'ta Denetleyiciyi yapmanın asıl nedeni aralarında arabulucudur; kod tabanınızdaki Model & View bağımlılıklarını önlemek ve yeniden kullanmamıza izin vermek iOS'un evrimleşmesiyle gereksinimlere göre model veya görünüm.

Uygulamalarımızda güncellemeleri UI / UX veya Model'de veya bazı zamanlarda her ikisinde de tutmamız gerekebileceğinden, model ve görünüm arasında mod bağımlılık kodu üretmemelidir. Uygulamanızın Sunum katmanını değiştirmek istiyorsanız, değiştirdikten sonra yine aynı Modeli tekrar kullanabilirsiniz ve bunun tersi de yapılabilir.

Her ne kadar iOS'taki MVC'nin içinde çok sayıda mantık bulunan dev ViewControllers ürettiğine ve amaçlandığı dışındaki her türlü konuyu ele almasına razı olmama rağmen. daha küçük ViewControllers ile okumak ve bakımları yapmak için.

Bu, iOS'ta daha küçük ViewControllers'ı arayanlara yardımcı olabilir:

http://blog.xebia.com/simplification-of-ios-view-controllers-mvvm-or-presentation-controls/

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.