7

आप कैसे पहचान करने और निम्नलिखित कोड गंध को ठीक होगा:कोड गंध: विन्यास दुःस्वप्न

मुझे लगता है कि मुझे लगता है कि लिख रहा हूँ एक छोटे से वैज्ञानिक कंप्यूटिंग एप्लिकेशन मिल गया है एक ही में बदलाव के बहुत सारे को संभालने में सक्षम हो गया है विषय। इसकी आंतरिक कार्यप्रणाली अच्छी तरह से फैली हुई है, ज्यादातर टेम्पलेट विधि पैटर्न और कुछ उच्च-आदेश कार्यों का उपयोग कर रही है। हालांकि, यह निर्दिष्ट करना कि इन सभी वर्गों और कार्यों को तत्काल कैसे उपयोग किया जाना चाहिए और प्रोग्राम के किसी भी रन में कौन से पैरामीटर इतने जटिल हैं कि मुझे कभी-कभी लगता है कि ऐसा करने का सबसे आसान तरीका हर रन और पुन: संकलन के लिए मुख्य() को फिर से लिखना होगा यह।

क्या कॉन्फ़िगरेशन प्रबंधन करने का अपेक्षाकृत सरल, हल्का तरीका है जो एक छोटे वैज्ञानिक ऐप के लिए अधिक नहीं है? असल में मैं केवल कमांड लाइन स्विच का उपयोग कर रहा हूं और वे बहुत कमजोर हो रहे हैं।

संपादित करें: ऐप इतना छोटा है कि निर्माण के समय नगण्य हैं। मुझे मूल भाषा में कोड को संशोधित करने के लिए एक स्क्रिप्टिंग भाषा के लिए बाध्यकारी में थोड़ा सा लाभ दिखाई देता है। (ऐप डी प्रोग्रामिंग भाषा में लिखा गया है।)

संपादित करें # 2: मैंने कॉन्फ़िगरेशन फ़ाइल विचार के बारे में सोचा और इससे मदद मिलेगी, लेकिन मुझे लगता है कि कॉन्फ़िगरेशन फ़ाइल लिखना लगभग उतना कठिन होगा जितना मुख्य() हर बार।

+2

एक XML कॉन्फ़िगरेशन फ़ाइल के बारे में कैसे? या एक .INI फ़ाइल –

+2

मुझे कुछ याद आ रही है, लेकिन क्या आप बस उन पैरामीटर को कॉन्फ़िगरेशन फ़ाइल में सेट नहीं कर सकते हैं? आप अलग-अलग परिदृश्यों के लिए अलग-अलग फाइलें बना सकते हैं, और फिर आवश्यकतानुसार बदल सकते हैं। – Jay

+0

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

उत्तर

7

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

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

+0

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

+0

ईमानदारी से, मैं सवाल से नहीं बता सकता। यदि पुनर्मूल्यांकन मुद्दा है, तो आप सही हैं। यदि समस्या रखरखाव से संबंधित है, तो एक फ्लुएंट इंटरफेस मदद कर सकता है ... –

0

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

3

एक स्क्रिप्टिंग भाषा को एम्बेड करना और अपने ऐप को चलाने के लिए इसका उपयोग करना सबसे अच्छा काम है। स्क्रिप्टिंग भाषाएं महान 'कॉन्फ़िगरेशन' फ़ाइलें बनाती हैं। मैं लुआ (व्यापक रूप से गेम में उपयोग किया जाता है) और टीसीएल (व्यापक रूप से इलेक्ट्रॉनिक्स सीएडी में उपयोग किया जाता है) में देखने का सुझाव देता हूं। दोनों आसानी से एम्बेड करने योग्य और छोटे और सीखने में आसान हैं।

0

यदि आप सेटिंग्स के प्रत्येक सेट के लिए नाम दे सकते हैं, तो आप केवल अपने मुख्य() नामों को पास कर सकते हैं।

भले ही आपके पास सेट कर सकने वाले सैकड़ों पैरामीटर हों, वास्तव में आप अंत में कितने संयोजन का उपयोग करते हैं? यदि आप मानते हैं कि 4 संयोजन उन्हें प्रत्येक नाम देते हैं और आप उन्हें अलग-अलग सेट के रूप में भी कोडित कर सकते हैं।

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

0

आप पाइथन जैसे कुछ स्क्रिप्टिंग भाषा देख सकते हैं और इसे मुख्य() से कॉल कर सकते हैं।

एक और विकल्प आपके ऐप के लिए अपना स्वयं का डीएसएल (डोमेन विशिष्ट भाषा) बनाना होगा। आप इसके लिए ANTLR का उपयोग कर सकते हैं।

1

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

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

संबंधित मुद्दे