डेटा एक्सेस अलग क्यों?
पुस्तक से, मुझे लगता है कि अध्याय मॉडल ड्रिवेन डिज़ाइन के पहले दो पृष्ठ इस बात के लिए कुछ औचित्य देते हैं कि आप डोमेन मॉडल के कार्यान्वयन से तकनीकी कार्यान्वयन विवरणों को अलग क्यों करना चाहते हैं।
- आप डोमेन मॉडल और कोड के बीच एक तंग संबंध रखना चाहते हैं
- तकनीकी चिंताओं को अलग करना यह साबित करने में मदद करता है कि मॉडल कार्यान्वयन के लिए व्यावहारिक है
- आप सिस्टम के डिजाइन के माध्यम से सर्वव्यापी भाषा चाहते हैं
यह एक अलग "विश्लेषण मॉडल" से बचने के उद्देश्य से लगता है जो सिस्टम के वास्तविक कार्यान्वयन से तलाक हो जाता है।
पुस्तक के बारे में मेरी समझ से, यह कहता है कि यह "विश्लेषण मॉडल" सॉफ़्टवेयर कार्यान्वयन पर विचार किए बिना समाप्त किया जा सकता है। एक बार डेवलपर्स व्यवसाय पक्ष द्वारा समझे गए मॉडल को लागू करने की कोशिश करते हैं, वे आवश्यकता के कारण अपने स्वयं के अमूर्त बनाते हैं, जिससे संचार और समझ में एक दीवार बन जाती है।
दूसरी दिशा में, डोमेन मॉडल में बहुत अधिक तकनीकी चिंताओं को पेश करने वाले डेवलपर्स इस विभाजन को भी पैदा कर सकते हैं।
तो आप विचार कर सकते हैं कि दृढ़ता जैसे अलगाव के अभ्यास का अभ्यास इन डिजाइनों के विश्लेषण को सुरक्षित रखने में मदद कर सकता है। यदि मॉडल में दृढ़ता जैसी चीजों को पेश करना आवश्यक लगता है तो यह एक लाल झंडा है। शायद मॉडल कार्यान्वयन के लिए व्यावहारिक नहीं है।
का हवाला देते हुए:
"एकल मॉडल त्रुटि की संभावना को कम करता है, क्योंकि डिज़ाइन अब ध्यान से विचार किए गए मॉडल का प्रत्यक्ष विस्तार है। डिज़ाइन, और यहां तक कि कोड भी, एक मॉडल की संचार क्षमता है।"
जिस तरह से मैं यह व्याख्या कर रहा हूं, यदि आप डेटाबेस एक्सेस जैसी चीजों से निपटने के लिए कोड की अधिक पंक्तियों के साथ समाप्त हो गए हैं, तो आप उस संचार को खो देते हैं।
यदि डेटाबेस तक पहुँचने की आवश्यकता विशिष्टता की जाँच करने जैसी चीज़ों के लिए है, तो एक नज़र डालें:
उदी दहन: डीडीडी को लागू करते समय सबसे बड़ी गलतियां टीमें करती हैं
http://gojko.net/2010/06/11/udi-dahan-the-biggest-mistakes-teams-make-when-applying-ddd/
"सभी नियम समान नहीं बनाए गए हैं"
तथा
डोमेन मॉडल पैटर्न को रोजगार
http://msdn.microsoft.com/en-us/magazine/ee236415.aspx#id0400119
"डोमेन मॉडल का उपयोग नहीं करने के लिए परिदृश्य" के तहत, जो एक ही विषय पर छूता है।
डेटा एक्सेस को अलग कैसे करें
एक इंटरफेस के माध्यम से डेटा लोड हो रहा है
"डेटा एक्सेस लेयर" को एक इंटरफेस के माध्यम से अमूर्त किया गया है, जिसे आप आवश्यक डेटा प्राप्त करने के लिए कहते हैं:
var orderLines = OrderRepository.GetOrderLines(orderId);
foreach (var line in orderLines)
{
total += line.Price;
}
पेशेवरों: इंटरफ़ेस "डेटा एक्सेस" प्लंबिंग कोड को अलग करता है, जिससे आप अभी भी परीक्षण लिख सकते हैं। डेटा पहुंच को एक मामले पर आधार द्वारा संभाला जा सकता है जो सामान्य रणनीति की तुलना में बेहतर प्रदर्शन की अनुमति देता है।
विपक्ष: कॉलिंग कोड को यह मान लेना चाहिए कि क्या लोड किया गया है और क्या नहीं।
SayOrderLines प्रदर्शन कारणों से एक अशक्त ProductInfo संपत्ति के साथ OrderLine ऑब्जेक्ट देता है। डेवलपर को इंटरफ़ेस के पीछे कोड का अंतरंग ज्ञान होना चाहिए।
मैंने वास्तविक सिस्टम पर इस विधि की कोशिश की है। आप प्रदर्शन समस्याओं को ठीक करने के प्रयास में हर समय लोड होने के दायरे को बदलते रहते हैं। आप डेटा एक्सेस कोड को देखने के लिए इंटरफ़ेस के पीछे झांकते हैं कि क्या है और लोड नहीं किया जा रहा है।
अब, चिंताओं को अलग करने से डेवलपर को एक समय में कोड के एक पहलू पर ध्यान केंद्रित करने की अनुमति मिल सकती है, जितना संभव हो सके। इंटरफ़ेस तकनीक हटाती है कि HOW यह डेटा लोड है, लेकिन HOW MUCH डेटा लोड नहीं है, जब इसे लोड किया जाता है, और जहां इसे लोड किया जाता है।
निष्कर्ष: काफी कम अलगाव!
धीरे लोड हो रहा है
डिमांड पर डाटा लोड किया जाता है। डेटा लोड करने के लिए कॉल ऑब्जेक्ट ग्राफ के भीतर छिपा हुआ है, जहां एक संपत्ति तक पहुंचने से परिणाम वापस करने से पहले एक sql क्वेरी निष्पादित हो सकती है।
foreach (var line in order.OrderLines)
{
total += line.Price;
}
पेशेवरों: डेटा एक्सेस की 'WHEN, WHERE, और HOW' डेवलपर की ओर से डोमेन लॉजिक पर केंद्रित है। एग्रीगेट में कोई कोड नहीं है जो लोडिंग डेटा से संबंधित है। लोड किए गए डेटा की मात्रा कोड द्वारा आवश्यक सटीक राशि हो सकती है।
विपक्ष: जब आप एक प्रदर्शन समस्या से टकराते हैं, तो जब आप एक सामान्य "एक आकार सभी को हल करते हैं" ठीक करना मुश्किल होता है। आलसी लोडिंग से समग्र प्रदर्शन खराब हो सकता है, और आलसी लोडिंग को लागू करना मुश्किल हो सकता है।
भूमिका इंटरफ़ेस / उत्सुक लाना
प्रत्येक उपयोग के मामले को एग्रीगेट वर्ग द्वारा कार्यान्वित रोल इंटरफेस के माध्यम से स्पष्ट किया जाता है, जिससे डेटा लोडिंग रणनीतियों को प्रति उपयोग के मामले से निपटने की अनुमति मिलती है।
इस तरह दिख सकता है:
public class BillOrderFetchingStrategy : ILoadDataFor<IBillOrder, Order>
{
Order Load(string aggregateId)
{
var order = new Order();
order.Data = GetOrderLinesWithPrice(aggregateId);
return order;
}
}
तब आपका कुल मिलाकर ऐसा दिख सकता है:
public class Order : IBillOrder
{
void BillOrder(BillOrderCommand command)
{
foreach (var line in this.Data.OrderLines)
{
total += line.Price;
}
etc...
}
}
BillOrderFetchingStrategy का उपयोग एग्रीगेट बनाने के लिए किया जाता है, और फिर एग्रीगेट अपना काम करता है।
पेशेवरों: इष्टतम उपयोग के लिए अनुमति देते हुए, प्रति उपयोग के मामले में कस्टम कोड की अनुमति देता है। इंटरफ़ेस अलगाव सिद्धांत के साथ इनलाइन है । कोई जटिल कोड आवश्यकताओं। एग्रीगेट्स यूनिट परीक्षणों की लोडिंग रणनीति की नकल करने की आवश्यकता नहीं है। सामान्य लोडिंग रणनीति का उपयोग अधिकांश मामलों के लिए किया जा सकता है (उदाहरण के लिए "सभी को लोड करें" रणनीति) और आवश्यक होने पर विशेष लोडिंग रणनीतियों को लागू किया जा सकता है।
विपक्ष: डेवलपर को अभी भी डोमेन कोड बदलने के बाद लाने की रणनीति को समायोजित / समीक्षा करना है।
लाने की रणनीति दृष्टिकोण के साथ आप अभी भी अपने आप को व्यावसायिक नियमों में बदलाव के लिए कस्टम भ्रूण कोड बदल सकते हैं। यह चिंताओं का सही पृथक्करण नहीं है, लेकिन अधिक बनाए रखने योग्य है और पहले विकल्प से बेहतर है। प्राप्त करने की रणनीति HOW, WHEN और WH डेटा का डेटा कहाँ लोड करती है यह चिंताओं को बेहतर ढंग से अलग करता है, बिना लचीलेपन को खोए जैसे एक आकार सभी आलसी लोडिंग दृष्टिकोण को फिट करता है।