Zengin alan sınıflarının faydalarından biri, herhangi bir katmandaki nesneye başvurduğunuz her seferinde davranışlarını (yöntemlerini) çağırabilmenizdir. Ayrıca, birlikte iş birliği yapan küçük ve dağıtılmış yöntemler yazma eğilimindesiniz. Anemik alan sınıflarında, genellikle kullanım senaryosuna göre yönlendirilen dolgun prosedürel yöntemler (hizmet katmanında) yazma eğilimindesiniz. Zengin alan sınıflarına kıyasla genellikle daha az bakım gerektirirler.
Davranışlara sahip alan sınıflarına bir örnek:
class Order {
String number
List<OrderItem> items
ItemList bonus
Delivery delivery
void addItem(Item item) { // add bonus if necessary }
ItemList needToDeliver() { // items + bonus }
void deliver() {
delivery = new Delivery()
delivery.items = needToDeliver()
}
}
Yöntem needToDeliver()
, bonus dahil teslim edilmesi gereken öğelerin listesini döndürür. Sınıf içinde, ilgili başka bir sınıftan veya başka bir katmandan çağrılabilir. Örneğin, Order
görüntülemeye geçerseniz, kullanıcı tarafından onaylanacak öğelerin listesini görüntülemek için needToDeliver()
seçili öğesini kullanabilirsiniz .Order
Order
Yoruma Yanıt Verme
Controller'daki etki alanı sınıfını şu şekilde kullanıyorum:
def save = {
Order order = new Order()
order.addItem(new Item())
order.addItem(new Item())
repository.create(order)
}
Yaratılması Order
ve LineItem
tek işlemde. Bunlardan biri LineItem
oluşturulamazsa, hiçbir Order
oluşturulmayacaktır.
Tek bir işlemi temsil eden yönteme sahip olma eğilimindeyim, örneğin:
def deliver = {
Order order = repository.findOrderByNumber('ORDER-1')
order.deliver()
// save order if necessary
}
İçindeki deliver()
her şey tek bir işlem olarak yürütülecektir. Tek bir işlemde birçok ilgisiz yöntemi yürütmem gerekirse, bir hizmet sınıfı oluşturabilirim.
Tembel yükleme istisnasını önlemek için, JPA 2.1 adlı varlık grafiği kullanıyorum. Örneğin, teslimat için denetleyici ekranında, delivery
öznitelik yüklemek ve yok saymak için bir yöntem oluşturabilirim bonus
, örneğin repository.findOrderByNumberFetchDelivery()
. Bonus ekranında, bonus
öznitelik yükleyen ve yok sayan başka bir yöntemi çağırıyorum delivery
, örneğin repository.findOrderByNumberFetchBonus()
. deliver()
Bonus ekranından hala arayamadığım için bu disiplin gerektirir .