2008-09-21 25 views
11

एक सलाहकार I सम्मान से पता चलता है कि एक साधारण बीन समय की बर्बादी है - कि मूल्य वस्तुओं 'जरूरी' में कुछ व्यावसायिक तर्क उपयोगी होने के लिए होते हैं।वस्तुओं के मूल्य में कितना व्यावसायिक तर्क होना चाहिए?

एक और कहता है कि इस तरह के कोड को बनाए रखना मुश्किल है और सभी व्यावसायिक तर्कों को बाहरीकृत किया जाना चाहिए।

मुझे एहसास है कि यह प्रश्न व्यक्तिपरक है। वैसे भी पूछना - अधिक दृष्टिकोण से जवाब जानना चाहते हैं।

उत्तर

6

आपको उन्हें Transfer Objects या Data transfer objects (DTO) पर बेहतर कॉल करना चाहिए।

इससे पहले इसी J2EE पैटर्न 'मूल्य वस्तु' कहा जाता था, लेकिन वे नाम बदल दिया है क्योंकि यह इस के साथ भ्रमित

http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html

अपने प्रश्न का उत्तर देने का था, मैं सिर्फ अपने DTOs के लिए कम से कम तर्क रखा, तर्क कारणों के लिए आवश्यक तर्क।

और भी बेहतर, अगर हम एक डेटाबेस आधारित वेब अनुप्रयोग के बारे में बात कर रहे हैं, मैं कोर J2EE पैटर्न से परे जाकर Hibernate का उपयोग करें या Java Persistence API एक डोमेन मॉडल संबंधों के आलसी लोड हो रहा है का समर्थन करता है कि बना सकते हैं और ध्यान में रखते हुए इस का उपयोग होगा।

Open session in view देखें।

इस तरह, आप DTOs का एक सेट प्रोग्राम करने की जरूरत नहीं है और आप सभी व्यापार तर्क अपने विचार/नियंत्रक आदि

2

मेरी निजी वरीयता डोमेन मॉडल में सभी व्यावसायिक तर्क को रखना है, जो "सत्य" डोमेन ऑब्जेक्ट्स में है। इसलिए जब डेटा ट्रांसफर ऑब्जेक्ट्स बनाए जाते हैं तो वे ज्यादातर डोमेन ऑब्जेक्ट्स का केवल एक (अपरिवर्तनीय) राज्य प्रतिनिधित्व करते हैं और इसलिए कोई व्यावसायिक तर्क नहीं होता है। उनमें क्लोनिंग और तुलना करने के तरीकों के लिए विधियां हो सकती हैं, लेकिन व्यापार तर्क कोड का मांस डोमेन ऑब्जेक्ट्स में रहता है।

+0

धन्यवाद :)। क्या आप कृपया 'सत्य' डोमेन ऑब्जेक्ट्स के बारे में बताएंगे? –

5

यह निर्भर करता है।

ओह, क्या मैंने बस एक क्लिच को उड़ा दिया?

मूल प्रश्न एक वस्तु को डिजाइन करने के लिए पूछने के लिए है: तर्क वस्तु के डेटा को नियंत्रित करने वाले अलग या हो जाएगा एक ही जब इस्तेमाल किया/अन्य वस्तुओं से भस्म?

यदि विभिन्न तर्कों के लिए उपयोग के विभिन्न क्षेत्रों में कॉल किया जाता है, तो इसे बाहरी करें। यदि यह वही है, चाहे कोई वस्तु चाहे यात्रा करे, कक्षा के साथ इसे एक साथ रखें।

2

क्या Korros कहा में उपयोग करने के लिए उपलब्ध है।

मूल्य वस्तु: = धन या दिनांक सीमा जैसी एक छोटी साधारण वस्तु, जिसका समानता पहचान पर आधारित नहीं है।

डीटीओ: = एक ऑब्जेक्ट जिसमें विधि कॉल की संख्या को कम करने के लिए प्रक्रियाओं के बीच डेटा होता है।

मार्टिन फाउलर द्वारा प्रस्तावित ये निश्चित निर्णय हैं और मैं उन्हें लोकप्रिय बनाना चाहता हूं।

20

डेटा और व्यापार तर्क को एक साथ रखने का विचार encapsulation को बढ़ावा देना है, और अन्य वस्तुओं के लिए जितना संभव हो उतना आंतरिक आंतरिक राज्य का खुलासा करना है। इस तरह, ग्राहक एक कार्यान्वयन के बजाय एक इंटरफ़ेस पर भरोसा कर सकते हैं।"Tell, Don't Ask" सिद्धांत और Law of Demeter देखें। Encapsulation राज्यों के डेटा को समझना आसान बनाता है, कोड पढ़ने में आसान, कक्षाओं को कम करने और यूनिट परीक्षण के लिए आम तौर पर आसान है।

व्यापारिक तर्क (आमतौर पर "सेवा" या "प्रबंधक" कक्षाओं में) को "इस डेटा का उपयोग कहां किया जाता है?" और "यह किस राज्य में हो सकता है?" जवाब देने के लिए बहुत मुश्किल है। यह एक वस्तु में लपेटकर सोचने का एक प्रक्रियात्मक तरीका भी है। इससे anemic domain model हो सकता है।

बाहरी व्यवहार हमेशा बुरा नहीं होता है। उदाहरण के लिए, service layer डोमेन ऑब्जेक्ट्स को ऑर्केस्ट्रेट कर सकता है, लेकिन बिना किसी राज्य-मैनिपुलेटिंग जिम्मेदारियों को ले जा सकता है। या, जब आप ज्यादातर डीबी को पढ़ते/लिखते हैं जो रूपों को इनपुट करने के लिए अच्छी तरह से मानचित्रण करते हैं, तो शायद आपको डोमेन मॉडल की आवश्यकता नहीं है - या दर्दनाक ऑब्जेक्ट/रिलेशनल मैपिंग ओवरहेड इसमें शामिल है - बिलकुल भी।

स्थानांतरण ऑब्जेक्ट्स अक्सर किसी भी व्यावसायिक तर्क को उजागर किए बिना कॉलिंग परत की न्यूनतम राज्य जानकारी प्रदान करके एक दूसरे से (या बाहरी प्रणाली से) आर्किटेक्चरल परतों को कम करने के लिए काम करते हैं।

यह उपयोगी हो सकता है, उदाहरण के लिए जब दृश्य के लिए जानकारी की तैयारी: बस इतना है कि यह कैसे के बारे में जानकारी प्रदर्शित करने के लिए, बल्कि क्या से ध्यान केंद्रित कर सकते, इसके लिए आवश्यक जानकारी, और कुछ नहीं देखने देना प्रदर्शित करने के लिए जानकारी। उदाहरण के लिए, TO डेटा के कई स्रोतों का एकत्रीकरण हो सकता है।

एक फायदा यह है कि आपके विचार और आपके डोमेन ऑब्जेक्ट्स decoupled हैं। जेएसपी में अपने डोमेन ऑब्जेक्ट्स का उपयोग करने से आपके डोमेन को रिएक्टर करने में कठिनाई हो सकती है और गेटर्स और सेटर्स के अंधाधुंध उपयोग को बढ़ावा मिल सकता है (इसलिए encapsulation तोड़ना)।

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

1

मैं पैनागियोटिस से सहमत हूं: दृश्य पैटर्न में खुला सत्र डीटीओ का उपयोग करने से कहीं बेहतर है। अन्यथा रखो, मैंने पाया है कि यदि आप अपनी डोमेन ऑब्जेक्ट में ट्रैफ़िक करते हैं (या कुछ समग्र) अपनी दृश्य परत से सभी तरह से ट्रैफ़िक करते हैं तो एक एप्लिकेशन बहुत आसान होता है।

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

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

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