विन्यास वर्ग / संरचना: पैटर्न या विरोधी पैटर्न? वैकल्पिक?


10

यदि आप किसी प्रोग्राम में नए कॉन्फ़िगरेशन विकल्प जोड़ते हैं, तो अक्सर उन विकल्पों को प्राप्त करने के मामले में इसमें बहुत सारे रिपल इफेक्ट हो सकते हैं, जहां पर उन्हें कार्य करने की आवश्यकता होती है। इससे निपटने के तीन बुनियादी तरीके हैं जिनसे मैं अवगत हूं:

  1. अपने प्रोग्राम के उन हिस्सों में सभी कॉन्फ़िगरेशन सेटिंग्स को पास करें जिनकी उन्हें मूल रूप से स्पष्ट रूप से आवश्यकता है। यह सबसे स्पष्ट तरीका है और जिस तरह से चीजों को सबसे अधिक डिकम्पोज करता है। नकारात्मक पक्ष यह है कि यह दोनों क्रिया और भंगुर है।

  2. सबसे अधिक उपयोग की जाने वाली कॉन्फ़िगरेशन सेटिंग्स को वैश्विक / स्थिर बनाएं। यह सबसे सरल तरीका है, लेकिन दूरी पर कार्रवाई का परिचय देता है, परीक्षण में बाधा डालता है और मानता है कि कॉन्फ़िगरेशन वास्तव में वैश्विक है (आप किसी भी समय केवल एक कॉन्फ़िगरेशन चाहते हैं)।

  3. कॉन्फ़िगरेशन क्लास / संरचना बनाएं जिसमें पूरे प्रोग्राम के लिए या प्रोग्राम के भीतर प्रत्येक प्रमुख चिंता के लिए सभी कॉन्फ़िगरेशन विकल्प हों, और फिर इसे स्पष्ट रूप से पास करें। यह (1) की तुलना में कम (2) से अधिक स्पष्ट है। यदि आप केवल एक फ़ंक्शन कॉल के लिए सेटिंग बदलना चाहते हैं, तो आप कॉन्फ़िग ऑब्जेक्ट को क्लोन कर सकते हैं और इस एक मान को बदल सकते हैं। यह परीक्षण और व्यवहार दोनों में उपयोगी है। हालाँकि, आप अभी भी एक फ़ंक्शन के लिए संभावित रूप से गुजरने वाले टन को एक फ़ंक्शन पर समाप्त करते हैं, जिसकी आवश्यकता नहीं है और कॉन्फ़िगरेशन वर्ग / संरचना में एक मान को बदलने से अभी भी दूरी पर कार्रवाई हो सकती है।

क्या आप विचार करेंगे (3) एक पैटर्न या एक विरोधी पैटर्न? यदि यह एक विरोधी पैटर्न है, तो आप इसके बजाय क्या करते हैं?


कैसे 3 पर भिन्नता के बारे में - कई विन्यास कक्षाएं होने , जहां यह आवश्यक है वहां उपयुक्त पास करना?
Oded

@Oded: मेरा मतलब है कि एक संभावना के रूप में जोर देना। संपादित।
dsimcha

जवाबों:


4

सबसे अच्छा समाधान यह होगा कि आप कई कॉन्फ़िगरेशन इंटरफेस बनाएं और उन्हें अपनी इच्छानुसार कार्यान्वित करें। यह दोनों पहुंच को सीमित करता है और चीजों को स्थानीयकृत रखता है। हालाँकि, यह अभी तक बहुत अधिक प्रयास के लायक है कि यह एक ही वर्ग में सभी कॉन्फिग को चकित करता है और बहुत अधिक ग्रेविटास के साथ किसी समस्या पर आगे बढ़ता है। यह विन्यास है, UtterlyCrucialAlwaysChangingClass- यह बहुत ही रहने वाला है। जब तक आप इसे सभी वैश्विक नहीं बनाते हैं, और कार्यान्वयन सुसंगत है, मैं इसके बारे में चिंता नहीं करूंगा।


4
+1 यह कहने के लिए कि कुछ सैद्धांतिक रूप से आदर्श नहीं है, लेकिन व्यवहार में अच्छा हो सकता है जब सादगी और परिवर्तन की संभावना (या इसके अभाव) को माना जाता है।
dsimcha

मैंने सिर्फ चार तर्क दिए और उसे सेटिंग्स क्लास से बदल दिया। लगा कि सही बात है।
मार्टिन यूडिंग

मुझे समझ नहीं आ रहा है कि आप किन 3 विकल्पों की वकालत कर रहे हैं। क्या आप कृपया बता सकते हैं?
डीबीड्रेनको सेप

1

मैं आपके विकल्प 1 को पसंद करता हूं क्योंकि डिकॉउलिंग आसान परीक्षण को सक्षम करता है, और कॉन्फ़िगरेशन सेटिंग्स जिस वस्तु पर निर्भर करती है उसे स्पष्ट किया जाता है। यदि किसी ऑब्जेक्ट को कॉन्फ़िगरेशन सेटिंग की आवश्यकता होती है, तो उसे स्पष्ट रूप से किसी ऑब्जेक्ट तर्क या सेटर विधि द्वारा ऑब्जेक्ट को प्रदान करें। उन कॉन्फ़िगरेशन सेटिंग्स को ऑब्जेक्ट में इंजेक्ट करने के लिए निर्भरता इंजेक्शन फ्रेमवर्क का उपयोग करके क्रिया को कम करें।


आपने खुद को प्रतिवाद किया है: आप विकल्प 1 का उपयोग करने के लिए कहते हैं, लेकिन फिर कहते हैं "उन कॉन्फ़िगरेशन सेटिंग्स को ऑब्जेक्ट में इंजेक्ट करने के लिए एक निर्भरता इंजेक्शन फ्रेमवर्क का उपयोग करके क्रिया को कम करें।" जो विकल्प 3 है: कंस्ट्रक्टर इंजेक्शन।
डीबेड्रेनको

0

कल्पना करें कि आपका कॉन्फ़िगरेशन फ़ाइल XML में लिखा गया था। आप तब अपने प्रत्येक घटक के लिए इस XML के टुकड़े को पास कर सकते हैं, इसलिए उन्हें अपना कॉन्फ़िगरेशन डेटा मिलता है।

यदि आप .NET का उपयोग कर रहे हैं, तो आप DataContracts के साथ कक्षाएं बना सकते हैं, जो आप XmlSerialiser का उपयोग करके अपने कॉन्फ़िगरेशन Xml से कोई ऑब्जेक्ट हाइरैची बना सकते हैं, और इन ऑब्जेक्ट्स को कॉन्फ़िगरेशन के रूप में पास कर सकते हैं।

यह आपको अगली समस्या से परिचित कराता है। आपके कॉन्फ़िगरेशन डेटा के तीन अलग-अलग हिस्से हैं। संरचनात्मक एप्लिकेशन कॉन्फ़िगरेशन जो आपके कोड पुस्तकालयों को इस विशिष्ट उत्पाद के रूप में व्यवहार करने के लिए व्यवस्थित करता है। साइट कॉन्फ़िगरेशन सेटिंग्स जिसमें आपकी स्थापना विशिष्ट सेटिंग्स और उपयोगकर्ता वरीयता / सेटिंग्स डेटा होती है जो आपके सिस्टम पर प्रत्येक उपयोगकर्ता के साथ भिन्न होती है।

यह जानते हुए कि कौन सा हिस्सा है, और इन डेटा सेटिंग्स को अलग रखने से अपडेट स्थापित करना बहुत सरल हो जाएगा (ग्राहकों की सेटिंग खोए बिना)


0

मैं क्लास को ऑप्शन # 3 स्टेटिक में बनाऊंगा। इसलिए इसके बजाय

//create SomeCl
Foo f = new Foo();
f.setConfigInst(cfg);
...
...
//Inside Foo
public void setConfig(MyAppConfig c) { localCfg = c; }
...
//somewhere else:
x = localCfg.getConfigForX();

आप बस कर सकते हैं:

//Inside Foo
x = MyAppConfig.getConfigForX();

कॉन्फ़िगरेशन डेटा लोड करने / सहेजने का विवरण MyAppConfigकक्षा के अंदर होने दें । और निश्चित रूप से आपके पास अधिक जटिल विविधताएं हो सकती हैं, जैसे कि विभिन्न उद्देश्यों के लिए अलग-अलग कक्षाएं।

एकमात्र मामला जहां यह दृष्टिकोण एक समस्या होगी यदि आप किसी कारण से एक ही समय में विभिन्न कॉन्फ़िगरेशन के कई उदाहरणों पर काम करने के लिए आवश्यक होते हैं , हालांकि मुझे अभी ऐसी स्थिति में आना बाकी है।


1
जो कि कुछ परीक्षण ढाँचों में इकाई परीक्षण चलाते समय बहुत कुछ होता है ... लेकिन स्पष्ट रूप से समानांतर इकाई परीक्षणों के बिना भी, यह इकाई परीक्षण वस्तुओं के लिए गधे में एक दर्द होने वाला है जो वैश्विक स्थिति पर निर्भर करता है।
पेर्ट टॉर्क

0

मैं एक ऐसी परियोजना पर काम कर रहा हूँ जहाँ हम "3 लेयर्स (इंटरफ़ेस, व्यावसायिक तर्क, डेटा एक्सेस)" दृष्टिकोण का उपयोग कर रहे हैं। एप्लिकेशन एक बहुउपयोगकर्ता वेब सर्वर या क्लाइंट सर्वर हो सकता है।

हम 3 अलग-अलग कॉन्फ़िगरेशन के साथ काम करते हैं, पीसी के लिए पहला विशिष्ट, उपयोगकर्ता काम कर रहा है। वर्तमान उपयोगकर्ता के लिए दूसरा विशिष्ट, और सभी उपयोगकर्ताओं और क्लाइंट ऐप्स के लिए एक तीसरा वैश्विक कॉन्फ़िगरेशन।

प्रत्येक कॉन्फ़िगरेशन को ऑब्जेक्ट द्वारा एप्लिकेशन के प्रत्येक इंस्टेंस में दर्शाया जाता है।

यह दृष्टिकोण आपकी परियोजना में मदद कर सकता है।

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