MVC'de M nerede?


14

MVC içine benim başvuru refactor çalışıyorum, ama M kısmında sıkışmış.

Veritabanı destekli bir uygulamada, model uygulama kodunda uygulanır, değil mi?

Ama sonra, veritabanında ne var - bu da model değil mi?

(Ben veritabanı basit bir nesne deposu olarak kullanmıyorum - DB veri kurumsal bir varlıktır).


I'm not using the database as a simple object store. Ben veritabanında saklı yordamlar şeklinde bazı iş mantığı anlamına tahmin ediyorum. Teorik olarak MVC'ye karşı giden, ancak pratikte önemli değil.
yannis

@YannisRizos - orada olan DB BL, ama ne demek istedi ben DB veri uygulaması ötesine anlamına gelen bir hayat ve sahip olmak istememizdir.

3
I want the data in the DB to have a life and meaning beyond the application.Ne?
yannis

2
@YannisRizos - Bu ifadeyi yeniden düzenleme konusunda yardım etmekten kesinlikle memnun olurum. Veriler kurumsal bir varlıktır, değil mi? Uygulamaya ait değil - bu nedenle, uygulamanın diğer uygulamalardan gelen verileri yeniden kullanmayı çok zorlaştırıyorsa , uygulamayı çok kolaylaştıran çılgın denormalize bir model oluşturmasına izin verilmez . Herhangi bir öneri?

1
Paylaşılması gereken herhangi bir şey için bir biçim varsa, bu sorun olmayacak, bu da depolama biçimi gereksinimlerinin bir parçası haline gelir. Gelecekte başka bir biçimde ihtiyaç duyan her şeyin bir ETL görevi olabilir veya DAL'de dönüştürebilir.
StuperUser

Yanıtlar:


46

Evet, hem koddaki hem de veritabanındaki model "Model" dir.

Model, uygulamanızın "IS" ile ne ilgisi olduğunu ve kontrolörün "ne" yaptığı ile ilgilidir. Veritabanına doğrudan kalıcılık ile ilgili herhangi bir kod Model olarak kabul edilir.

Not: MVC bir kalıptır , bu yüzden fazla düşünmeyin. MVC'yi doğru şekilde yapmak için tüm süperleri almak kolaydır, ancak günün sonunda, sadece bir zihniyet! İş mantığınızı veritabanından ve kullanıcı arayüzünden uzak tutmak anlamına gelir - hepsi bu. MVC'den önce, insanlar sunucuda olması gerektiğinde iş mantığını web sayfalarına koyacaklardı veya kalıcılık kodu ile birlikte iş mantığı yaparak veritabanında çalışan bir sürü komut dosyasına sahip olacaklardı. MVC, insanların kodlarını yeniden kullanılabilir hale getirmeye yardımcı olacak şekilde düşünmeye başlaması için getirildi, bu yüzden ayrıntılara çok fazla takılmayın.


15
Yani C ve V perspektifinden bakıldığında, bir veritabanı var M sadece bir uygulama detay?

Kesinlikle. Güzelce ifade edildi.
herby

3
@MattFenwick C ve V açısından baktığımızda veritabanı yok. Veritabanını veri depolamadan daha fazla kullanıyorsunuz, MVC terimleriyle bir veri tabanı yalnızca bir veri depolama alanıdır. Ancak, uygulamanıza uygunsa, bu gayet iyi.
yannis

5
"Mvc'yi fazla düşünmeyin" için +1
Javier

2
"İş mantığınızı veritabanından ve kullanıcı arayüzünden uzak tutun" - bu
David Murdoch

17

Trygve Reenskaug , MVC modelini tanımlayan ilk makaleleri 1978'de yazdı. Tanımındaki Model, gerçek dünyadaki nesneleri, olguları ve kavramları temsil eden nesne modeliydi. Veritabanı destekli bir uygulama senaryosunda, model verilerinizin bir projeksiyonudur. Basitçe ifade etmek gerekirse, model, uygulamanızın ilgili olduğu sınıflar ve ilişkileridir.

Uygulamada genellikle MVC'de kullanılan iki model vardır: Etki Alanı Modeli (veritabanınızla eşlenenler) ve Uygulama Modeli (günümüz terminolojisinde Görünüm Modeli olarak da adlandırılır). Uygulama Modeli, aynı zamanda görünümü oluşturmak için görünüme özgü veriler içeren Etki Alanı Modelinin bir projeksiyonudur. Bu yaklaşıma MMVC denir . Denetleyici etki alanı modeliyle doğrudan etkileşime girer ve görünüme bir uygulama modeli sunar. MVVM modelinde, Uygulama Modeli ve Denetleyici birleştirilir.


+1: Bu cevabı en çok beğendim. The model is a projection of your data.Veritabanı, verilere erişim ve endeksleme için en verimli şekilde depolanacak şekilde tasarlanmıştır. Model, bunun yerine iş alanı etrafında tasarlanmalıdır.
Joel Etherton

Ayrıştırmam için bir saniye aldı the Domain Model (what's mapping to your database). Güzel cevap!

2
+1 Bu, MVC'nin evrimleştiği farklı lezzetlerin harika bir açıklamasıdır.
Ryan Hayes

Teşekkürler beyler. Kitabımı yazarken bu konulara derinlemesine daldım. Mantıklı geldi sevindim!
Michael Brown

3
  1. MVC için bir veritabanına ihtiyacınız yok. Modeliniz veritabanıyla konuşursa, o zaman harika. Ayrıca, düz bir dosyaya da devam edebilir veya hiç de devam edemez.

  2. Model, verilerin uygulamanızdaki bellekte depolandığı yerdir. Modeli, verileri üzerinde hesaplamalar ve doğrulamalar yapmak için de kullanmak isteyeceksiniz. Örneğin, faiz oranı, vade ve ilke gibi özelliklere sahip bir FinancePayment modeliniz var. Aylık ödemeyi hesaplamak için modelinize getMonthlyPayment () yöntemini ekleyebilirsiniz. Bunu denetleyicide veya görünümde yapmak istemezsiniz.

  3. Görünümün mantıksız olması ya da hiç mantığı olmaması ya da sadece basit veri bağlaması kullanması mantıklı olmalıdır (bkz. Martin Fowler'in sitesinde Pasif Görünüm ve Denetleyici Denetleyici kalıpları ). Görünüm, kullanıcı bir düğmeyi tıklatmak gibi bir şeyler yaptığında olayları artırır.

  4. Denetleyici olayları işlemekten (kullanıcı kaydet düğmesini tıklattığında bir kod çalıştır) ve model özelliklerini ayarlamaktan ve modele kendini yüklemesini ve kaydetmesini (kalıcılık kullanılıyorsa) bildirmekten sorumludur. Kontrolör, modelin verileri üzerinde hesaplamalar yapmamalıdır. Ancak, denetleyicide, görünüm adına "if model.profit () <0 sonra widget.colour = 'red'" gibi bazı hesaplamalar yapabilirsiniz.

  5. Modelleri değiştirmeden ve modellerin işlevselliğini kaybetmeden uygulamanızın komut satırı sürümüne geçebilmeniz gerekir.

a. Muhtemelen yalnızca görünümleri değiştirerek (denetleyicileri veya modelleri değil) uygulamanızın mobil sürümüne (masaüstü sürümünün aksine) geçiş yapabilmeniz gerekir. GUI test çerçevesi olmadan modellerinizi ve denetleyicilerinizi birim test edebilmelisiniz.


Kesinlikle doğru! Bu çok açık.

2

Model, ön uçta V ve C'ye ve arka uçta kalıcı depoya (dosyalardan SQL / NoSQL veritabanlarına kadar herhangi bir şey olabilir) bağlantısı olan koddur. Sadece db'den yüklenen ve db'ye depolayan kod değildir (modelin yanlış anlaşılmasından biridir), aslında tüm "domain" işini yapan koddur - seçer, filtreler, değiştirir, hesaplar, veri. Uygulamanın UI olmayan tüm mantığını içerir.


Kalıcı olmasını istediğiniz ham veriler. Modelinize en uygun kuruluşlarda. Model, uygulama mantığınızı canlı yapan bir API'dir. Bu veritabanı (cansız) verilerin depolanmasıdır. Uygulamanız için mümkünse (ne tür bir uygulama olduğunu bilmiyorum), bunu "veritabanı destekli uygulama" olarak düşünmeyi bırakın, ancak bir veritabanını bir yol olarak kullanan bir "uygulama" modül verilerini kalıcı hale getirmek. Birçok sorun veritabanını "simgelemekten" kaynaklanıyor - model için bir veri depolamadan başka bir şey değil; hendek yapabilir, yeniden yapılandırabilir veya yardımcı olursa değiştirebilirsiniz.
herby

(yukarıda yalnızca db'deki veriler başka bir uygulamayla paylaşılmadığında senaryolar için geçerlidir)
herby

Yorumumda kötü kelime seçimi için özür dilerim - söylemek istediğim, MVC ile ilgili olarak veritabanında ne olduğundan emin olmadığımdı . Veritabanı MVC dışında mı? Modelin bir parçası mı? V veya C'nin bir parçası mı (muhtemelen değil, ama anladın).

Anlıyorum. Muhtemelen cevabımdan, modelin kodunun işlediği uygulama verilerini devam ettirmeye yarayan modelin bir parçasını görebileceğinizi ortaya çıkardınız. (EDIT görüyorum): Eğer bu veritabanı uygulamadan daha fazla olması gereken bir şeyse, veritabanına harici servis olarak bakmaktan ziyade, modelin iletişim kurması gerekir, hesaplama için veri alın ve ayrıca geri gönderin.
herby

İş mantığı DB kendisi olduğunda aşırı durumda, çoğunlukla DB röleleri, hatta o db söylemek çok ince modeli olabilir olduğu modeliniz (ama o zaman, olması gereken tüm mantığı).
herby

2

Çok basit ve idealist bir bakış açısı.

Model genellikle verilerin bir modeli olarak değil, alanın bir modeli (kabaca iş) olarak görülür. Bunlar olabilir benzer, ancak tamamen birbirine bağlı değildir.

Görünüm, uygulamanın ön ucunun bir modeli olmalı ve Denetleyici, bir görünümden diğerine akış modeli olmalıdır.

İş mantığı, ister veritabanında ister kodda olsun, tamamen Modelde kapsüllenmelidir. Bazı iş mantığı Görünüm veya Denetleyicide tekrarlanabilse de, çeşitli nedenlerle, bu iki bileşeni tamamen kaldırmak ve yerine farklı bir ön uç koymak mümkün (ve güvenli) olmalıdır.


1

Anladığım kadarıyla, MVC sadece istemci uygulamanızın mimari modelinin açıklamasıdır. Wikipedia'daki resim sadece bunu gösteriyor:

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Tabii ki, uygulamanızın "saklı yordamlar" bölümleri uygulandığında, o zaman bu veritabanı kodu da modelin bir parçası olabilir, hatta denetleyicinin (kodun ne yaptığına bağlı olarak). Ancak durum böyle değilse, veritabanı tam olarak sizin belirttiğiniz gibi "MVC dışında" dır.


1
But then, what is in the database -- is that not also the model?

Hayır öyle değil. " Model , uygulama etki alanının davranışını ve verilerini yönetir". Genellikle, Model evet bir veritabanına bağlanır, ancak hiçbir şekilde bu bir gereklilik değildir. Model, uygulamanız ve veritabanı arasında yeni bir katmandır. Arka uç bir dizi Mock nesnesi, XML veya veri kalıcılığını destekleyen herhangi bir şey olabilir.

Katmanları birbirinden ayırarak, daha iyi birim test uygulamaları kullanmak için kendinize çok daha fazla esneklik sağlarsınız, diğer avantajların yanı sıra kodu daha yönetilebilir hale getirin (EG SQL Oracle ile değiştirilir).

Aynı şey kontrolör için de geçerlidir. MVC denetleyiciyi iki katman arasında bir orta adam olarak tanımlar. MVC'de tanımlanmış bir "iş katmanı" yoktur. Aksine, kendinizinkini eklersiniz. MVC çoğu uygulama oluşturmak için gereken tüm katmanları kapsamaz. Temel yapı için sadece genel bir kılavuzdur.

Bu ayrımlar, kontrolün ters çevrilmesine izin vermek için anahtardır.


Mükemmel ve çok bilgilendirici bir cevap için +1; buna rağmen, son cümlenin açıklanmayı hak ettiğini öneririm. IoC mutlaka o kadar yaygın olarak biliniyor ve anlaşılıyor değil, bu yüzden biraz karışıklık ekleyebilir. Bununla ne demek istediğinizin gerçekten yararlı bir açıklaması muhtemelen aklı başında bir SE yanıtının kapsamının çok ötesindedir, ama bana atladı.
Adam Crossland

Ancak, iş mantığınızı saklı yordamlara yerleştirirseniz, evet, veritabanı modeli kapsar. (Şahsen, bu yaklaşımı
önermem

1
@Roy Tinker - Hayır, önemli değil. Model kavramsal olarak ayrıdır. Katman içinde bir yerde veritabanı ile bütünleşen varlıklar olacaktır. Bu varlıklar, başka ilişkileri olan modelde var olan diğer varlıklardan ayrı tutulmalıdır (örneğin bir sahte). Kontrolör, Modele çağrılarını, verilerin nasıl ve nereden geldiğiyle ilgili hiçbir bilgisi olmayacak şekilde yapmalıdır. Daha ziyade bu belirleme bağımlılık enjeksiyonu ve IoC (temel olarak farklı arka uçlara, alaycı veya DB'ye bağlanabilen bir arayüz) ile yapılmalıdır.
P.Brian.Mackey


0

Aslında çok basit, "Model" veri arayüzü için soyutlamayı temsil ediyor. Bu yüzden:

  • Veritabanları Modelin bir parçası olarak kabul edilir , ancak modelin kendisi olarak kabul edilmez.
  • Modelin verileri veritabanlarından, dosyalardan, web servislerinden gelebilir veya hatta taklit edilebilir.
  • MVC, HMVC veya benzeri çerçevelerdeki model sınıfları sorguları saklamalıdır (bkz. "Yağ modeli, sıska kontrolör" ilkesi [ 1 ] [ 2 ] [ 3 ])

Ve - eğer doğruysam - bu yüzden birisi MVC bağlamının dışındaki modellere başvurduğunda, birisinin büyük olasılıkla verilerin yapısına (yani şema ) atıfta bulunmasıdır .


0

M DB bazı mantık ve veri depolamak düşünüyorum. Kontrolör hangi modülün çalıştırılacağını çağırır ve bu modül mantık yürütür ve veriyi DB'de depolar (kalıcı katman olabilir) ve sonra bu modül değeri V olarak döndürür.


0

MVC'deki M (odel) , işletme / alan modelini tek bir yerde yakalamalıdır .

İdeal olarak, alanın ticari kurallarını ve yapısını içermelidir .

C (kontrolör) ideal olarak sadece iş modeli bilgilerinin sunuma aracılık etmesi (örn. Görünüm) ve modelin durumundaki değişiklikleri başlatmak için V (iew) 'den kullanıcı girdisini yakalama ile ilgilidir.

Veritabanı katmanı, modelin durumunun belirli bir zamanda kalıcılığıyla yalnızca ilgilenir (veya daha doğrusu ilgilenmelidir).

Bunun gibi bir şey değildir aittir birine Modeli veya Kontrolör MVC deseni parçası, daha çok cephede bir fonksiyonu olarak (şeffaf modele herhangi bir değişiklik ısrar ederek dolaylı uygulanabilir tamamen ayrı bir endişe sağlayan bir Modelinizle Denetleyiciye olan etkileşimler) veya modelden mutasyonlar yapmayı bitirdikten sonra Denetleyici tarafından açıkça çağrılır.


0

İdeal bir dünyadaki model sadece iş mantığını içermeli, bir Ev gibi gerçek bir nesneyi modeller. Bununla birlikte, hemen hemen her koşulda, modelin verilerini bir miktar depolama alanında saklaması gerekir.

Model ve saklanan veriler arasındaki etkileşimler, ayrı bir veri katmanında veya doğrudan modelde gerçekleşebilir; bu, bir ORM (Nesne İlişkisel Eşleyici) kullanıldığında geçerlidir. Başka bir deyişle, ya model doğrudan veritabanına bağlanır ya da verilerini veritabanına bağlanan başka bir "veri erişimi" nesnesine iletir.

Bir ORM (Nesne İlişkisi Eşleyicisi), veritabanı tablosundaki alanları model nesnenizin nitelikleriyle eşler ve alıcıları ve ayarlayıcıları sağlar. Bu durumda ayrı bir veri katmanı yoktur ve model, verilerinin devamlılığını sağlamaktan doğrudan sorumludur.

İşte ActiveRecordpopüler bir ORM kullanan bir Ruby örneği :

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Pricehousestabloda otomatik olarak algılanan ActiveRecordve nesneye alıcı ve ayarlayıcı ekleyen bir alandır . Ne zaman saveçağrılır fiyat özniteliğinin değeri veritabanında kalıcı.

Benim bakış açımdan bir veri katmanına sahip olmanın avantajı, modele gelmeden önce verileri manipüle edebileceğiniz bir noktaya sahip olmanız, modelin daha az endişe duyması, daha az sorumlulukları olması. Örneğin, uyumlu olmayan birkaç veri kaynağından veri birleştirmeniz gerekebilir, bu bir ORM'nin kolayca işleyemeyeceği bir şeydir.

Ana con, yönetmek için başka bir soyutlama katmanıdır, eğer ihtiyacınız yoksa, rahatsız etmeyin, basit tutun. Daha az hareketli parça, yanlış gitmek için daha az.


-1

Evet haklısın.

(Model Görünümü Denetleyicisi)

Verileri (modeli) kullanıcı arabiriminden (görünüm) ve işlemden (denetleyici) ayıran uygulamalar oluşturmak için bir mimari .

Uygulamada, MVC görünümleri ve denetleyicileri, yakından ilişkili oldukları için genellikle tek bir nesnede birleştirilir. MSDN'ye göre

Kontrolör, modelden ve / veya the view to change as appropriate.

Bu şemayı kontrol edin:

resim açıklamasını buraya girin

Örneğin, denetleyici kodu veri isteğini doğrular ve bir görünümde döndürülmesine neden olur. Görünüm denetleyicisi nesneleri yalnızca bir modele bağlıdır; ancak,a model can have many view-controller objects associated with it.


4
In practice, MVC views and controllers are often combined into a single object because they are closely related.Bunu yapıyorsan, yanlış yapıyorsun ...
yannis

Diyagram nereden geliyor? Peki tanım nereden geliyor? Lütfen sadece uygun atıf olmadan internetten yapıştırıcıları kopyalamayın.
yannis

@Yannis Rizos - MS belgelerinden alıntı yapıyor. Burada biraz bağlam dışı, ancak web dışı uygulamaların genellikle bir görünüm / denetleyici bağına sahip olduğunu söylüyorlar, ancak web uygulamalarının çok net bir ayrımı var. Muhtemelen MS'in Windows uygulamaları için MVC'yi (bunun yerine MVVM) ittiğini görmemenizin nedenlerinden biri, sadece web uygulamaları. msdn.microsoft.com/tr-tr/library/ff649643.aspx
P.Brian.Mackey

1
@ P.Brian.Mackey MS'in bir şekilde arkasında olduğundan şüphelendim: P
yannis

Cevabınızı @ P.Brian.Mackey bağlantısını dahil edecek şekilde düzenledim. Dış kaynakları alıntılamak mükemmel, ancak bunlara bağlantılar eklemelisiniz. Ayrıca MVVM, MVC'ye çok benzer olabilir, ancak aynı model değildir. MVC görüş ve denetleyicileri asla tek bir nesnede birleştirilmemelidir ...
yannis
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.