Salah satu keuntungan kelas domain kaya adalah Anda dapat memanggil perilaku mereka (metode) setiap kali Anda memiliki referensi ke objek di lapisan mana pun. Selain itu, Anda cenderung menulis metode kecil dan terdistribusi yang berkolaborasi bersama. Dalam kelas domain anemia, Anda cenderung menulis metode prosedural gemuk (di lapisan layanan) yang biasanya didorong oleh kasus penggunaan. Mereka biasanya kurang dapat dipelihara dibandingkan dengan kelas domain kaya.
Contoh kelas domain dengan perilaku:
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()
}
}
Metode needToDeliver()
akan mengembalikan daftar item yang perlu dikirimkan termasuk bonus. Itu bisa dipanggil di dalam kelas, dari kelas lain yang terkait, atau dari lapisan lain. Misalnya, jika Anda lolos Order
ke tampilan, maka Anda dapat menggunakan needToDeliver()
pilihan Order
untuk menampilkan daftar item yang akan dikonfirmasi oleh pengguna sebelum mereka mengklik tombol simpan untuk mempertahankan Order
.
Menanggapi Komentar
Beginilah cara saya menggunakan kelas domain dari pengontrol:
def save = {
Order order = new Order()
order.addItem(new Item())
order.addItem(new Item())
repository.create(order)
}
Pembuatan Order
dan LineItem
dalam satu transaksi. Jika salah satu dari LineItem
tidak dapat dibuat, tidak Order
akan dibuat.
Saya cenderung memiliki metode yang mewakili satu transaksi, seperti:
def deliver = {
Order order = repository.findOrderByNumber('ORDER-1')
order.deliver()
// save order if necessary
}
Semua yang ada di dalamnya deliver()
akan dieksekusi sebagai satu transaksi tunggal. Jika saya perlu menjalankan banyak metode yang tidak terkait dalam satu transaksi, saya akan membuat kelas layanan.
Untuk menghindari pengecualian pemuatan lambat, saya menggunakan JPA 2.1 bernama grafik entitas. Misalnya, dalam pengontrol untuk layar pengiriman, saya dapat membuat metode untuk memuat delivery
atribut dan mengabaikan bonus
, seperti repository.findOrderByNumberFetchDelivery()
. Di layar bonus, saya memanggil metode lain yang memuat bonus
atribut dan mengabaikan delivery
, seperti repository.findOrderByNumberFetchBonus()
. Ini membutuhkan disiplin karena saya masih tidak bisa menelepon deliver()
di dalam layar bonus.