डीटीओ के रूप में "लचीले" या सार के रूप में किसी चीज़ के लिए सर्वोत्तम अभ्यास स्थापित करना कठिन है। अनिवार्य रूप से, डीटीओ केवल डेटा ट्रांसफर के लिए ऑब्जेक्ट हैं, लेकिन गंतव्य या ट्रांसफर के कारण के आधार पर, आप अलग-अलग "वास्तविक प्रथाओं" को लागू करना चाह सकते हैं।
मैं मार्टिन फाउलर द्वारा एंटरप्राइज एप्लिकेशन आर्किटेक्चर के पैटर्न को पढ़ने की सलाह देता हूं । पैटर्न के लिए समर्पित एक पूरा अध्याय है, जहां डीटीओ को वास्तव में विस्तृत अनुभाग मिलता है।
मूल रूप से, उन्हें महंगी रिमोट कॉल में उपयोग करने के लिए "डिज़ाइन" किया गया था, जहां आपको तर्क के विभिन्न हिस्सों से बहुत अधिक डेटा की आवश्यकता होगी; डीटीओ एक ही कॉल में डेटा ट्रांसफर करेंगे।
लेखक के अनुसार, डीटीओ का उद्देश्य स्थानीय वातावरण में इस्तेमाल नहीं किया जाना था, लेकिन कुछ लोगों ने उनके लिए उपयोग पाया। आमतौर पर वे GUI, API या अलग-अलग परतों के लिए अलग-अलग POCO से एक ही इकाई में जानकारी एकत्र करने के लिए उपयोग किए जाते हैं।
अब, विरासत के साथ, कोड का पुन: उपयोग इसके मुख्य उद्देश्य के बजाय विरासत के साइड-इफेक्ट की तरह है; दूसरी ओर, रचना को मुख्य उद्देश्य के रूप में कोड पुन: उपयोग के साथ लागू किया जाता है।
कुछ लोग रचना और विरासत के उपयोग को एक साथ करने की सलाह देते हैं, दोनों की ताकत का उपयोग करते हैं और अपनी कमजोरियों को कम करने की कोशिश करते हैं। निम्नलिखित नए DTO, या उस मामले के लिए किसी भी नए वर्ग / वस्तु को चुनते या बनाते समय मेरी मानसिक प्रक्रिया का हिस्सा है:
- मैं एक ही परत या एक ही संदर्भ के अंदर डीटीओ के साथ विरासत का उपयोग करता हूं। एक DTO को कभी भी POCO से विरासत में नहीं मिलेगा, एक BLL DTO को DAL DTO से विरासत में कभी नहीं मिलेगा, आदि।
- अगर मैं खुद को डीटीओ से एक क्षेत्र को छिपाने की कोशिश कर रहा हूं, तो मैं रिफ्लेक्टर करूंगा और शायद इसके बजाय रचना का उपयोग करूंगा।
- यदि एक आधार डीटीओ से बहुत कम अलग-अलग क्षेत्र हैं जो मुझे चाहिए, तो मैं उन्हें एक सार्वभौमिक डीटीओ में डालूंगा। यूनिवर्सल डीटीओ का उपयोग केवल आंतरिक रूप से किया जाता है।
- एक आधार POCO / DTO लगभग किसी भी तर्क के लिए उपयोग नहीं किया जाएगा, इस तरह से आधार केवल अपने बच्चों की जरूरतों का जवाब देता है। यदि मुझे कभी आधार का उपयोग करने की आवश्यकता होती है, तो मैं किसी भी नए क्षेत्र को जोड़ने से बचता हूं जो उसके बच्चे कभी उपयोग नहीं करेंगे।
उनमें से कुछ शायद "सर्वश्रेष्ठ" अभ्यास नहीं करते हैं, वे उन परियोजनाओं के लिए काफी अच्छी तरह से काम करते हैं जिन पर मैं काम कर रहा हूं, लेकिन आपको यह याद रखना होगा कि कोई भी आकार सभी के लिए फिट नहीं है। सार्वभौमिक डीटीओ के मामले में आपको सावधान रहना चाहिए, मेरे तरीके हस्ताक्षर इस तरह दिखते हैं:
public void DoSomething(BaseDTO base) {
//Some code
}
यदि विधियों में से किसी को कभी भी अपने स्वयं के डीटीओ की आवश्यकता होती है तो मैं वंशानुक्रम करता हूं और आमतौर पर केवल मुझे जो बदलाव करने की आवश्यकता होती है वह पैरामीटर है, हालांकि कभी-कभी मुझे विशिष्ट मामलों के लिए गहरी खुदाई करने की आवश्यकता होती है।
आपकी टिप्पणियों से मुझे लगता है कि आप नेस्टेड डीटीओ का उपयोग कर रहे हैं। यदि आपके नेस्टेड डीटीओ में केवल अन्य डीटीओ की सूची है, तो मुझे लगता है कि सबसे अच्छी बात यह है कि सूची को खोलना नहीं है।
डेटा की मात्रा के आधार पर आपको प्रदर्शित करने या इसके साथ काम करने की आवश्यकता है, यह डेटा को सीमित करने वाले नए डीटीओ बनाने के लिए एक अच्छा विचार हो सकता है; उदाहरण के लिए, यदि आपके UserDTO में बहुत सारे फ़ील्ड हैं और आपको केवल 1 या 2 की आवश्यकता है, तो केवल उन फ़ील्ड्स के साथ DTO रखना बेहतर हो सकता है। डीटीओ की परत, संदर्भ, उपयोग और उपयोगिता को परिभाषित करते हुए इसे डिजाइन करने में बहुत मदद मिलेगी।