2009-01-23 17 views
15

ग्रेग यंग द्वारा this post पढ़ा गया, जहां वह माइक्रोसॉफ्ट के बारे में बात कर रहा है, जिसमें गूंगा डेटा स्थानांतरण ऑब्जेक्ट्स के साथ पैटर्न की सिफारिश की जा रही है। उन्होंने बताया कि जावा समुदाय में, चीजें दूसरी दिशा को प्रवृत्त कर रही हैं।आपके डोमेन मॉडल ऑब्जेक्ट्स में कितना तर्क होना चाहिए

मेरा प्रश्न यह है कि आपकी इकाई वस्तुओं में कितना तर्क होना चाहिए? हमारा दर्शन जहां मैं काम करता हूं (सी # दुकान) यह है कि यदि आप इसे क्रमबद्ध नहीं कर सकते हैं, तो इसे इकाई में न रखें।

उत्तर

17

मैट,

मैं कहूंगा कि आपकी दुकान प्रक्रियात्मक कोड लिख रही है। मैं यह स्पष्ट करना चाहता हूं कि प्रक्रियात्मक कोड का उपयोग करके कई बड़ी प्रणालियों (जिनमें मैंने कई काम किए हैं) के साथ कुछ भी गलत नहीं है। इसके लिए एक समय और जगह है।

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

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

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

त्वरित पुनरावृत्ति: राज्य संपुटित, बेनकाब व्यवहार

तो क्या व्यवहार एक वस्तु होना चाहिए? बस रखो यह उन व्यवहारों का होना चाहिए जो राज्य पर संचालित होते हैं, यह encapsulating है। एक आदर्श व्यवहार ओओ दुनिया में राज्य कभी वस्तु के व्यवहार से अवगत नहीं होगा। कोड में चतुराई रखो अगर हम कोड की तरह देखने लगते हैं:

Customer c = GetCustomerFromRepository(); 
c.Status = CustomerStatuses.Deleted; 
c.LastUpdated = DateTime.Now; 
c.UpdatedBy = GetCurrentUser(); 
CustomerRepository.Save(c); 

हम एक SRP उल्लंघन किया है ... यह कोड कोड है कि ग्राहक वस्तु का एक व्यवहार होना चाहिए क्योंकि ग्राहक वस्तु की "जिम्मेदारी" करने के लिए है ।

किसी ग्राहक के बारे में स्थिति को समाहित करें और व्यवहार का पर्दाफाश करें।

जैसा कि हम देख सकते हैं कि हम ग्राहक होने से बेहतर होंगे। हटाएं() विधि। (हाँ यह एक बुरा उदाहरण है जो मुझे पता है ...)

अब हम टीडीडी का उपयोग करके भी इसे प्राप्त करेंगे। सीम के साथ परीक्षण में सौदा करना हमारे लिए बहुत आसान है कि व्यवहार उन सीमों से प्रदान करता है जहां सभी राज्य उजागर होते हैं। इसका कारण यह है कि मुझे अपने परीक्षणों में तर्क को डुप्लिकेट करने की आवश्यकता नहीं है। क्लाइंट कोड देखभाल कैसे हटाता है ... यह केवल परवाह करता है कि ग्राहक व्यवहार का खुलासा करता है। सी.स्टेट == ग्राहकस्टेट्स। हटाए गए और सी। अपडेटेडबी == GetCurrentUser() इत्यादि के बारे में हमारे परीक्षणों में इस तरह के प्रयासों के रूप में हम बस जोर देकर कहते हैं कि एक नकली उपयोग करके ग्राहक सीम पर हटाई गई विधि को बुलाया गया था।

अब शीर्षक पर वापस आने के लिए। किसी व्यावसायिक वस्तु में होने वाले तर्क की मात्रा तर्क की मात्रा है जो इसके राज्य को समाहित करने की ज़िम्मेदारी के तहत आती है। कभी-कभी यह बहुत है, कभी-कभी इसकी नहीं। ऐसे स्थान हैं जहां आप सेवाओं का भी उपयोग करना चाहते हैं ... एक अच्छा उदाहरण किसी दिए गए व्यवहार के लिए कई डोमेन ऑब्जेक्ट्स के बीच बातचीत को समन्वयित करेगा, लेकिन यहां तक ​​कि सेवा को डोमेन ऑब्जेक्ट्स पर व्यवहार पर कॉल करना चाहिए।

क्या इससे चीजों को थोड़ा सा स्पष्ट करने में मदद मिलती है?

ग्रेग

+0

मैं वास्तव में आपके साथ 100% सहमत हूं, लेकिन मेरी दुकान एसओए बैंडवागन पर कूद गई है, और यहां डीटीओ या संदेश शैली इकाइयों की ओर एक मजबूत गति है। क्या आप तर्क देंगे कि रिपोजिटरी पैटर्न स्वाभाविक रूप से त्रुटिपूर्ण है? जब आपकी ग्राहक वस्तुएं स्वयं को सहेज सकती हैं तो काम की इकाई कैसे फिट होती है? –

+0

ओह हाँ, और एक पूरी तरह से अलग मंच में जवाब देने के लिए समय निकालने के लिए धन्यवाद, तो आपका ब्लॉग :-) –

+1

मुझे लगता है कि ग्रेग की टिप्पणी है कि ग्राहक। डिलीट() विधि खराब है इसका मतलब यह है कि यह एक विधि नहीं है जिसे आप आम तौर पर रखेंगे डोमेन मॉडल (ग्रेग, अगर मैं गलत हूं तो कृपया मुझे सही करें।) यह ActiveRecord मॉडल में फिट होगा। रिपोजिटरी टूटा नहीं है, यह एक विशिष्ट उद्देश्य के लिए है: सतत मॉडल। –

1

मुख्य बिंदु यह है कि कोई तर्क को परिभाषित करता है। कुछ उदाहरण देने के लिए:

  1. मैं एक व्यक्ति इकाई में फ़ंक्शननाम() को फ़ंक्शन नहीं वर्गीकृत करता हूं, जो कुछ तारों को तर्क के रूप में जोड़ता है।
  2. ऑर्डर आइटम वैल्यू की गणना करना तर्क होने के लिए अधिक योग्य होगा।
  3. कुछ बुकिंग लेनदेन करना मैं निश्चित रूप से तर्क कहूंगा।

प्वाइंट 1 और शायद 2 मेरे लिए इकाई में जाएंगे। प्वाइंट 3 नहीं। (पठन/लेखन)

  • किसी भी आपरेशन है कि किसी भी दृढ़ता से संबंधित काम करता है
  • किसी भी आपरेशन कि किसी अन्य (सीधे संबंधित नहीं है, जैसे गुरु-विस्तार) इकाई
शामिल है: तो मैं तर्क के रूप में परिभाषित

आईएमओ, इनमें से कोई भी संचालन संस्थाओं में नहीं है।

अब, क्यों/जब मैं एक इकाई में 1 और 2 प्रकार के संचालन को भी नहीं डालूंगा? यह एक दुर्लभ स्थिति है, लेकिन मैं इसे नहीं करूँगा, जैसे ही इकाई में संग्रहीत डेटा को एप्लिकेशन द्वारा उपयोग किए जाने से पहले किसी भी तरीके से व्याख्या की जानी चाहिए (उदाहरण के लिए यदि वर्तमान उपयोगकर्ता के आधार पर, फ़ील्ड एक्स की सामग्री इसका एक अलग अर्थ है), इसका मतलब है कि इकाई का डेटा स्वयं कुछ तर्क उत्पन्न करता है।

+1

मास्टर-विवरण एक समग्र रूट का उपयोग करने का तात्पर्य है, जो वास्तव में, डोमेन मॉडल में संग्रहीत तर्क के लिए एक महान जगह होगी। –

0

जहां तक ​​मैं इसे समझता हूं, किसी इकाई से संबंधित सभी व्यावसायिक तर्क उस इकाई में जाना चाहिए। इसमें कोई तर्क शामिल है जो सिस्टम के व्यावसायिक नियमों के आधार पर इकाई के व्यवहार या आंतरिक संरचना को परिभाषित करता है। इसमें प्रस्तुति तर्क या दृढ़ता तर्क (सक्रिय रिकॉर्ड डिज़ाइन पैटर्न के साथ स्पष्ट अपवाद) शामिल नहीं होना चाहिए, लेकिन डेटा सत्यापन, इकाई संबंध, राज्य मशीनों और अन्य चीजों जैसे चीजों को शामिल करना चाहिए जो परिभाषित करते हैं कि इकाई वास्तविक- दुनिया की बात यह मॉडल करने की कोशिश कर रही है।

जिस तरह से मैं इसे देखने का प्रयास करता हूं वह है कि मेरे मॉडल को जितना संभव हो उतना पुन: प्रयोज्य बनाएं। हमेशा यह सोचने की कोशिश करें कि मॉडल का उपयोग कैसे किया जाएगा यदि इसे किसी अन्य सिस्टम पर पोर्ट किया जाए जहां क्लाइंट कोड (या इकाई का उपयोग करने वाला कोड) अलग हो सकता है। यदि कार्यक्षमता इकाई का हिस्सा नहीं है, तो क्या यह वही व्यवसाय नियमों के बाद भी वैसे ही व्यवहार करेगा? यदि उत्तर नहीं है तो कार्यक्षमता इकाई में जाना चाहिए।

+0

आप सक्रिय रिकॉर्ड के बारे में सही हैं, लेकिन लेनदेन स्क्रिप्ट की तरह, सक्रिय रिकॉर्ड आमतौर पर एक डोमेन के लिए एक प्रतियोगी [1] के रूप में देखा जाता है जिसके बारे में ग्रेग लिखता है। [1] http://martinfowler.com/eaaCatalog/ –

1

हाल ही में, मैं डोमेन मॉडल संरचना है और केवल उन व्यवहारों को उस मॉडल के लिए सार्वभौमिक हैं कि विस्तार के साथ (यानी व्यवहार कि कई भर में इस्तेमाल किया जा सकता घिरा संदर्भों) बनाने के विचार के साथ किया गया है एक बाध्य संदर्भ के लिए विशिष्ट व्यवहार के तरीकों। यह डोमेन मॉडल को डीटीओ (उन लोगों के लिए) के करीब रखता है और उस डोमेन मॉडल के उपयोग को प्रतिबंधित संदर्भ में केवल अनुमति व्यवहारों तक सीमित करता है। तो यह एक मध्य-सड़क के जवाब के लिए एक विकल्प हो सकता है। :)

4

यदि आप उन्हें अपने "डोमेन मॉडल ऑब्जेक्ट्स" कह रहे हैं तो मुझे लगता है कि आप फाउलर के डोमेन मॉडल पैटर्न को रेफर कर रहे हैं।http://martinfowler.com/eaaCatalog/domainModel.html

धारणा को देखते हुए, तो आपके प्रश्न का उत्तर "सभी व्यावसायिक तर्क" है क्योंकि यह अनिवार्य रूप से पैटर्न की परिभाषा है।

दुर्भाग्यवश शब्द "डोमेन मॉडल" को हाल ही में कम किया गया है, इसका मतलब केवल आपके डेटा के ऑब्जेक्ट मॉडल का कोई व्यवहार नहीं है।

यदि आपने पहले से ऐसा नहीं किया है, तो मैं आपको PoEAA पढ़ने के लिए प्रोत्साहित करता हूं और यह तय करता हूं कि डोमेन तर्क आपकी स्थिति में कहां से संबंधित है। यदि आप किसी डोमेन मॉडल पर निर्णय लेते हैं, तो मैं आपको इवान की डीडीडी पुस्तक पढ़ने और संस्थाओं, मूल्य वस्तुओं और सेवाओं के बीच अंतरों के बारे में जानने के लिए प्रोत्साहित करता हूं।

आशा है कि मदद करता है!

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