2009-07-21 12 views
15

में मैंने हाल ही में "The Anemic Domain Model Pattern" पर एक पोस्ट पढ़ी जिसने मेरा ध्यान खींचा। जैसा कि मैंने इस के माध्यम से पढ़ा, मैंने पाया कि एनीमिक डोमेन मॉडल विवरण उन परियोजनाओं पर लागू होता है जिन पर मैंने काम किया है और बनाया है। मैंने इसे कभी भी खराब डिजाइन निर्णय के रूप में नहीं सोचा क्योंकि यह बहुत स्वाभाविक महसूस हुआ। मैंने सोचा कि उस मामले में जहां domain model हल्का वजन था और एनीमिक डोमेन मॉडल मोनिकर बहुत अच्छी तरह से फिट नहीं था। डोमेन मॉडल में जटिलता क्यों जोड़ें, जहां इसे "एनीमिक डोमेन मॉडल" का शीर्षक उचित रूप से आपके कोड का वर्णन नहीं करता है?एनीमिक डोमेन मॉडल बनाम डोमेन मॉडल एक साधारण डोमेन संचालित डिजाइन

प्रश्न: आपकी साइट/अनुप्रयोग परत में आपकी अधिक कोड जटिलताओं को भरने से किस बिंदु पर आपकी इकाई वस्तुओं की जटिलता को उजागर करने के पक्ष में सही हो जाता है? मैं सभी एक इकाई पर "कुल" संपत्ति रखने के लिए हूं, जहां यह आंतरिक रूप से कुल के मूल्य को समझ सकता है। मैं अपनी संपत्तियों में से किसी एक के परिणाम का निर्धारण करने के लिए एंटिटी को अन्य विभिन्न विजेट्री के साथ सीधे संवाद करने के लिए नहीं हूं। तो एक एनीमिक डोमेन मॉडल की अवधारणा एक विरोधी पैटर्न या चिंताओं का एक अच्छा अलगाव है? शीर्षक एनीमिक डोमेन मॉडल हमेशा एक बुरी चीज है?

बस इस उत्सुकता (विरोधी) पैटर्न पर अन्य लोगों के विचार क्या थे उत्सुक हैं।

उत्तर

9

कुंजी प्रश्न पूछने के लिए कारण है कि डोमेन मॉडल कमजोर है?

  • पास कुल व्यापार तर्क का अभाव है, जो मुख्य रूप से CRUD screens का एक संयोजन है एक आवेदन के रूप में?
  • सेवा-उन्मुख आर्किटेक्चर जिसमें 'डोमेन ऑब्जेक्ट्स' वास्तव में सरल संरचनाएं data transfer objects हैं?
  • राजनीतिक या व्यावहारिक विचार जैसे कि कोड स्वामित्व या आगे/पिछड़े संगतता जो अत्यधिक रिफैक्टरिंग में बाधा डालती है?
  • अन्यथा ऑब्जेक्ट उन्मुख भाषा में प्रक्रियात्मक/संबंधपरक डिज़ाइन को लागू करना?

किसी भी मामले में, अगर मैं डोमेन मॉडल तर्क और सेवा तर्क के बीच सीमा के लिए अंगूठे का एक सरल नियम लेने के लिए थे, यह होगा कि संबंधित वस्तुओं के साथ बातचीत, डोमेन के भीतर ठीक है, जबकि "बाहर तक पहुँचने दुनिया "(उपयोगकर्ता इंटरफ़ेस, वेब सेवाएं, आदि) शायद डोमेन मॉडल में संबंधित नहीं है।

+0

क्या मैं अपने आर्क एसओए को कॉल कर सकता हूं यदि मेरे सभी व्यवसाय नियम सेवा कक्षाओं में हैं लेकिन वे वेब-सेवाएं नहीं हैं (और मैं वेब-सेवाओं का उपयोग नहीं करता) – Omu

+0

@ ओमु मुझे लगता है कि आप कर सकते हैं, हालांकि मैं और अधिक उस सादे पुराने प्रक्रियात्मक/संबंधपरक कोड को कॉल करने के इच्छुक हैं। एसओए प्रक्रियात्मक शैली में लिखने के लिए एक प्रेरणा है, इसका विवरण नहीं। –

7

यदि डोमेन हल्का है (पढ़ें: जटिल नहीं), तो अनुशंसित दृष्टिकोण आपके कोर डोमेन परत में एक साधारण ActiveRecord-type ऑब्जेक्ट्स का उपयोग करना है। आम तौर पर डीबी टेबल और आपके डोमेन ऑब्जेक्ट्स के बीच एक-से-एक मानचित्रण और यहां "तर्क" का बहुत कुछ नहीं है। आपका ऐप सिर्फ डेटाबेस और आपके यूआई के बीच रिकॉर्ड को घुमा रहा है और सरल सीआरयूडी संचालन की इजाजत देता है।

जटिल डोमेन के लिए, आप कोर डोमेन मॉडल तैयार करेंगे जहां कुछ ऑब्जेक्ट्स डीबी टेबल पर मैपिंग समाप्त कर देते हैं और कुछ संभवतः सादे डेटा के अलावा आपके डोमेन में अन्य अवधारणाओं का प्रतिनिधित्व नहीं करते हैं और प्रतिनिधित्व नहीं करते हैं। आवेदन के लिए तर्क वस्तुओं के अंदर होना चाहिए जब सेवा ऑब्जेक्ट्स के भीतर या एकाधिक ऑब्जेक्ट्स के बीच समन्वय की आवश्यकता होती है।

एनीमिक डोमेन मॉडल एंटी-पैटर्न लागू होता है जब आपके पास जटिल डोमेन होता है लेकिन डोमेन ऑब्जेक्ट्स में कुछ तर्क डालने और सेवाओं में कुछ तर्क देने के बजाय, आप अपने मूल में बाहरी (या लगभग सभी) तर्क डालते हैं डोमेन ऑब्जेक्ट्स

यहां महत्वपूर्ण अंतर है जहां आप तर्क डालते हैं। यदि आपके पास बहुत कुछ नहीं है, तो स्पष्ट रूप से डोमेन ऑब्जेक्ट्स सरल डेटा कंटेनर से अधिक कुछ नहीं दिखेंगे। यदि आपके पास जटिल तर्क है, तो इसे केवल डोमेन ऑब्जेक्ट्स से बाहर खींचें, बल्कि इसे कोर डोमेन ऑब्जेक्ट्स और डोमेन सेवाओं के बीच उचित रूप से अलग करें।

+0

यह सबसे अच्छा * सरल * स्पष्टीकरण मैंने पढ़ा है जो नौसिखिया डेवलपर को बताता है कि एडीएम पर यह सब प्रचार वास्तव में क्या है। धन्यवाद महोदय। – Heliac

1

Gday!

यदि आप डोमेन ऑब्जेक्ट्स के बाहर तर्क डालते हैं तो आप मुख्य ओओ अवधारणाओं में से एक को पूरी तरह खो देते हैं: encapsulation (या डेटा छिपाने)।

एओपी इसे एक निश्चित डिग्री तक बनाता है, लेकिन आखिरकार, ऑब्जेक्ट ओरिएंटेशन के मुख्य कॉन्सेट में से एक चला गया है।

सादर, स्टीफन

संबंधित मुद्दे