Hesaplama mantığını bir Türe veya İş Katmanına koymalı mıyım?


16

Son zamanlarda, Varlık katmanına basit bir hesaplamanın yapılması veya Varlığın yalnızca ham verileri depolamak ve hesaplama mantığını iş katmanında bırakmak için saf olup olmadığı konusunda bir soru ile karşı karşıya kaldım.

Benim sorum, bir varlık sınıfındaki özelliklerde basit hesaplamaları kapsüllemenin mantıklı olup olmadığıdır.

Yanıtlar:


21

İstediğiniz mimarinin türüne bağlıdır.

  • Etki Alanına Dayalı Tasarım'da, hem veriye hem de işlevselliğe sahip bir Etki Alanı Modeli oluşturursunuz .

Bu, a'nın Order, siparişin toplam fiyatını temel alan fiyatını döndürecek bir özelliği (veya yöntemi) olduğu anlamına gelir OrderLines. OrderAyrıca bir yöntem olurdu AddOrderItem(Product product, int amount)ve Orderzaten bir olup olmadığını kontrol ediyorum OrderLinebu özel ürün için.

Böyle bir modelde, Repositoryverilere erişmek veya Factoryvarlık oluşturmak için a gibi gerçek varlıklar olmayan nesnelere de sahip olursunuz . Bunlara Alan Adı Hizmetleri denir. Bir Uygulama Katmanı, Etki Alanı Hizmetlerini çağırmaktan sorumludur (örneğin, bir varlığı veritabanından almak için) ve daha sonra varlık üzerinde işlevsellik yürütecektir. Application LayerMümkün olduğunca ince olmalıdır.

DDD hakkında bu kavramları daha ayrıntılı olarak açıklayan güzel bir makale .

  • Bir Anemik Alan Modeli de kullanabilirsiniz . Bu, varlıklarınızın get / set özelliklerinden oluştuğu ve davranış içermediği anlamına gelir. Böyle bir tasarımda, İş Katmanınız Orderfiyatı hesaplamak ve yinelenenleri kontrol etmek gibi bir davranış içerecektir OrderLines.

Anemik Alan Modeli'nin kötü bir şey olup olmadığı konusunda farklı görüşler vardır. Şahsen ben gerçek bir Domain Modelini tercih ederim.

Bu makalede , bir Anemik ve Anemik olmayan Etki Alanı Modeli arasındaki farklar açıklanmaktadır.


Merhaba Wouter, cevap ve bağlantılar için teşekkürler. Anemik etki alanı modelini kullandığınızda, tüm iş mantıklarının (hatta çok basit olanlar) iş katmanına yerleştirilmesi gerektiğini düşündüğüm yanlış bir zihinle karşı karşıya kaldım. İş mantıklarının gerçekten modele bağlı olduğu bazı durumlarda bu mantıksız görünmektedir. Örneğin, bir özellik modeldeki mevcut özelliklerden hesaplanır. Her şey modelin kendisine bağlı olan iş mantıklarını iş katmanına koymak için mantıklı bir neden bulamadım.

Anemik bir etki alanı modelinde, işletme sınıflarının yanı sıra varlık sınıflarımız olduğu için, sınıflar arasında karıştırılmayı önlemek için sınıfları düzgün bir şekilde adlandırmak nasıl olur? Sonek kullanmanızı önerir misiniz? Evetse, bir örnek verebilir misiniz?
Kwadz

DDD için, ya fiyat hesaplama mantığı karmaşıksa? Örneğin, fiyat konum (vergi), kullanıcı bilgi (doğum tarihi indirim, üyelik indirim), kupon, içeri böyle mantığı koyabilirsiniz nasıl vb kredi kartı (kredi kartı, özel indirim) dayanmaktadır Ordersınıfın?
Sher10ck

1
Sipariş toplamanız, hesaplama yapmak için gereken tüm bu bilgileri içermelidir. Çünkü açıklamanıza dayanarak, bu aslında toplamın bir parçası olmalıdır. Ama eğer mantık gerçekten karmaşık hale gelirse ve değiştirmeniz gerekiyorsa, hesap makinesini varlık yapıcısına bir nesne olarak geçirir ve varlığın fiyatı ayarlamak için hesap makinesini dahili olarak kullanmasına izin veririm.
burzum

Anemik ... fakir alan bir tür hastalıktan muzdaripmiş gibi geliyor. Driven olmayı tercih etmez miydin ?! Evet!
Matt Jenkins

1

Varlık ve iş Nesneleri çoğu zaman hemen hemen aynıdır. Örneğin, bir ürün sınıfınız varsa ve ürün sınıfında varolan bir özelliği alan ve bazı hesaplamalar yapan ve daha sonra ortaya çıkaran bir özelliği göstermek istiyorsanız. Bu özelliği yaratma mantığının sınıfta kalması açısından para cezası.

Şimdi, iş katmanı sınıfınıza nerede uyacağınız sorusu gelebilir. İş sorunuyla başa çıkmak için mantığı olan iş katmanı sınıfını kullanmayı tercih ederim. Örneğin, Ürün örneğinizde bir işletme sorunu, paypal gibi üçüncü taraf satıcılar kullanarak para alıyor olabilir.

Hatırlanması gereken en önemli şey, bir Varlığın her zaman bir kimliğe sahip olacağı, ancak bir iş nesnesinin kimliği olmayan bir varlıktır. Örneğin ürün bir varlıktır ama paranın bir kimliği olmazdı. 1000 farklı para örneği aynı olurdu.


Evet. Mülkün iş mantığının tümü aynı modeldeki mevcut mülklere bağlıysa, mülkü modelde eklemek daha iyi olur. Bu, hesaplanan mülkler için gereksiz çiftin iş katmanıyla birlikte kaybedilmesine yardımcı olacaktır.
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.