विभिन्न भाषाओं में ऐप के कुछ हिस्सों को लिखे जाने पर डेटा संरचनाओं के दोहराव से कैसे बचें?


12

एक उदाहरण के रूप में, कहते हैं कि आप जावा में एक ऐप लिख रहे हैं ।

आपका ऐप Python में लिखे API सर्वर के साथ संचार करता है ।

पायथन सर्वर एक SQL डेटाबेस के साथ संचार करता है।

आपके पास जावास्क्रिप्ट में लिखे गए आपके ऐप के लिए एक वेबसाइट भी है ।

4 अलग-अलग भाषाओं के साथ, अनिवार्य रूप से समान डेटा संरचनाओं को अलग-अलग दोहराते हुए समाप्त करना आसान है।

उदाहरण के लिए, एक Userप्रकार इस तरह दिख सकता है (छद्मकोश):

type User {
  integer id;
  string name;
  timestamp birthday;
}

परियोजना के प्रत्येक भाग के लिए किसी न किसी तरह के प्रतिनिधित्व की आवश्यकता होगी User। जावा और पायथन भागों को दो अलग-अलग classघोषणाओं की आवश्यकता होगी । डेटाबेस को Userतालिका घोषणा की आवश्यकता होगी । और सामने के छोर साइट को Userभी प्रतिनिधित्व करने की आवश्यकता होगी ।

इस प्रकार को 4 अलग-अलग समयों में दोहराने से डोंट-रिपीट-योरसेल्फ सिद्धांत वास्तव में टूट जाता है । इसके अलावा समस्या यह है कि यदि Userप्रकार बदल दिया जाता है तो इन परिवर्तनों को परियोजना के हर अलग हिस्से में दोहराया जाना चाहिए।

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

क्या किसी के पास इस बारे में पुस्तकों / ब्लॉग पोस्ट के लिए कोई सुझाव या लिंक है?


यह एक कारण है कि बहुत सारे लोग अपने सभी विकास को जावास्क्रिप्ट में स्थानांतरित कर रहे हैं। क्लाइंट पर काम करता है (वेब, मोबाइल के लिए ईओण, डेस्कटॉप के लिए इलेक्ट्रॉन), सर्वर (नोड), डेटाबेस (MongoDB)।
पॉल

3
एक ही डेटा संरचनाओं को साझा कर सकते हैं अगर पीछे और सामने के छोर एक ही भाषा का उपयोग करते हैं। यदि यह विभिन्न कोड आधारों का उपयोग कर रहा है तो आपका खुद को दोहराना नहीं है। विभिन्न देव प्लेटफार्मों से xml स्कीमा या जोंस स्ट्रिंग्स से कक्षाएं उत्पन्न करने के लिए टूलिंग का उपयोग करें।
जॉन रेन्नोर

5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle। यह नहीं है। आपके पास 4 अलग-अलग सिस्टम हैं जो अलग-अलग चीजें करते हैं। आप DRY बहुत दूर ले जा रहे हैं। मेरे अनुभव के अनुसार, पुन: प्रयोज्यता का क्रम जो आप करना चाहते हैं, वह बुराई का बीज है, क्योंकि तंग युग्मन का परिचय दें। वह भी User4 अलग-अलग भाषाओं में 4 बार दोहराए जाने से भी बदतर । वितरित वातावरण में, युग्मन एक समस्या है। DRY नहीं है।
Laiv

उत्तर के लिए समय न रखें: अपनी आवश्यकताओं के आधार पर आप उदाहरण के लिए OWL का उपयोग करके सत्यापन के लिए नियम बनाने का प्रयास कर सकते हैं (इसलिए एक ऑन्कोलॉजी का निर्माण करें)। सत्यापन नियम तब "डेटा" बन जाते हैं जिनका उपयोग आवश्यक बिंदुओं पर किया जा सकता है। नियमों को बदलना तब एक केंद्रीय स्थान पर किया जा सकता है।
डैनियल जर्स

जवाबों:


12

आप नहीं। या वास्तव में, आपको नहीं करना चाहिए।

यदि आप ऐप, अपने सर्वर और अपनी वेबसाइट को अलग संदर्भों के रूप में सोचते हैं, तो यह समझ में आता है कि डुप्लिकेट संरचनाएं हैं। कारण क्यों यह एक अच्छी बात हो सकती है:

  • संरचनाएं समान हैं, लेकिन समान नहीं हैं। भले ही 90% संरचना सभी संदर्भों में समान हो। इसका 10% जो आपको बड़े पैमाने पर सिरदर्द देगा।
  • पैटर्न और कार्यान्वयन अलग हो सकते हैं। जब विभिन्न भाषाओं और रूपरेखाओं का उपयोग किया जाता है, तो उन सभी के लिए समान कार्यान्वयन होना बहुत मुश्किल हो जाता है
  • साझा संरचना एक निर्भरता बन जाती है, जिसे प्रबंधित करने की आवश्यकता होती है। साझा निर्भरता होने से विकास बहुत जटिल हो जाता है, क्योंकि जो परिवर्तन एक संदर्भ में महान है वह दूसरे में संक्षिप्त है। इस साझा निर्भरता के विकास के समन्वय के लिए बहुत सारे प्रयासों की आवश्यकता है
  • अलग-अलग संदर्भों में अलग-अलग तैनाती होती है। यहां तक ​​कि अगर आप सभी संदर्भों में समान डेटा संरचना और समान सत्यापन कोड साझा करने का प्रबंधन करते हैं, तो भी यह हो सकता है कि एक संदर्भ के नए संस्करण को तैनात किया जाता है, जबकि अन्य पुराने संस्करण पर होते हैं, इसलिए उन स्थितियों में जहां संस्करणों में डीसिन्क्रनाइज़ेशन अभी भी आवश्यक है संबोधित किया गया

जबकि DRY सिद्धांत अद्भुत है, मुझे लगता है कि संदर्भों या परतों में डेटा संरचनाओं को साझा करने से यह हल करने की तुलना में अधिक समस्याएं पैदा करता है। खासकर अगर प्रोजेक्ट इतना बड़ा हो जाता है कि अलग-अलग लोग अलग-अलग संदर्भों पर काम कर रहे हों।


5

मुझे लगता है कि @ यूफ़ोरिक ने आपके कोड की नकल न करने के कुछ अच्छे कारणों को सूचीबद्ध किया है। हालाँकि, अगर आपको ऐसा करना चाहिए तो मैं कोड जनरेशन का उपयोग करने की सलाह दूंगा।

डेटा के विहित रूप का पता लगाएं

ऐसा प्रभावी ढंग से करने के लिए आपको पहले यह पता लगाना होगा कि डेटा का विहित रूप क्या है। क्या यह आपका SQL स्कीमा है, या आपके जावा प्रोग्राम में कक्षाएं हैं?

व्युत्पन्न (स्वचालित रूप से) अन्य रूपों से

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

अंतर मतभेद

जनरेट किए गए कोड के अनुभागों को "स्पर्श न करें" के रूप में चिह्नित करना आसान होना चाहिए - इस तरह से आप सभी अलग-अलग अभ्यावेदन (उदाहरण के लिए: आपके जेएस फ्रंटएंड और जावा बैकएंड के लिए लिखे गए कस्टम कोड) के बीच आवश्यक अंतर को समायोजित करेंगे। उत्थान के दौरान संरक्षित करने की आवश्यकता है।
Git से एक उदाहरण लें; जब यह आपको एक प्रतिबद्ध संदेश दर्ज करने के लिए एक संपादक को खोलता है, तो फ़ाइल में पहले से ही कुछ पाठ होता है, लेकिन इसमें यह # -------- >8 --------जानने के लिए मार्कर होता है कि आपकी सामग्री कहाँ समाप्त होती है, और जहाँ इसका स्वतः उत्पन्न पाठ शुरू होता है।

फिर भी, यदि आप कर सकते हैं - इस तरह के दोहराव से बचें। यह एक PITA है, भले ही आपका अधिकांश कोड अपने आप जेनरेट हो जाए।


यह उत्तर "यहाँ कुछ सर्वोत्तम प्रथाओं" के बजाय एक कहानी समय का एक सा है - मैंने जो वर्णित किया है वह वही है जो मैंने एक बार किया था जब मुझे आपके समान समस्या थी और सिस्टम के विभिन्न हिस्सों में समान डेटा का प्रतिनिधित्व करने की आवश्यकता थी (या, बल्कि, दो अलग-अलग प्रणालियों में)।

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