MVC tasarımında iş mantığını nereye koymak?


44

Veri formlarıyla kayıtları bir veritabanına ekleyen basit bir MVC Java uygulaması oluşturdum.

Uygulamam veri toplar, doğrular ve saklar. Bunun nedeni, verilerin çevrimiçi olarak farklı kullanıcılardan edinilmesidir. Veriler doğada çoğunlukla sayısaldır.

Şimdi veritabanına depolanan sayısal verilerde (SQL server), uygulamamın hesaplamalar yapmasını ve sonuçları görüntülemesini istiyorum. Kullanıcı hesaplamaların nasıl yapıldığına ilgi duymuyor, bu yüzden kapsüllenmeleri gerekiyor. Kullanıcı yalnızca basit hesaplanmış verileri görebilmelidir (örneğin, A sütun verisi eksi B Sütun verisi C sütun verisine bölünür). Saklı yordamları nasıl yazacağımı biliyorum ama üç aşamalı bir uygulama istiyorum.

Veritabanına bir kayıt olarak koyduğum, üzerinde hesaplamalar yaparak çalıştığım verileri istiyorum. Orijinal veriler etkilenmeden kalmalı, hesaplamalar sonrası yeni veriler veritabanına yeni bir varlık kaydı olarak kaydedilmelidir.

Bu arka plan hesaplamasının kodunu nereye yazmalıyım? Kurallar ve iş mantığı olduğu için onu yeni JavaBeans dosyalarına koymalı mıyım?


Yanıtlar:


83

İş mantığı yerleştirilmelidir modeli ve biz şişman için matuf olmalıdır modelleri ve sıska kontrolörleri .

Başlangıç ​​noktası olarak, denetleyici mantığından başlamalıyız. Örneğin: güncelleme üzerine , sizin denetleyici için kodunuzu yönlendirmelidir yöntem / hizmet sunan model değişiklikleri.

Modelde, uygulama iş kurallarının veya hesaplamalarının doğrulanabileceği yardımcı / hizmet sınıflarını kolayca oluşturabiliriz .

Kavramsal bir özet

  • Kontrolör uygulama mantığı içindir. Uygulamanızın ait olduğu "bilgi alanı" ile nasıl etkileşime girmek istediğine özgü bir mantık.

  • Model uygulamasının bağımsızdır mantığı içindir . Bu mantık, ait olduğu "bilgi alanı" nın tüm olası uygulamalarında geçerli olmalıdır.

  • Bu nedenle, tüm iş kurallarını modele yerleştirmek mantıklıdır.


3
güzel net ve özlü cevap ..
hanzolo

@Yusubov, lütfen bana uygulama mantığı ile iş mantığı arasındaki farkı açıklayabilir misiniz
Mohamad

1
@Moh, Kısacası bunlar, bir uygulamadaki teknoloji seviyelerini tanımlamaya yardımcı olan vızıltılı kelimelerdir. İş mantığı, temel olarak fonksiyonel özelliklere göre sistemin kurallarıdır. Örneğin, B tipi A Nesnesi, C ve D'ye atfedilmiş olmalı, ancak E olmamalıdır. Uygulama Mantığı, bir Oracle veritabanına dayanmak için Java sunucularını ve OJB'yi kullanmak gibi daha teknik bir özelliktir.
EL Yusubov 17:15

Eğer bu kelimeleri üzerinde durmak misiniz: The most common mistakes are to implement application logic operations inside the controller or the view(presentation) layer.[ php-html.net/tutorials/model-view-controller-in-php ]
revo

1
Doğru anlaşılırsa, belirtilen makale 'uygulama mantığı' olarak 'iş mantığı' anlamına gelir. Bu nedenle, iş mantığına atıfta bulunan hiçbir şey denetleyiciye veya görünüme yerleştirilmemelidir.
EL Yusubov

20

Her zaman olduğu gibi, projenin karmaşıklığına bağlıdır.

Etki alanı modeli karmaşıklığının göreceli olarak küçük olduğu önemsiz uygulamalarda, mantığı modellere yerleştirip bir gün diyebilirsiniz.

Ancak, karmaşık modellere ve birçok iş kuralına sahip önemsiz uygulamalar için işleri biraz daha ayırmak daha iyidir.

Bir modele birden fazla model içeren iş mantığını koyarsanız, bu modeller arasında sıkı bir bağlantı kurarsınız. Uygulamalar büyümeye devam ettikçe, bu modeller god modelsçok fazla şey bilmeye dönüşüyor . Ve bu hızlı bir şekilde test edilmesi ve bakımı zor olan büyük bir karmaşaya dönüşecektir. Bu durumda, mantığı ayrı bir katmana koymak faydalıdır.

Soyutlamaya karar verirken, uygulamanızın karmaşıklığını ve amaçlarını her zaman göz önünde bulundurun ve fazla mühendislik yapmaktan kaçının. Önemsiz / küçük uygulamalar için gerekenden daha fazla katman kullanılması, azaltmak yerine karmaşıklığı arttırır.

Robert Martin (Bob Amca) bu konuda iyi bir blog yazısı var: The Clean Architecture.


soru MVC'ye özeldi. iş mantığı her zaman modelde olmalıdır. Kontrolör sadece bir adaptördür.
jgauffin

6
MVC, sektördeki en aşırı yüklenen terimlerden biridir. Bir kitabı garanti ettiği için bu terimin tuhaflıklarına girmek istemiyorum. Sadece, MVC'yi kullanmak her mantığı modellere dahil etmeniz gerektiği anlamına gelmez.
Hakan Deryal

1
Steve Burbeck (Smalltalk takım) tarafından tanımından: The controller interprets the mouse and keyboard inputs from the user, commanding the model and/or the view to change as appropriate. Bu bir adaptör tanımı.
jgauffin

4
Tüm mantığı modele koyarsanız, binlerce satır sürdürülemez karışıklığa yol açarsınız. Orada bulunmak. Hizmet sınıflarına ve hizmet katmanına sahip olmak günah değildir.
Asthasr,

Bence jgauffin’in ulaştığı soru, sorunun MVC’ye özgü olduğudur. Biz MVC perspektifi ve sadece MVC perspektiften sistemini görüntülemek için kabul ediyorsanız, o zaman evet, tüm iş mantığını "model" in aittir, ama "model" olabilecek kapsayacak "Hizmet sınıfları" ve dahil çoklu sınıflar ve katmanlar, "hizmet katmanı". Başka bir deyişle, servis katmanının denetleyicinin veya görünümün bir parçası olduğunu söyleyemeyiz, bu nedenle en uygun modeldir.
DavidS

5

İş mantığını modelin içine sokmak en iyi yol gibi görünebilir. Denetleyici uzaktaki web uygulamasından bir çağrı alır. MVC web servisindeki kontrolör çağrıyı alır ve yürütmeyi BL'deki bir metoda yönlendirir. Şimdi, İş Mantığı 'Model'de bulunabilir, ancak' İş Mantığı 'gibi başka bir klasörde konumlandırılabilir . Dolayısıyla, iş mantığının nerede olacağına dair hızlı ve zor bir kural yoktur.

MVC 3.0 üzerine kurulu bir web servisi kullanıyorum ve işletme mantığının kabı MVC MODELİ .


Katılıyorum. Modeliniz sadece diğer işletme mantık sınıfları tarafından uygulanan bir veri yapısı olduğunda, çok daha esnek bir uygulama elde edersiniz. Basit bir örnek olarak, ASP.NET'in doğrulama yaklaşımını öznitelikler kullanarak büyük bir başarısızlık olduğunu düşünüyorum. Bir Kişinin FirstName özelliğini İstenen özniteliğe eklerseniz, FirstName'in gerekmemesi gereken bir yönetici görünümü oluşturursam ne olur? Bir iş mantığı katmanı modeli tüketmeli ve bunun için uygun eylemleri belirlemelidir.
xr280xr 12:15
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.