हार्डकोडिंग स्ट्रिंग्स जो कभी नहीं बदलेगी


39

इसलिए, फ्रांसीसी के लिए क्रियाओं को संयुग्म करने के लिए एक कार्यक्रम लिखने के लिए मेरे प्रयासों में (एल्गोरिदमिक रूप से, एक डाटासेट के माध्यम से नहीं), मैं एक मामूली समस्या के साथ आया हूं।

क्रियाओं को संयुग्मित करने के लिए एल्गोरिथ्म वास्तव में क्रियाओं के 17 या तो मामलों के लिए काफी सरल है, और प्रत्येक मामले के लिए एक विशेष पैटर्न पर चलता है; इस प्रकार, इन 17 वर्गों के लिए संयुग्मन प्रत्यय स्थिर हैं और जल्द ही किसी भी समय परिवर्तन नहीं करेंगे। उदाहरण के लिए:

// Verbs #1 : (model: "chanter")
    terminations = {
        ind_imp: ["ais", "ais", "ait", "ions", "iez", "aient"],
        ind_pre: ["e", "es", "e", "ons", "ez", "ent"],
        ind_fut: ["erai", "eras", "era", "erons", "erez", "eront"],
        participle: ["é", "ant"]
    };

ये फ्रेंच में क्रिया के सबसे सामान्य वर्ग के लिए विभक्तिपूर्ण प्रत्यय हैं।

क्रिया (अनियमित) के अन्य वर्ग हैं, जिनके संयुग्मन भी अगली शताब्दी या दो के लिए स्थिर बने रहेंगे। चूंकि वे अनियमित हैं, उनके पूर्ण संयुग्मों को सांख्यिकीय रूप से शामिल किया जाना चाहिए, क्योंकि वे मज़बूती से एक पैटर्न से संयुग्मित नहीं हो सकते हैं (केवल मेरी गणना द्वारा [32 अनियमितताएं भी हैं)। उदाहरण के लिए:

// "être":
    forms = {
        ind_imp: ["étais", "étais", "était", "étions", "étiez", "étaient"],
        ind_pre: ["suis", "es", "est", "sommes", "êtes", "sont"],
        ind_fut: ["serai", "seras", "sera", "serons", "serez", "seront"],
        participle: ["été", "étant"]
    };

मैं यह सब XML या JSON में भी डाल सकता था और इसका उपयोग करने की आवश्यकता होने पर इसे निष्क्रिय कर सकता था, लेकिन क्या कोई बिंदु है? ये तार प्राकृतिक भाषा का हिस्सा हैं, जो बदलता है, लेकिन धीमी गति से।

मेरी चिंता यह है कि चीजों को "सही" तरीके से करने और कुछ डेटा स्रोत के deserializing के बाद, मैंने न केवल उस समस्या को जटिल कर दिया है, जिसे जटिल होने की आवश्यकता नहीं है, लेकिन मैंने पूरे लक्ष्य पर पूरी तरह से वापस नज़र रखी है एल्गोरिदम दृष्टिकोण: डेटा स्रोत का उपयोग नहीं करने के लिए! C # में, मैं इन स्ट्रिंग्स को एक एनेमरेटेड प्रकार या किसी चीज़ में रखने के बजाय, XML में स्टफ करने और बनाने के लिए एक वर्ग namespace Verb.Conjugation(उदाहरण के लिए class Irregular) बना सकता हूँ class IrregularVerbDeserializer

सवाल तो: यह कड़ी मेहनत से कोड तार कर रहे हैं के लिए उपयुक्त है बहुत एक आवेदन के जीवनकाल के दौरान परिवर्तन की संभावना नहीं? बेशक मैं नहीं कर सकता की गारंटी 100% है कि वे परिवर्तन नहीं होगा, लेकिन जोखिम बनाम लागत लगभग मेरी आँखों में वज़न तुच्छ है - hardcoding यहां बेहतर विचार है।

संपादित करें : प्रस्तावित डुप्लिकेट पूछता है कि बड़ी संख्या में स्थिर स्ट्रिंग्स को कैसे संग्रहीत किया जाए , जबकि मेरा सवाल यह है कि मुझे इन स्थिर स्ट्रिंग्स को हार्ड-कोड करना चाहिए


26
क्या आप भविष्य में फ्रांसीसी के अलावा किसी अन्य भाषा के लिए इस सॉफ़्टवेयर का उपयोग करना चाहते हैं?

10
एल्गोरिथ्म दृष्टिकोण या नहीं, यह स्पष्ट है कि आपको बस इन 32 * 20 स्ट्रिंग्स को हार्डकोड करना होगा (और अधिक जब आप अधिक भाषाएँ जोड़ते हैं), और एकमात्र वास्तविक सवाल यह है कि उन्हें कहां रखा जाए। मुझे लगता है कि आप के लिए सबसे सुविधाजनक लगता है, जहां यह समय के लिए कोड में होगा लगता है। आप हमेशा उन्हें बाद में फेरबदल कर सकते हैं।
इक्ष्रेक

1
@ChrisCirefice जो मुझे बहुत इष्टतम लगता है। इसका लाभ उठाएं।
Ixrec

2
@Gusdor I डॉन 'आपको लगता है कि आप स्पष्ट रूप से पढ़ते हैं - मैंने कहा कि संयुग्मन पैटर्न की संभावना कभी नहीं बदलेगी, या इतनी बार-बार बदलेगी कि हर 100 साल में एक recompile या ठीक हो जाएगा। बेशक कोड बदल जाएगा, लेकिन जब एक बार स्ट्रिंग्स वहां होंगे तो मैं उन्हें कैसे चाहता हूं, जब तक कि मैं रिफैक्ट नहीं कर रहा हूं वे अगले 100 वर्षों तक स्थिर रहेंगे।
क्रिस साइरफाइस

1
+1। यह उल्लेख नहीं करने के लिए कि 60-100 वर्षों में लागत या तो मौजूद नहीं होगी, या पूरी तरह से एक बेहतर संस्करण द्वारा प्रतिस्थापित किया जाएगा।
हैरीबर्न

जवाबों:


56

क्या यह हार्ड-कोड स्ट्रिंग्स के लिए उपयुक्त है जो किसी एप्लिकेशन के जीवनकाल के दौरान बदलने की संभावना नहीं है? बेशक मैं 100% गारंटी नहीं दे सकता कि वे बदलेंगे नहीं, लेकिन जोखिम बनाम लागत मेरी आँखों में तौलने के लिए लगभग तुच्छ है - हार्डकोडिंग यहाँ बेहतर विचार है

यह मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया।

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

जब तक मैं इसे और अधिक जटिल बनाने के लिए एक सम्मोहक कारण नहीं मिला, मैं इसे लागू करने के लिए सबसे आसान दृष्टिकोण के साथ जाऊंगा।


धन्यवाद Dan, कि मैं क्या सोचा की तरह है। इसके लिए एक XML स्कीमा लिखना, एक अन्य फाइल का ट्रैक रखना, और डेटा को डिस्क्राइबलाइज़ करने के लिए एक इंटरफ़ेस लिखना होता है, ऐसा लगता है कि ओवरकिल को ऐसा लगता है कि बस इतने सारे तार नहीं हैं, और क्योंकि यह प्राकृतिक भाषा है, इसलिए यह तेजी से बदलने की संभावना नहीं है। अगले 100 वर्षों में। सौभाग्य से, आजकल प्रोग्रामिंग भाषाओं में हमारे पास एक अच्छे दिखने वाले इंटरफ़ेस के पीछे इस कच्चे डेटा को सार करने के लिए फैंसी तरीके हैं, उदाहरण के लिए French.Verb.Irregular.Etreजिसमें मेरे प्रश्न का डेटा होगा। मुझे लगता है कि यह ठीक से काम करता है;)
क्रिस साइरफाइस

3
+1 यहाँ रूबी शिविर से, मैं हार्डकोडिंग सामान को बाहर करना शुरू करूँगा और इसे आवश्यक रूप से कॉन्फ़िगर करने के लिए आगे बढ़ूँगा। चीजों को कॉन्फ़िगर करने योग्य बनाकर अपनी परियोजना को समय से पहले खत्म न करें। यह सिर्फ आपको धीमा करता है।
ओवरब्रीड

2
नोट: कुछ समूहों में "हार्डकोडिंग" की एक अलग परिभाषा है, इसलिए ध्यान रखें कि इस शब्द का अर्थ है कई चीजें। एक अच्छी तरह से मान्यता प्राप्त विरोधी पैटर्न है जहां आप डेटा संरचनाओं को बनाने के बजाय एक फ़ंक्शन के बयानों में कठिन कोड मान रखते हैं (जैसा कि आपके पास है if (num == 0xFFD8))। if (num == JPEG_MAGIC_NUMBER)पठनीयता कारणों के लिए लगभग सभी मामलों में उदाहरण कुछ ऐसा बनना चाहिए । मैं इसे केवल इसलिए इंगित करता हूं क्योंकि शब्द "हार्डकोडिंग" अक्सर शब्द के इस वैकल्पिक अर्थ के कारण लोगों की गर्दन (जैसे मेरी) पर बाल बढ़ाता है।
Cort Ammon

@CortAmmon JPEG में बहुत सारे मैजिक नंबर हैं। निश्चित रूप से JPEG_START_OF_IMAGE_MARKER?
user253751

@immibis निरंतर नामकरण की आपकी पसंद शायद मेरी तुलना में बेहतर है।
Cort Ammon

25

आप गलत दायरे में तर्क कर रहे हैं।

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

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

  • क्या आप निकट भविष्य में, 100% के करीब निश्चितता के साथ ऐप को अन्य भाषाओं में विस्तारित करेंगे? यदि ऐसा है, तो आपको अपने ऐप के प्रमुख भाग को फिर से लिखने के लिए मजबूर करने के बजाय JSON या XML फ़ाइलों (शब्दों के लिए, शब्दों के हिस्सों, आदि) और गतिशील भाषाओं के लिए निर्यात करना चाहिए था ।

  • या केवल एक छोटी सी संभावना है कि भविष्य में ऐप को कहीं और बढ़ाया जाएगा, जिस स्थिति में YAGNI यह संकेत देता है कि सबसे सरल दृष्टिकोण (अभी आप जो उपयोग कर रहे हैं) बेहतर है?

एक दृष्टांत के रूप में, माइक्रोसॉफ्ट वर्ड के वर्तनी परीक्षक को लें। आपको लगता है कि कितनी चीजें हार्डकोड हैं?

यदि आप एक टेक्स्ट प्रोसेसर विकसित कर रहे हैं, तो आप हार्डकोडेड नियमों और यहां तक ​​कि हार्डकोड शब्दों के साथ एक साधारण वर्तनी इंजन द्वारा शुरू कर सकते हैं if word == "musik": suggestSpelling("music");:। तेजी से, आप शब्दों को आगे बढ़ाना शुरू करेंगे, फिर अपने कोड के बाहर खुद पर शासन करेंगे। अन्यथा:

  • हर बार जब आपको कोई शब्द जोड़ना होता है, तो आपको फिर से लिखना होगा।
  • यदि आपने एक नया नियम सीखा है, तो आपको एक बार फिर से स्रोत कोड बदलना होगा।
  • और अधिक महत्वपूर्ण बात, कोई ऐसा तरीका नहीं है जिससे आप जबरदस्त मात्रा में कोड लिखे बिना इंजन को जर्मन या जापानी में ढाल सकते हैं।

जैसा कि आपने खुद पर प्रकाश डाला:

फ्रेंच से बहुत कम नियम जापानी पर लागू हो सकते हैं।

जैसे ही आप किसी भाषा के नियमों को हार्डकोड करते हैं, हर दूसरे को अधिक से अधिक कोड की आवश्यकता होगी, विशेष रूप से प्राकृतिक भाषाओं की जटिलता को देखते हुए।

एक अन्य विषय यह है कि आप उन विभिन्न नियमों को कैसे व्यक्त करते हैं, यदि कोड के माध्यम से नहीं। अंततः, आप पा सकते हैं कि एक प्रोग्रामिंग भाषा उसके लिए सबसे अच्छा उपकरण है। उस स्थिति में, यदि आपको इंजन को फिर से स्थापित किए बिना विस्तारित करने की आवश्यकता है, तो गतिशील भाषाएं एक अच्छा विकल्प हो सकती हैं।


1
ठीक है, सब कुछ वहाँ कठिन नहीं है, कोडित: P तो मुझे लगता है कि यह वास्तव में यह निर्धारित करने के लिए नीचे आता है कि मैं क्या चाहता हूं कि इंटरफ़ेस कैसा दिखे ताकि मैं इसे कई भाषाओं में लागू कर सकूं। समस्या यह है कि मैं अभी तक सभी भाषाओं को अच्छी तरह से नहीं जानता, इसलिए यह प्रभावी रूप से असंभव है। मुझे लगता है कि एक बात जो शायद आपको याद आ रही है वह यह है कि संयुग्मन पैटर्न (यह सब मैं बात कर रहा हूं) एक भाषा में बहुत स्थिर हैं, और यह वास्तव में कुछ ऐसा है जो मामला-दर-मामला है। क्रिया के लिए फ्रेंच में लगभग 17 संयुग्मन पैटर्न हैं। यह जल्द ही किसी भी समय का विस्तार करने वाला नहीं है ...
क्रिस क्रेफ़िस

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

2
नोट: यदि आप अधिक भाषाओं को जोड़ना चाहते हैं, जो भाषाओं को एक कॉन्फिगर फ़ाइल में नहीं ले जा रहा है! आपके पास समान रूप से अच्छी तरह LanguageProcessorसे कई उपवर्गों के साथ एक वर्ग हो सकता है । (प्रभावी रूप से, "कॉन्फ़िग फ़ाइल" वास्तव में एक वर्ग है)
user253751

2
@ मेनमा: एक शब्द जोड़ते समय उसे फिर से जोड़ना एक समस्या क्यों माना जाता है? आपको किसी भी तरह से कोड में किसी भी अन्य परिवर्तन को करते समय फिर से जोड़ना होगा, और शब्दों की सूची शायद कोड का हिस्सा है जो समय के साथ कम से कम बदलने की संभावना है।
जैक्सबी

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

15

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

उदाहरण के लिए:

  • UI फ़ाइलों को संसाधन फ़ाइलों में निकालना। यह एक गैर-प्रोग्रामर को ग्रंथों को संपादित और प्रूफ-रीड करने की अनुमति देता है, और यह नई स्थानीयकृत संसाधन फ़ाइलों को जोड़कर नई भाषाओं को जोड़ने की अनुमति देता है।

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

  • एक वर्तनी परीक्षक जिसके खिलाफ जाँच करने के लिए शब्दों का शब्दकोश है। आप प्रोग्राम लॉजिक को संशोधित किए बिना नए शब्द और भाषाएं जोड़ सकते हैं।

लेकिन कॉन्फ़िगरेशन को निकालने के साथ एक जटिलता ओवरहेड भी है, और यह हमेशा समझ में नहीं आता है।

जब प्रोग्राम लॉजिक को बदले बिना वास्तविक स्ट्रिंग नहीं बदल सकता है, तो स्ट्रिंग्स को हार्डकोड किया जा सकता है।

उदाहरण:

  • एक प्रोग्रामिंग भाषा के लिए एक संकलक। कीवर्ड किसी कॉन्फ़िगरेशन में नहीं निकाले जाते हैं, क्योंकि प्रत्येक कीवर्ड में विशिष्ट शब्दार्थ होते हैं जिन्हें कंपाइलर में कोड द्वारा समर्थित किया जाना होता है। एक नया कीवर्ड जोड़ने पर हमेशा कोड परिवर्तन की आवश्यकता होगी, इसलिए स्ट्रिंग्स को कॉन्फ़िगरेशन फ़ाइल में निकालने का कोई मूल्य नहीं है।
  • एक प्रोटोकॉल को लागू करना: ईजी। एक HTTP क्लाइंट के पास "GET", "सामग्री-प्रकार" आदि जैसे हार्डकोडिंग स्ट्रिंग्स होंगे। यहां स्ट्रिंग्स प्रोटोकॉल के विनिर्देश का हिस्सा हैं, इसलिए वे कोड के कुछ हिस्सों को बदलने की संभावना रखते हैं।

आपके मामले में मुझे लगता है कि यह स्पष्ट है कि शब्द कार्यक्रम तर्क का एक एकीकृत हिस्सा हैं (क्योंकि आप विशिष्ट शब्दों के लिए विशिष्ट नियमों के साथ एक संयुग्मक का निर्माण कर रहे हैं), और इन शब्दों को बाहरी फ़ाइल में निकालने का कोई मूल्य नहीं है।

यदि आप एक नई भाषा जोड़ते हैं, तो आपको वैसे भी नया कोड जोड़ना होगा, क्योंकि प्रत्येक भाषा में विशिष्ट संयुग्मन तर्क होता है।


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


1
दरअसल, मेनमा की एक टिप्पणी में, मैंने उल्लेख किया कि इसके लिए एक डीएसएल लिखना व्यर्थ होगा क्योंकि बहुत कम प्राकृतिक भाषाएं समान हैं जो इसे प्रयास के लायक बनाती हैं। हो सकता है कि फ्रेंच / स्पैनिश / इतालवी पर्याप्त रूप से बंद हो , लेकिन वास्तव में अतिरिक्त प्रयास के लायक नहीं है , यह देखते हुए कि किसी भी भाषा में नियमों की मात्रा अत्यधिक स्थिर है। जटिलता के बारे में आपके द्वारा बताए गए अन्य बिंदु मेरी सटीक चिंताएं थीं, और मुझे लगता है कि आप आश्चर्यजनक रूप से समझ गए थे कि मैं अपने प्रश्न में क्या पूछ रहा था और उदाहरणों के साथ एक शानदार उत्तर दिया, इसलिए +1!
क्रिस साइरफाइस

5

मैं डेन पिचेलमैन के जवाब से 100% सहमत हूं, लेकिन मैं एक बात जोड़ना चाहूंगा। प्रश्न आपको यहाँ अपने आप से पूछना चाहिए "शब्द सूची को बनाए रखने / बढ़ाने / सुधारने के लिए कौन है?"। यदि यह हमेशा वह व्यक्ति होता है जो किसी विशिष्ट भाषा (विशेष डेवलपर, मुझे लगता है) के नियमों को बनाए रखता है, तो बाहरी कॉन्फ़िगरेशन फ़ाइल का उपयोग करने का कोई मतलब नहीं है यदि यह चीजों को अधिक जटिल बनाता है - तो आपको इससे कोई लाभ नहीं मिलेगा यह। इस दृष्टिकोण से, यह मेकअप मतलब होगा इस तरह के शब्द सूची हार्डकोड करने आप भले ही है उन्हें समय-समय पर बदलने के लिए, जब तक कि यह एक नया संस्करण के हिस्से के रूप एक नई सूची देने के लिए पर्याप्त है।

(दूसरी ओर, यदि कोई मामूली मौका है तो भविष्य में किसी और को सूची को बनाए रखने में सक्षम होना चाहिए, या यदि आपको अपने आवेदन के नए संस्करण को तैनात किए बिना शब्द सूची को बदलने की आवश्यकता है, तो एक अलग फ़ाइल का उपयोग करें।)


यह एक अच्छा बिंदु है - हालांकि, मुझे बहुत संभावना है कि मैं वास्तव में कोड को बनाए रखने वाला एकमात्र व्यक्ति होगा, कम से कम अगले कुछ वर्षों के लिए। इसके बारे में अच्छी बात यह है कि भले ही तार कठोर-कोडित होंगे, यह बहुत ही छोटे तार / नियम हैं जिन्हें जल्द ही बदलने की संभावना नहीं है (जैसा कि यह प्राकृतिक भाषा है, जो बहुत अधिक वर्ष तक विकसित नहीं होता है -साल)। उस ने कहा, संयुग्मन नियम, क्रिया समाप्ति तार, आदि सभी तरह से हमारे जीवनकाल के लिए समान होंगे :)
क्रिस Cirefice

1
@ क्रिसचाइरफाइस ": बिल्कुल मेरी बात।
डॉक्टर ब्राउन

2

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

यह सूची के रखरखाव के साथ आपको बहुत अधिक बाधा से बचाएगा। अपने वीसीएस में आप आसानी से पहचान सकते हैं कि क्या कमिटमेंट ने एल्गोरिथ्म को बदल दिया है, या बस एक संयुग्मन बग को ठीक कर दिया है। साथ ही, जिन मामलों पर आपने विचार नहीं किया, उनके लिए भविष्य में सूची संलग्न करनी पड़ सकती है। विशेष रूप से, आपके द्वारा गिने गए 32 अनियमित क्रियाओं की संख्या सटीक प्रतीत नहीं होती है। जबकि वे आमतौर पर इस्तेमाल किए जाने वाले लोगों को कवर करते हैं, मुझे 133 या उनमें से 350 के संदर्भ मिले ।


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

0

महत्वपूर्ण हिस्सा चिंता का अलगाव है। आप कैसे प्राप्त करते हैं वह कम प्रासंगिक है। यानी जावा ठीक है।

स्वतंत्र रूप से नियम कैसे व्यक्त किए जाते हैं, क्या आपको एक नियम बदलने की भाषा जोड़ने की आवश्यकता है: आपको कितने कोड और फाइलें संपादित करनी हैं?

आदर्श रूप से, एक नई भाषा को जोड़ना या तो एक 'english.xml' फ़ाइल को जोड़ना या एक नई 'EnglishRules को ILanguageRules' ऑब्जेक्ट को लागू करना संभव होना चाहिए। एक पाठ फ़ाइल (JSON / XML) आपको एक लाभ देता है यदि आप इसे अपने बिल्ड जीवनचक्र के बाहर बदलना चाहते हैं, लेकिन इसके लिए एक जटिल व्याकरण, पार्सिंग की आवश्यकता होती है, और डीबग करना कठिन होगा। एक कोड फ़ाइल (जावा) आपको जटिल नियमों को सरल तरीके से व्यक्त करती है, लेकिन एक पुनर्निर्माण की आवश्यकता होती है।

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

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