समृद्ध डोमेन कक्षाओं के लाभों में से एक यह है कि आप किसी भी परत में वस्तु के संदर्भ में उनके व्यवहार (तरीकों) को कॉल कर सकते हैं। इसके अलावा, आप छोटे और वितरित तरीके लिखते हैं जो एक साथ सहयोग करते हैं। एनीमिक डोमेन कक्षाओं में, आप वसा प्रक्रियात्मक तरीके (सेवा परत में) लिखते हैं जो आमतौर पर उपयोग के मामले से प्रेरित होते हैं। अमीर डोमेन वर्गों की तुलना में वे आमतौर पर कम रखरखाव योग्य हैं।
व्यवहार के साथ डोमेन कक्षाओं का एक उदाहरण:
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()
}
}
विधि needToDeliver()
उन वस्तुओं की सूची लौटाएगी जिन्हें बोनस सहित वितरित करने की आवश्यकता है। इसे कक्षा के अंदर, किसी अन्य संबंधित वर्ग से, या किसी अन्य परत से बुलाया जा सकता है। उदाहरण के लिए, यदि आप Order
देखना चाहते हैं, तो आप उपयोगकर्ताओं की पुष्टि करने के लिए आइटम की सूची प्रदर्शित करने needToDeliver()
के लिए चयनित Order
का उपयोग कर सकते हैं , इससे पहले कि वे सहेजने के लिए सेव बटन पर क्लिक करें Order
।
टिप्पणी करने के लिए प्रतिक्रिया
यह है कि मैं नियंत्रक से डोमेन वर्ग का उपयोग कैसे करता हूं:
def save = {
Order order = new Order()
order.addItem(new Item())
order.addItem(new Item())
repository.create(order)
}
का निर्माण Order
और इसके LineItem
एक लेन-देन में है। यदि LineItem
कोई नहीं बनाया जा सकता है, तो कोई निर्माण नहीं किया Order
जाएगा।
मेरे पास ऐसी विधि है जो एकल लेनदेन का प्रतिनिधित्व करती है, जैसे:
def deliver = {
Order order = repository.findOrderByNumber('ORDER-1')
order.deliver()
// save order if necessary
}
अंदर कुछ भी deliver()
एक ही लेनदेन के रूप में निष्पादित किया जाएगा। यदि मुझे एक ही लेनदेन में कई असंबंधित तरीकों को निष्पादित करने की आवश्यकता है, तो मैं एक सेवा वर्ग बनाऊंगा।
आलसी लोडिंग अपवाद से बचने के लिए, मैं जेपीए 2.1 नामित इकाई ग्राफ का उपयोग करता हूं। उदाहरण के लिए, डिलीवरी स्क्रीन के लिए नियंत्रक में, मैं delivery
विशेषता लोड करने और अनदेखा करने के लिए विधि बना सकता हूं bonus
, जैसे कि repository.findOrderByNumberFetchDelivery()
। बोनस स्क्रीन में, मैं एक और तरीका कहता हूं जो bonus
विशेषता को लोड करता है और अनदेखा करता है delivery
, जैसे कि repository.findOrderByNumberFetchBonus()
। इसके बाद से मुझे इस बात की आवश्यकता है कि मैं अब भी deliver()
बोनस स्क्रीन के अंदर कॉल नहीं कर सकता ।