Neden bir MVC deseni kullanmalıyım?


74

Bugünlerde web uygulamaları yapan herkes MVC'yi her şey için kullanmak istiyor. Bununla birlikte, kendimi bu modeli kullanmaya ikna etmekte zorlanıyorum. Genel fikrin arka uç mantığını programı temsil eden ön uçtan ayırmak olduğunu biliyorum. Genel olarak, görünümlerin her zaman denetleyiciye bağlı olduğu ve modele bağlı olarak ortaya çıktığı görülmektedir. Denetleyiciyi eklemenin ne avantaj sağladığını anlamıyorum. "Bu, uygulamaların tasarlanması gereken yoldur" hakkında bir çok yutturmaca okudum, ama belki de nereye gitmesi gerektiğini hala anlamıyorum. Ne zaman MVC hakkında başkalarıyla konuşsam, herkesin hangi kategoriye ait olduğuna dair farklı bir fikri varmış gibi görünüyor.

Öyleyse neden MVC kullanmalıyım? Sadece ön ucu arka uç mantığından ayırarak MVC kullanarak ne kazanırım? (Bu örüntüyü gördüğüm çoğu "avantaj", sadece arayüzün uygulamadan ayrılmasıyla elde edilir ve ayrı bir kontrol cihazına sahip olmanın amacını açıklamakta başarısız olur.)


9
MVC sadece Endişeler Ayrımı'nın bir uygulamasıdır . Herhangi bir uygulama yapacak. Ayırma Endişeleri kullanmamak, büyük bir çamur topuna
Raynos

1
@Raynos: Belki de. Ama bu "yutturmaca" nın gittiği yer değil.
Billy ONeal

3
yutturmaca yutturmaca eğrisine uyar . Seni çok fazla etkilemesine izin verme. Benim bakış açıma göre, MVC SoC için sağlam bir mimaridir ve uygulaması kolaydır. Sağlam bir alternatif düşünemiyorum.
Raynos

mevcut kullanıcı arabirimi çerçevelerinin çoğu V ve C'yi sıkıca bağlar ve diğerine geçtiğinizde hem görünümü hem de denetleyiciyi yeniden yazmanız gerekir (M'nin kullanıcının gördüğü ile ara yüzüne kadar)
mandal ucube

Ancak Endişelerin Ayrılması, OO gelişiminin bir özelliğidir. Doğru bir Kaygı Ayrımı kodunu uygulamak için bir MVW modeli kullanmak zorunda değil misiniz?
Bastien Vandamme

Yanıtlar:


50

Heh. Martin Fowler, MVC hakkındaki kafa karışıklığınıza katılıyor:

MVC'yi bir kalıp olarak düşünmeyi çok faydalı bulmuyorum çünkü oldukça az sayıda farklı fikirler içeriyor. Farklı yerlerde MVC'yi okuyan farklı insanlar ondan farklı fikirler alır ve bunları 'MVC' olarak tanımlar. Bu, yeterince kafa karışıklığına neden olmazsa, o zaman bir Çinli fısıltı sistemi ile ortaya çıkan MVC'nin yanlış anlamalarının etkisini elde edersiniz.

Bununla birlikte, MVC'yi neyin motive ettiği ile ilgili daha net açıklamalardan birini vermeye devam ediyor:

MVC'nin merkezinde "Ayrılmış Sunum" olarak adlandırıyorum. Ayrılmış Sunum'un arkasındaki fikir, gerçek dünya algımızı modelleyen alan nesneleri ve ekranda gördüğümüz GUI öğeleri olan sunum nesneleri arasında net bir ayrım yapmaktır. Etki alanı nesneleri tamamen kendi içinde bulunmalı ve sunuma atıfta bulunmadan çalışmalı, muhtemelen aynı anda birden fazla sunumu da destekleyebilmelidir.

Sen Fowler makalenin tamamını okuyabilirsiniz burada .


19

Bunun, uğraştığınız soruna bağlı olduğunu hissediyorum. Ayrımı şöyle görüyorum:

Model - verileri nasıl temsil ediyoruz? Örneğin, nesnelerimden DB - gibi kalıcı bir depolamaya nasıl gidebilirim? 'Kullanıcı' nesnemi veritabanına nasıl kaydederim?

Denetleyici - ne yapıyorum? Gerçekleşen eylem budur ve kavramsal düzeyde yapılması gerekenler. Örneğin, bir kullanıcıyı faturalandırmak için hangi aşamalardan geçmem gerekiyor? Not Bu, herhangi bir miktarda nesneyi etkileyebilir, ancak bunların DB'ye nasıl ısrar edildiğiyle ilgili hiçbir şey bilmiyor.

Görüntüle - sonucu nasıl oluştururum?

Gördüğüm sorun, bir çok web uygulamasının bir DB'ye yüceltilmiş bir CRUD (Yarat-Al-Güncelle-Sil) arayüzü olmasıdır. yani kontrolöre bir kullanıcı eklediği söylenir ve daha sonra da modele 'bir kullanıcı eklemesini' söyler. Hiçbir şey kazanılmadı.

Ancak, gerçekleştirdiğiniz eylemlerin doğrudan modeldeki değişikliklere uygulanmadığı projelerde, bir denetleyici hayatı çok daha kolay hale getirir ve sistem daha sürdürülebilir hale gelir.


1
“Gerçekleştirdiğiniz eylemlerin doğrudan modeldeki değişikliklere uygulanmadığı projelerde“ Buradaki “model” ile ne kastediyorsunuz? Veritabanı? Çünkü konuştuğum herkes, böyle eylemlerin hala denetleyicilere değil, bir modele ait olduğunu söylüyor. (örneğin, kontrolörler yalnızca HTTP ile ilgili olmalı ...)
Billy ONeal

Ne HTTP şeyler sayar? Bir denetleyiciye şunları eklerdim: İstenmeyen HTTP istek parametrelerini, temel akıllık parametrelerini kontrol etmek, ne yapılması gerektiğini belirlemek, uygun model nesnelerini ziyaret etmek (okumak, yazmak veya her ikisi için), modelin yanıtlarına dayanarak nihai bir sonuç üretmek; , o manzaraya geçerek. Sadece kontrolörün kullanabileceği aptalca bir örnek, rastgele sayı üreten bir web servisi olabilir - bu durumda bakılacak bir 'model' yoktur (aklımda ...)
Unk

Bunların hepsi model kaygıları. “Neyin yapılması gerektiğine karar vermek” bile (“ön kontrolör”) bile bir model.
Billy ONeal

2
Bahsetmiyorum bile denetleyiciler modellerinizi görüşlerinize zorla bağlamak için kullanışlıdır. Tek bir kontrol cihazıyla birçok görünümü birçok modele bağlamanıza izin verir.
Raynos

1
@Billy: Bir görüntünün modelle "karışıklığa uğramasına" izin verirseniz - değerleri için sorgulamadan başka - denetleyicilere daha çok benzeyen görünümlerle sonuçlanırsınız. MVC'nin Model-GUI-Mediator enkarnasyonu konusunda daha fazla düşünüyorum. Kontrolör, Model (alanın davranışı ve verileri) ve GUI (modelin ekran gösterimi) arasında aracılık eder. Görünüm yalnızca denetleyiciye etkileşimi iletir (kullanıcı tıklandı ...). Denetleyici, neyin (varsa) modelde aranması gerektiğine karar verir. Faydaları: ...
Marjan Venema

8

Yapmamalısın.

Bunu tekrar ifade etmeme izin ver. Mantığı görüşlerinizden ayıran bir mimari kullanmalısınız. Gerekirse, mutlaka bir modele uyması gerekmeyen bir mantık varsa (örneğin, ağaç geçişi ayrıştırma URL'si parçaları gibi) bir denetleyici (MVC gibi) kullanan bir mimari kullanmalısınız.

CI ve Yii'den gelince, özel bir denetleyiciye sahip olmanın gerçekten harika bir fikir olduğunu düşündüm. Bununla birlikte, uygun RESTful arayüzleri olan uygulamalar geliştirirken, modele özgü olmayan bir mantığı idare etmek için bir kontrol cihazına duyulan gereksinimin azaldığı görülmektedir. Böylece, Django ve daha sonra Pyramid'e taşınırken (hiçbiri MVC mimarisini tam olarak takip etmiyor), kontrol cihazının aslında geliştirdiğim uygulamalar için gerekli bir bileşen olmadığını gördüm. Her iki çerçevenin de, Piramit'te URL Gönderme gibi "controller'ish" özelliklerine sahip olduğunu ancak bir çalışma zamanı değil (Yii'deki CController gibi) bir yapılandırma işlemi olduğuna dikkat edin.

Günün sonunda, asıl önemli olan görüşün mantıktan ayrılmasıdır. Bu sadece uygulama açısından işleri temizlemekle kalmaz, aynı zamanda FE / BE mühendislerinin paralel olarak çalışmasını sağlar (ekip ortamında çalışırken).

(Not: Web uygulamaları profesyonelce geliştirmiyorum, bu yüzden eksik olduğum bir şeyler olabilir)


Tamamen katılıyorum, iyi cevap. Kontrolör her zaman gerekli değildir, sadece modelle iletişim kurmak için bir strateji olarak düşünülmüştür.
Falcon

@Falcon: Gördün mü, kafam karıştı. Birden fazla kişinin görüşün denetleyiciyle hiç konuşmaması gerektiğini söylediğini gördüm; sadece mankenle konuşması gerektiğini ...
Billy ONeal

1
Eğer gerçek bir MVC uygulaması kullanıyorsanız, görünüm vermez denetleyici (ya da bu konuda modeline) ile konuşun. Denetleyici modelin durumunu belirler, verileri görünüm için hazırlar ve görünüme iter.
Demian Brecht

@Demian: Tersini duydum (denetleyicilerin etkili bir şey yapmaması gerekir). Sıklıkla. Bu modeldeki en büyük sorunum bu; kimse ne olduğu konusunda hemfikir değil gibi görünüyor.
Billy ONeal

3
Evet, sık sık bir odada 10 programcı alırsanız, MVC'nin ne olduğuna dair 9 farklı tanım alacağınızı duydum. Gerçekten, asıl nokta endişelerin ayrılmasıdır. Başka neler oluyor dini bir tartışma gibi görünüyor.
Demian Brecht

1

Evet, bununla ilgili terminoloji bir karmaşa. Konuşması zor çünkü birilerinin terimlerle ne demek istediğini asla bilemezsin .

Ayrı bir denetleyicinin nedenine bakılırsa, sebep, denetleyicinin hangi sürümünden bahsettiğinize bağlı olabilir.

Bir denetleyici isteyebilirsiniz, çünkü testler yaptığınızda görünümde yazmadığınız ve muhtemelen test etmek istemediğiniz bir sürü widget vardır. Evet, uygulamayı mirastan ayırdınız, böylece diğer şeyleri test etmek için bir saplama ya da alay kullanabilirsiniz, ancak somut görüşünüzü test ederken bu daha zordur. Aynı kodu çalıştıran hiçbir widget'ı olmayan bir denetleyiciniz varsa, bunu doğrudan test edebilirsiniz ve widget'ları komut dosyasıyla test etmeniz gerekmez.

Diğer versiyonlar IMHO'nun somut bir fayda göstermesi daha zor. Sanırım çoğunlukla endişelerin bir ayrılık sorunu olduğunu düşünüyorum - saf görsel GUI endişelerini GUI için geçerli olan ama iş modelinin bir parçası olmayan mantıktan ayırın (örneğin, widget'ların görünür olması gereken güncellemeleri tercüme etmek gibi). Ancak pratikte iki sınıfın çok sıkı bir şekilde birleşmesi muhtemeldir (arayüzler üzerinden iletişim kursalar bile), onları sadece bir görünüme birleştirirken aşırı derecede üzülmek ve sadece işlevselliğin daha tekrar kullanılabilir olabileceği yollara dikkat etmek zor eğer bölünmüşlerse.


0

Basitçe söylemek gerekirse: endişelerin ayrılması. Bir şeyleri yapmanın "doğru" yolu, daha temiz kod, vb. Hakkında yapılan tüm konuşmaların yanı sıra, MVC'nin kodunuzu daha kolay yeniden kullanmanıza izin verdiğini söyleyebilirsiniz. Temel olarak, modellerinizi ve kontrol cihazlarınızı programlıyorsunuz ve bir web uygulamasında, bir masa uygulamasında, bir hizmette ve çok fazla çaba harcamadan, herhangi bir yerde ayırt etmeden kullanabilirsiniz.


2
Bu, bir UI katmanını ve işlevsel bir katmanı tanımlamaktan farklı değildir. Denetleyici bitinin neden gerekli olduğunu açıklamamışsınız.
Billy ONeal

-3

Bir MVC yapısı kullanmanın temel nedeni, tek bir iş sürecinin herhangi bir uygulamanın geliştirilmesi için tek bir modelin takip edildiği bir endüstri kurulumunda ortaya çıkmaktadır. Bu nedenle, eğer proje bir organizasyonun bir modülünden diğerine geçerse, çalışma senaryosunun daha iyi anlaşılmasını sağlamak çok daha kolaydır. İşin netliğini içerir.
Siz, bir bireyin başvurunuz için farklı bir yaklaşımı varken, siz bir ortakla birleşik bir şekilde çalışırken, ilk önce, ikiniz (ortak arkadaşınız) tarafından kabul edilen bir model üzerinde tartışırsınız. Ve böyle bir durumda, size ve eşinize verilen sorumlulukları ayrı bir marjla ayırır.


-3

Bence MVC, yöneticileri olan teorisyenlerin bildiği gibi bir terim kullanıyor. Bununla birlikte, web'in HTML5 ile geçerli, yinelenen ve duyarlı bir tasarıma sahip olan yinelemesini ve web üzerinde ve bir iPhone'da çalışacak tek bir veritabanı programlama satırı oluşturmaya çalışmanın MVC'nin genel fikirlerine katkısı olduğunu söylemiştik. Web ön uç teknolojisi tam anlamıyla ışık hızında, şu anda Jquery, yeni CSS kontrolü yinelemeleriyle hareket ederken, nesnelerin sunucu tarafı bir salyangoz hızında ilerliyor.

Sonunda, sunucudaki her şey gerçekten sadece verileri ön uca pompalayan hizmetler veya "uygulamalar" olacak ve ne tür bir müşteriye bağlı olduğunuza göre, bu veriler farklı şekilde tüketilecek ve gösterilecektir. Bu anlamda, MVC anlamlıdır.

Bu açıdan, şu anki gerçek dünyaya inanıyorum, MVVM gerçekten daha iyi bir "model" ya da bir denetleyiciden daha ne demek istediğinizi çünkü bir denetleyicinin görünümü değiştirmek için her zaman modele geri dönmesi gerekir ve bu yavaş . MVVM modelinde ViewModel görünüme anında güncelleme yapabilir. Ayrıca, MVVM modeli, RESTful tasarım prensipleri IMHO'yu da teşvik etmektedir.


Bu sadece senin fikrin mi, yoksa bir şekilde mi destekleyebilirsin?
tatarcık

3
(oy kullanmadı) Eh, eğer öyleyse, şu an 40+ yıldan beri devam eden bir terim oldu.
Billy ONeal

2
MVC paterninin kökeni ve MVP ve MVVM gibi ortaya koyduğu ek paternler hakkında ek araştırmalar yapmanızı tavsiye ederim. Mevcut buzzwordiness inanmanıza yol açacak olandan çok daha fazla geçmiş var.

1
Gönderen Model View Controller History :. "MVC görünüşe Trygve Reenskaug tarafından, 70'li yıllarda Xerox Parc'ın icat edilmiştir inanıyorum ilk kamuoyu önüne çıkmış Smalltalk-80 idi Uzun bir süre bile Smalltalk, MVC hakkında neredeyse hiçbir kamu bilgi yoktu. MVC'de yayınlanan ilk önemli makale, "Küçük-Metin'de Model-View-Denetleyici Kullanıcı Arabirimi Paradigmasını Kullanmak İçin Bir Yemek Kitabı" idi. -80, "Glenn Krasner ve Stephen Pope, JournalOfObjectOrientedProgramming dergisinin Ağustos / Eylül 1988 sayısında yayınlandı. (Joop)."

KISS gibi daha uzun zamandır etrafta olan ve çok LESS dikkatini çeken çok daha önemli kelimeler var.
Michael Barber,
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.