क्या हम एक बड़े कोडबेस के दूर के हिस्सों के बीच डेटा प्रवाह को जोड़ना आसान बना सकते हैं?


10

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

Yossi Kreinin के ब्लॉग पोस्ट से संबंधित उद्धरण http://www.yosefk.com/blog/i-want-a-struct-linker.html पर :

आपके पास कुछ प्रकार की डेटा संरचना है जो आप बहुत से पास करते हैं। जल्द ही, संरचना के बारे में सबसे मूल्यवान चीज वह डेटा नहीं है जो वह रखता है, लेकिन यह तथ्य कि यह नियंत्रण के कुछ बालों के प्रवाह के माध्यम से उपलब्ध है।

वैश्विक चर दूर कोड को "चिल्लाने" के लिए एक क्लासिक तरीका है, लेकिन वे समस्याग्रस्त होने के लिए जाने जाते हैं। डायनामिक रूप से स्कोप किए गए चर एक अधिक प्रतिबंधित तरीका है, लेकिन वे समस्याग्रस्त भी हैं।

क्या इस समस्या को हल करने के उद्देश्य से कोई प्रोग्रामिंग भाषा अनुसंधान है? स्थैतिक जाँच, आसान इकाई परीक्षण और अन्य अच्छाइयों के होते हुए क्या हम डेटा के अप्रत्याशित प्रवाह को एक बड़े कोडबेस में जोड़ना आसान बना सकते हैं?


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

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

ठीक है, मुझे लगता है कि डेटा प्रवाह को स्पष्ट रूप से मॉडल करने में मदद मिल सकती है, और डेटा प्रवाह से अलग घटक। जर्मन सॉफ्टवेयर इंजीनियर इस विषय के बारे में बहुत कुछ लिख रहा है, अधिकांश लेख जर्मन में हैं। यहाँ उसका अंग्रेजी में एक प्रविष्टि लेख है: geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/…-
Doc Brown

मुझे लगता है कि एक सिंगलटन आंतरिक एपीआई मदद कर सकता है। यह सभी एप्लिकेशन के लिए सुलभ होगा और सभी डेटा पुनर्प्राप्त लॉजिक को एन्क्रिप्ट करेगा।
19

जवाबों:


1

आप CDI (प्रसंग निर्भरता इंजेक्शन) AKA IoC (नियंत्रण का व्युत्क्रम) का उल्लेख कर रहे हैं। जावा JSF और स्प्रिंग फ्रेमवर्क कुछ उदाहरण हैं। ASP.NET MVC में एकता जैसे प्लगइन्स हैं। जावास्क्रिप्ट की आवश्यकता है जैसे पुस्तकालयों का उपयोग करके संरचनाओं को व्यवस्थित करना शुरू हो गया है, जिसमें कई आधुनिक जेएस फ्रेमवर्क में इंजेक्शन व्यवहार देखा गया है। यह स्थानीय और दूरस्थ अनुप्रयोगों को वायर करने के लिए है।

नेटवर्क में ढीले युग्मन के लिए, कंपनियां SOAP, REST, AJAX या RPC के साथ नियमित दूरस्थ पद्धति से वेब सेवाओं का उपयोग करना पसंद करती हैं। जावा में आप वितरित सेवाओं के निर्माण के लिए JAX-WS या .NET WCF का उपयोग कर सकते हैं। फिर आप उन्हें क्लाइंट के रूप में किसी भी भाषा या प्लेटफ़ॉर्म से सर्विस बस या "डेटा फ़्लो" में ले जाते हैं। रूबी, पायथन, स्काला, जावा, सी #, ... कुछ भी।

ढीली युग्मन आपको समस्याओं को विभाजित करने और जीतने की अनुमति देता है, और सेवाएं अक्सर डेटा खींचने के लिए एक डेटाबेस में प्रवेश बिंदु होती हैं। सीढ़ी चढ़कर हमारे पास संदेश कतार नामक जानवर है। यह सड़क उद्यम और बुनियादी ढांचे के प्रकार के ढांचे की ओर ले जाती है।

यदि आपका प्रोजेक्ट किसी नेटवर्क पर जोर नहीं देता है, हालांकि, स्काला, अक्का, नोडजेएस आदि जैसी भाषाएं हैं .. जो एक एकल एप्लिकेशन के भीतर डेटा के उच्च प्रवाह के लिए डिज़ाइन की गई हैं। वे जटिल परियोजनाओं के लिए पहले से वर्णित कुछ तकनीकों के साथ भी काम करते हैं। उदाहरण के लिए, स्काला का उपयोग JAX-RS REST सेवाओं के साथ डेटा स्रोत से "वैश्विक डेटा" को खींचने के लिए किया जा सकता है, और IoC आंतरिक वायरिंग के लिए स्प्रिंग है। JBoss, .NET, और GUI टूल जैसे MuleESB में कई व्यावसायिक निष्पादन या वर्कफ़्लो फ्रेमवर्क भी हैं। विकास में, एक्लिप्स और नेटबीन्स आपको विजुअल फ्लो चार्ट स्क्रीन में सेवाओं को खींचने और छोड़ने की सुविधा देते हैं।

अंत में, जावा में अभी भी सिंगलटन बीन्स हैं। रन-टाइम पर अपने तरीकों को समायोजित करने के लिए, प्रॉक्सी या रिफ्लेक्शन फ्रेमवर्क का उपयोग करें। लेकिन ईमानदारी से, यह 1999 है।

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


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

संकेत के लिए धन्यवाद! यह निश्चित रूप से मुझे आश्चर्यचकित करता है कि एक भाषा कैसे दिख सकती है अगर यह जमीन से निर्भरता इंजेक्शन और इसी तरह के पैटर्न का समर्थन करने के लिए डिज़ाइन किया गया था।
व्लादिमीर स्लीपनेव

0

बड़े पैमाने पर ऐसा करने का सबसे सरल तरीका वास्तव में कुछ प्रकार के डेटा एनकैप्सुलेशन एपीआई का उपयोग करना है। यह एक NoSQL स्टोर हो सकता है या यह एक समझाया RDBMS हो सकता है (या यह वास्तव में एक ही आवेदन में अलग-अलग समय और स्थानों दोनों में हो सकता है - कोई कारण नहीं है कि आपके पास एक RDBMS लंबी अवधि से निपटने के लिए नहीं हो सकता है भंडारण और एक NoSQL db अल्पकालिक राज्य नियंत्रण से निपटने)। यह एकल वस्तुओं की एक श्रृंखला भी हो सकती है।

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

बेशक किसी भी दृष्टिकोण में ट्रेडऑफ है और आप उन ट्रेडऑफ के आसपास नहीं पहुंच सकते। मुख्य बात यह है कि ट्रेडऑफ्स क्या हैं (प्रबंधन बनाम प्रदर्शन बनाम कोड की सफाई बनाम संभावित कोडिंग नुकसान)।


जवाब के लिए धन्यवाद! यह मुझे लगता है कि प्रोग्रामिंग भाषा अनुसंधान इस समस्या के साथ मदद कर सकता है। उदाहरण के लिए, यदि कोड किसी वैश्विक डेटाबेस से या स्टैक्ड सिंगलनेट से कुछ डेटा पढ़ता है, तो एक स्थैतिक / घोषणात्मक गारंटी हो सकती है कि उसे किस डेटा की आवश्यकता है।
व्लादिमीर स्लीपनेव

-1

यदि आप शब्दों का उपयोग (या उद्धरण) करते हैं

hairy flow of control

तब मुझे लगता है कि आपका कोड वास्तव में गड़बड़ है। आपको इसे तुरंत छोड़ देना चाहिए। यदि आप सरोकार के सरलीकरण / अलगाव का उपयोग करते हैं, तो "नियंत्रण के बालों के प्रवाह" जैसी कोई चीज नहीं है। आपके कोड में सरलता का अभाव है जो इस तथ्य से भी कमतर है कि आपने वैश्विक चर :-) के लिए संदर्भित किया है।


क्यों होता है पतन? यह उद्धरण उस परिचय को याद कर रहा था जो वास्तव में मेरे विचार का समर्थन करता है: "(यह शायद" एंटीपैटर्न "या" कोड स्मेल "के रूप में वर्गीकृत किया गया है और जैसे कि उपयुक्त मंडलियों में नाम है, लेकिन मुझे नहीं पता होगा, इसलिए मुझे पता चलेगा" इसे छोड़ दें) "
user127749

2
यह वास्तव में इस सवाल का जवाब नहीं है, शायद यही कारण है कि
डाउनवोट

तो फिर मुझे सवाल अलग तरीके से व्यक्त करते हैं: (यह आसान बेवकूफ रखने के लिए,) KISS: वहाँ कोड की गंदगी है कि सॉफ्टवेयर डिजाइन का सबसे बुनियादी सिद्धांतों का उल्लंघन करता पूर्ववत करने के लिए कोई जादू चाल है? चाल जादू नहीं है, यह या तो एक प्रोग्रामर है जिसे प्रतिस्थापित नहीं किया जा सकता क्योंकि वह सभी स्पष्ट विवरण (जो लंबे समय में कंपनी को मार डालेगा) को जानता है, या कोड बेस को पुनर्गठन करने के लिए। दुर्भाग्य से, कई कंपनियां शुरू में उचित कोड डिज़ाइन की परवाह नहीं करती हैं या परिणाम भी नहीं समझती हैं, फिर कम से कम एक बार अपने कोड को फिर से लिखना, कई तो इसे कई बार फिर से लिखना ...
user127749
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.