मैंने हाल ही में लोगों को यह कहते हुए सुना है कि डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) एक एंटी-पैटर्न हैं ।
क्यों? विकल्प क्या हैं?
मैंने हाल ही में लोगों को यह कहते हुए सुना है कि डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) एक एंटी-पैटर्न हैं ।
क्यों? विकल्प क्या हैं?
जवाबों:
कुछ परियोजनाओं में दो बार सभी डेटा होते हैं । एक बार डोमेन ऑब्जेक्ट के रूप में, और एक बार डेटा ट्रांसफर ऑब्जेक्ट के रूप में।
इस दोहराव की एक बड़ी लागत है , इसलिए वास्तुकला को इस मूल्य से अलग होने के लिए एक बड़ा लाभ प्राप्त करने की आवश्यकता है।
DTO एक प्रतिमान नहीं हैं। जब आप तार के पार कुछ डेटा भेज रहे हों (जैसे कि अजाक्स कॉल में एक वेब पेज पर), तो आप यह सुनिश्चित करना चाहते हैं कि आप बैंडविड्थ का संरक्षण केवल उस डेटा को भेजकर करें जिसका गंतव्य उपयोग करेगा। इसके अलावा, अक्सर प्रेजेंटेशन लेयर के लिए डेटा को देशी व्यावसायिक ऑब्जेक्ट की तुलना में थोड़ा अलग प्रारूप में रखना सुविधाजनक होता है।
मुझे पता है कि यह एक जावा-उन्मुख प्रश्न है, लेकिन .NET भाषाओं में अनाम प्रकार, क्रमांकन और LINQ डीटीओ को ऑन-द-फ्लाई का निर्माण करने की अनुमति देता है, जो सेटअप और ओवरहेड का उपयोग कम करता है।
EJB 3.0 में DTO एक एंटीपैटर्न कहता है:
EJB 3.0 से पहले EJB विनिर्देशों में इकाई बीन्स की भारी वजन प्रकृति, डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) जैसे डिज़ाइन पैटर्न का उपयोग करती है। डीटीओ हल्के ऑब्जेक्ट बन गए (जो पहले से ही इकाई सेम होना चाहिए था), जिसका उपयोग टियर में डेटा भेजने के लिए किया जाता है ... अब ईजेबी 3.0 कल्पना एंटीन बीन मॉडल को प्लेन पुराने जावा ऑब्जेक्ट (पीओजेओ) के समान बनाती है। इस नए POJO मॉडल के साथ, आपको अब प्रत्येक इकाई के लिए या संस्थाओं के एक समूह के लिए एक DTO बनाने की आवश्यकता नहीं होगी ... यदि आप EJB को भेजना चाहते हैं तो 3.0 इकाइयाँ टीयर भर में बना सकती हैं और उन्हें लागू करें java.io.Serialiazable
मुझे नहीं लगता कि डीटीओ प्रति एसई के प्रति-प्रतिरूप हैं, लेकिन डीटीओ के उपयोग से जुड़े एंटीपैटर्न हैं। एक उदाहरण के रूप में बिल ड्यूडी डीटीओ विस्फोट को संदर्भित करता है:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
यहाँ उल्लिखित डीटीओ की कई गालियाँ भी हैं:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
वे तीन स्तरीय प्रणालियों (आमतौर पर तकनीक के रूप में ईजेबी का उपयोग करके) के कारण उत्पन्न हुए, जो कि स्तरों के बीच डेटा को पारित करने के साधन के रूप में हैं। अधिकांश आधुनिक दिन जावा सिस्टम फ्रेमवर्क पर आधारित होते हैं, जैसे कि स्प्रिंग में POJOs का उपयोग डोमेन ऑब्जेक्ट्स (अक्सर JPA आदि के साथ एनोटेट ...) के रूप में एक वैकल्पिक सरलीकृत दृश्य के रूप में किया जाता है ... यहां DTO का उपयोग अनावश्यक है।
OO के शुद्धतावादी कहेंगे कि DTO पैटर्न-विरोधी है क्योंकि ऑब्जेक्ट वास्तविक डोमेन ऑब्जेक्ट के बजाय डेटा टेबल प्रतिनिधित्व बन जाते हैं।
कुछ डीटीओ को उनके संभावित दुर्व्यवहारों के कारण एक विरोधी पैटर्न मानते हैं। वे अक्सर उपयोग किया जाता है जब वे नहीं होना चाहिए / नहीं होना चाहिए।
यह लेख अस्पष्ट रूप से कुछ अपशब्दों का वर्णन करता है।
यदि आप एक वितरित प्रणाली का निर्माण कर रहे हैं, तो डीटीओ निश्चित रूप से एक विरोधी पैटर्न नहीं हैं। हर कोई उस अर्थ में विकसित नहीं होगा, लेकिन अगर आपके पास (उदाहरण के लिए) ओपन सामाजिक ऐप सभी जावास्क्रिप्ट से चल रहा है।
यह आपके API पर डेटा का लोड पोस्ट करेगा। यह तब वस्तु के किसी रूप में deserialized है, आमतौर पर एक DTO / अनुरोध वस्तु। तब यह सुनिश्चित करने के लिए मान्य किया जा सकता है कि दर्ज किया गया मॉडल मॉडल में परिवर्तित होने से पहले सही है।
मेरी राय में, इसे एक एंटी-पैटर्न के रूप में देखा जाता है क्योंकि यह गलत उपयोग है। यदि आप एक वितरित प्रणाली का निर्माण नहीं कर रहे हैं, तो संभावना है कि आपको उनकी आवश्यकता नहीं है।
एक के इरादे डाटा ट्रांसफर वस्तु विभिन्न स्रोतों से डेटा स्टोर और फिर एक डेटाबेस (या में स्थानांतरित करना है रिमोट फसाड एक बार में)।
हालाँकि, डीटीओ पैटर्न सिंगल रिस्पॉन्सिबिलिटी सिद्धांत का उल्लंघन करता है , क्योंकि डीटीओ न केवल डेटा स्टोर करता है, बल्कि इसे डेटाबेस या फ़ेसडे से भी स्थानांतरित करता है।
व्यापारिक वस्तुओं से डेटा ऑब्जेक्ट को अलग करने की आवश्यकता एक एंटीपैटर्न नहीं है, क्योंकि संभवतः डेटाबेस परत को वैसे भी अलग करना आवश्यक है ।
डीटीओ के बजाय आपको एग्रीगेट और रिपोजिटरी पैटर्न का उपयोग करना चाहिए, जो वस्तुओं के संग्रह ( एग्रीगेट ) और डेटा ट्रांसफर ( रिपोजिटरी ) को अलग करता है।
ऑब्जेक्ट के एक समूह को स्थानांतरित करने के लिए आप यूनिट ऑफ़ वर्क पैटर्न का उपयोग कर सकते हैं , जो रिपॉजिटरी का एक सेट और एक लेनदेन संदर्भ रखता है; प्रत्येक वस्तु को लेनदेन के भीतर अलग-अलग स्थान पर स्थानांतरित करने के लिए।
जब आप अपने सभी डोमेन ऑब्जेक्ट्स से संबंधित ऑब्जेक्ट्स को EAGERly लोड करते हैं तो DTO एक आवश्यकता बन जाता है और ANTI-PATTERN नहीं।
यदि आप डीटीओ नहीं बनाते हैं, तो आपके पास आपके व्यवसाय की परत से आपके ग्राहक / वेब परत तक अनावश्यक स्थानांतरित वस्तुएं होंगी।
इस मामले के लिए ओवरहेड को सीमित करने के लिए, बल्कि डीटीओ को स्थानांतरित करें।
प्रश्न "क्यों" नहीं होना चाहिए, लेकिन " कब " होना चाहिए ।
निश्चित रूप से यह एंटी-पैटर्न है जब केवल इसका उपयोग करने का परिणाम उच्च लागत है - रन-टाइम या रखरखाव। मैंने डेटाबेस इकाई वर्गों के समान सैकड़ों डीटीओ वाली परियोजनाओं पर काम किया। प्रत्येक बार जब आप एक एकल फ़ील्ड जोड़ना चाहते थे, जिसमें आप चार बार आईडी जोड़ते हैं - डीटीओ से, इकाई तक, डीटीओ से डोमेन कक्षाओं या संस्थाओं में रूपांतरण करने के लिए, उलटा रूपांतरण, ... आप कुछ स्थानों और डेटा को भूल गए असंगत।
यह विरोधी पैटर्न नहीं है जब आपको वास्तव में डोमेन वर्गों के विभिन्न प्रतिनिधित्व की आवश्यकता होती है - अधिक सपाट, अधिक अमीर, अधिक संकीर्ण, ...
व्यक्तिगत रूप से मैं डोमेन क्लास से शुरू करता हूं और इसे पास करता हूं, सही स्थानों पर उचित जांच के साथ। मैं JSON या XML जैसे क्रमांकन प्रारूपों में डेटाबेस के लिए मैपिंग बनाने के लिए कुछ "हेल्पर" वर्गों को एनोटेट और / या जोड़ सकता हूं ... यदि मुझे आवश्यकता महसूस होती है तो मैं हमेशा कक्षा को दो में विभाजित कर सकता हूं।
यह आपके दृष्टिकोण के बारे में है - मैं एक डोमेन ऑब्जेक्ट को एक ही ऑब्जेक्ट के रूप में देखना पसंद करता हूं, जो एक-दूसरे से निर्मित कई ऑब्जेक्ट्स के बजाय विभिन्न भूमिका निभा रहा है। यदि किसी ऑब्जेक्ट की एकमात्र भूमिका डेटा ट्रांसपोर्ट कर रही है, तो यह डीटीओ है।
मुझे लगता है कि लोगों का मतलब है कि अगर आप सभी दूरस्थ वस्तुओं को डीटीओ के रूप में लागू करते हैं तो यह एक विरोधी पैटर्न हो सकता है। एक डीटीओ केवल विशेषताओं का एक सेट है और यदि आपके पास बड़ी वस्तुएं हैं, तो आपको हमेशा सभी विशेषताओं को स्थानांतरित करना होगा, भले ही आपको उनकी आवश्यकता न हो या उनका उपयोग न करें। बाद के मामले में एक प्रॉक्सी पैटर्न का उपयोग करना पसंद करते हैं।