क्या ट्रम्प DRY को REST में डिकम्पोज कर रहा है?


19

मैं मौजूदा Java API की अधिकांश कार्यक्षमता को उजागर करने के लिए REST API का निर्माण कर रहा हूं। दोनों API मेरे संगठन के भीतर आंतरिक उपयोग के लिए हैं; मुझे बाहरी उपयोग के लिए डिज़ाइन करने की आवश्यकता नहीं है। मेरा दोनों API पर प्रभाव है, लेकिन REST को लागू कर रहा हूं। जावा एपीआई का उपयोग स्थानीय अनुप्रयोगों के लिए किया जाना जारी रहेगा (यह "सेवानिवृत्त नहीं हो रहा है"), लेकिन REST API का उपयोग महत्वपूर्ण तकनीकी विकास के लिए किया जाएगा।

जावा एपीआई कक्षाओं में से कुछ बस डेटा हैं (गुण, गेटर्स, सेटर के साथ सेम)। और इनमें से कम से कम REST एपीआई पर डेटा (जो XML या JSON में marshalled किया जाएगा) से अधिक (किसी न किसी रूप में) संचारित करने का अर्थ है। उदाहरण के लिए, एक वर्ग जो सर्वर मशीन के बारे में जानकारी संग्रहीत करता है। मैं इन डेटा वर्गों के लिए निम्नलिखित विकल्प के साथ सामना कर रहा हूँ: क्या मैं ...

  1. मूल जावा वर्ग (या एक उपवर्ग) को सीधे REST एपीआई, या में उजागर करें
  2. REST API के लिए विशेष रूप से एक नया डेटा ट्रांसफर क्लास (DTO पैटर्न) बनाएं?

किसी भी तरह से मेरे पास अन्य डेटा अंतरण कक्षाएं होंगी; सवाल यह है कि क्या मूल की व्याख्या करें या नए बनाए जाएं (जो मूल की प्रतियों के पास हो सकते हैं)। अन्य विकल्प हो सकते हैं, लेकिन मैं मुख्य रूप से उन दो पर ध्यान केंद्रित करूंगा।

# 1 के लिए तर्क:

  • DRY (अपने आप को दोहराएं नहीं)
  • लागू करने के लिए तेज़
  • REST API को अपग्रेड करना आसान है

# 2 के लिए तर्क:

  • क्या होगा यदि REST API को Java API से अलग से संस्करणित करने की आवश्यकता हो? (यह कुछ हद तक संभावना है।)
  • क्या होगा यदि जावा डेटा वर्गों में महत्वपूर्ण परिवर्तन जैसे कि संपत्तियों को हटाने, व्यवहार को जोड़ने या वर्ग पदानुक्रम में परिवर्तन हो? (यह भी कुछ हद तक संभव है।)

लब्बोलुआब यह है कि यह DRY (# 1) और डिकॉउलिंग (# 2) के बीच एक व्यापार की तरह लगता है।

मैं # 1 के साथ शुरू करने की ओर झुक रहा हूं और अगर बाद में समस्याएँ # 2 के लिए आगे बढ़ रही हैं, तो आप क्या आप की जरूरत नहीं साबित कर सकते हैं नहीं बनाने के चुस्त दिशानिर्देश के बाद। क्या यह एक बुरा विचार है; अगर मुझे लगता है कि मुझे # 2 से शुरू करना चाहिए तो क्या मैं वहां भी समाप्त हो सकता हूं?

क्या मेरी सूची से बड़े तर्क / परिणाम गायब हैं?


अगर मुझे PragProg याद है, तो वास्तव में DRY करने के लिए एक ही स्रोत होगा जिसमें से Java वर्ग और dto दोनों उत्पन्न होते हैं
आकाशवाणी

"क्या होगा अगर" = YAGNI IMO
जोनाथन

जवाबों:


10

अच्छा सवाल, सीधे शब्दों में कहें तो डिकम्प्लस। यहाँ जाने का यही तरीका है, आप जावा के संस्करण से बंधे नहीं रहना चाहते।

एक ऐसा परिदृश्य है जिसे आप अपवित्र नहीं करते हैं: यदि आपकी तकनीक गैर-विशिष्ट-विशिष्ट वस्तुओं को तार के ऊपर भेजने की अनुमति देगी, अर्थात, यदि आप वर्तमान जावा वस्तुओं को अब एक YAGNI के रूप में उपयोग कर सकते हैं, और एक अलग के साथ प्रतिस्थापन कर सकते हैं टाइप करें कि आप कस्टम अप करेंगे एक साधारण ड्रॉप-इन होगा जो तार पर जाने वाली टाइप जानकारी के कारण कुछ भी नहीं तोड़ देगा। इसलिए, मूल रूप से यदि टाइप जानकारी तार को पार नहीं करती है तो आप इस पर YAGNI कर सकते हैं।

बस बहुत सावधान और सतर्क रहें कि आपके जावा संस्करण के किसी भी उन्नयन में इनमें से कोई भी वस्तु नहीं बदले। नहीं तो बस अभी डिसकस करो और इसके बारे में चिंता मत करो, मुझे लगता है कि यह इस बात पर निर्भर करता है कि यदि आपके पास कोई विकल्प है तो आपके पास कितना समय है।

हालाँकि, यदि आपके प्रोटोकॉल में टाइप की जानकारी तार पर जाती है, तो नए प्रकार के फ्लैट ड्रॉप-इन जब अंतर्निहित जावा प्रकार परिवर्तन संभव नहीं हो सकता है और यह एक बड़ा प्रयास हो सकता है। अगर ऐसा है, तो अब YAGNI में जाने का मतलब है तकनीकी ऋण और आपकी अंतर्निहित तकनीक से संबंधित जोखिम।

व्यक्तिगत रूप से मैं अभी डिकॉय करूंगा।

इसके अलावा, DRY इसमें नहीं खेलता है क्योंकि आपने अंतर्निहित टुकड़ों को नहीं लिखा है, इसलिए आप कोड को डुप्लिकेट नहीं कर रहे हैं और इसलिए उन सभी बगों के दर्द को दोहराया नहीं जाएगा, जो DRY की मुख्य चिंता है (और सामान्य रख-रखाव मुद्दे जो आपके पास फिर से नहीं होंगे क्योंकि आपके पास बनाए रखने के लिए डुप्लिकेट नहीं हैं)


7

# 1 के लिए मुख्य तर्क कार्यान्वयन और उन्नयन में आसानी है, लेकिन क्या यह आपकी आवश्यकताओं को पूरा करता है?

# 2 के अपने तर्कों में, आप इंगित करते हैं कि जावा एपीआई और रीस्ट एपीआई स्वतंत्र रूप से बदल सकते हैं। इसका मतलब है कि वे अलग-अलग चिंताएं हैं और आप अलग-अलग वर्गों का उपयोग करके खुद को दोहरा नहीं रहे हैं। सिर्फ इसलिए कि दो चीजें एक ही लग रहे हैं, इसका मतलब यह नहीं है कि वे कर रहे हैं एक ही।


6

आपके REST API को आपके डेटा मॉडल के समान संरचना का पालन करने की आवश्यकता नहीं है

REST लागू करते समय सुनिश्चित करें कि आप एक सहज बाहरी API बना रहे हैं, और फिर इसे अपने आंतरिक डेटा मॉडल कक्षाओं में मैप करें। यह आपको एपीआई के लिए अग्रणी प्रत्येक स्वतंत्र रूप से बदलने की अनुमति देता है जो दशकों तक रह सकता है

इसलिए, डिकूपिंग यहां जाने का रास्ता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.