मैजिक स्ट्रिंग्स में क्या गलत है?


164

एक अनुभवी सॉफ्टवेयर डेवलपर के रूप में, मैंने जादू के तार से बचने के लिए सीखा है।

मेरी समस्या यह है कि यह इतना लंबा समय है जब से मैंने उनका उपयोग किया है, मैं ज्यादातर कारणों को भूल गया हूं। परिणामस्वरूप, मुझे यह समझाने में परेशानी हो रही है कि वे मेरे कम अनुभवी सहयोगियों के लिए समस्या क्यों हैं।

इनसे बचने के क्या उद्देश्य हैं? वे किन समस्याओं का कारण बनते हैं?


38
क्या एक जादुई स्ट्रिंग है? जादू की संख्या के रूप में एक ही बात ?
Laiv

14
@ लिव: वे मैजिक नंबरों के समान हैं, हां। मुझे deviq.com/magic-strings पर परिभाषा पसंद है : "मैजिक स्ट्रिंग्स स्ट्रिंग मान हैं जो सीधे एप्लिकेशन कोड के भीतर निर्दिष्ट होते हैं जो एप्लिकेशन के व्यवहार पर प्रभाव डालते हैं।" ( En.wikipedia.org/wiki/Magic_string पर परिभाषा यह नहीं है कि मेरे मन में क्या है)
Kramii

17
यह हास्यास्पद है कि मैंने घृणा करना सीख लिया है ... बाद में अपने जूनियर्स को मनाने के लिए मैं किन तर्कों का उपयोग कर सकता हूं ... कभी खत्म न होने वाली कहानी :-)। मैं "समझाने" की कोशिश नहीं करूँगा, बल्कि मैं अपने दम पर सीखना चाहूँगा। एक पाठ / विचार से अधिक कुछ भी आपके अपने अनुभव तक नहीं पहुँचा। आप जो करने की कोशिश कर रहे हैं, वह निर्विवाद है । जब तक आप लेमिंग्स की टीम नहीं चाहते तब तक ऐसा न करें।
Laiv

15
@ लिव: मैं लोगों को अपने अनुभव से सीखने देना चाहूंगा, लेकिन दुर्भाग्य से यह मेरे लिए कोई विकल्प नहीं है। मैं एक सार्वजनिक रूप से वित्त पोषित अस्पताल के लिए काम करता हूं जहां सूक्ष्म कीड़े रोगी की देखभाल से समझौता कर सकते हैं, और जहां हम परिहार्य रखरखाव लागतों को वहन नहीं कर सकते हैं।
क्रामि

6
@DavidArno, यह वही है जो वह यह सवाल पूछकर कर रहा है।
user56834

जवाबों:


212
  1. संकलन करने वाली भाषा में, संकलन के समय में एक जादुई स्ट्रिंग के मूल्य की जांच नहीं की जाती है । यदि स्ट्रिंग को एक विशेष पैटर्न से मेल खाना चाहिए, तो आपको उस पैटर्न को फिट करने की गारंटी देने के लिए कार्यक्रम चलाना होगा। यदि आपने किसी एनम का उपयोग किया है, तो संकलन-समय पर मान कम से कम मान्य है, भले ही वह गलत मान हो।

  2. यदि एक जादू की स्ट्रिंग कई स्थानों पर लिखी जा रही है, तो आपको उन सभी को बिना किसी सुरक्षा के बदलना होगा (जैसे संकलन-समय त्रुटि)। यह केवल एक ही स्थान पर घोषित करने और चर का पुन: उपयोग करके, हालांकि, इसका मुकाबला किया जा सकता है।

  3. टाइपोस गंभीर कीड़े बन सकते हैं। यदि आप एक समारोह है:

    func(string foo) {
        if (foo == "bar") {
            // do something
        }
    }
    

    और कोई गलती से

    func("barr");
    

    यह रेयर या अधिक जटिल स्ट्रिंग अधिक खराब है, खासकर यदि आपके पास प्रोग्रामर हैं जो प्रोजेक्ट की मूल भाषा से अपरिचित हैं।

  4. जादू के तार शायद ही कभी स्व-दस्तावेजीकरण होते हैं। यदि आप एक स्ट्रिंग देखते हैं, तो यह बताता है कि स्ट्रिंग क्या हो सकती है / होनी चाहिए। आपको शायद यह सुनिश्चित करने के लिए कार्यान्वयन में देखना होगा कि आपने सही स्ट्रिंग को चुना है।

    इस तरह का कार्यान्वयन टपका हुआ है , जिसे समझने के लिए बाहरी दस्तावेज या कोड तक पहुंच की आवश्यकता है, जो लिखा जाना चाहिए, खासकर जब से इसे चरित्र-पूर्ण (बिंदु 3 में) होना चाहिए।

  5. IDEs में "फाइंड स्ट्रिंग" फ़ंक्शंस में से कुछ, बहुत कम उपकरण हैं जो पैटर्न का समर्थन करते हैं।

  6. आप संयोग से दो स्थानों पर एक ही जादुई स्ट्रिंग का उपयोग कर सकते हैं, जब वास्तव में वे अलग-अलग चीजें होती हैं, इसलिए यदि आपने एक खोज और प्रतिस्थापन किया, और दोनों को बदल दिया, तो उनमें से एक टूट सकता है जबकि दूसरा काम करता है।


34
पहले तर्क के बारे में: टाइपस्क्रिप्ट एक संकलित भाषा है जो स्ट्रिंग शाब्दिकों को टाइप कर सकती है। यह भी तर्क को दो से चार अमान्य करता है। इसलिए, स्ट्रिंग्स स्वयं समस्या नहीं हैं, लेकिन एक प्रकार का उपयोग करके जो बहुत अधिक मूल्यों की अनुमति देता है। गणना के लिए जादू पूर्णांक का उपयोग करके एक ही तर्क लागू किया जा सकता है।
योगू

11
चूंकि मुझे टाइपस्क्रिप्ट के साथ कोई अनुभव नहीं है इसलिए मैं वहां आपके फैसले को टाल दूंगा। तब मैं क्या कहूंगा, क्या यह अनियंत्रित-स्ट्रिंग है (जैसा कि मैंने इस्तेमाल की गई सभी भाषाओं के लिए मामला है) समस्या है।
Erdrik Ironrose

23
यदि आप स्थिर स्ट्रिंग शाब्दिक प्रकार को बदल रहे हैं जो आप अपेक्षा कर रहे हैं तो @Yogu टाइपस्क्रिप्ट आपके लिए अपने सभी स्ट्रिंग्स का नाम नहीं बदलेगा। आपको उन सभी को खोजने में मदद करने के लिए संकलन समय त्रुटियाँ मिलेंगी, लेकिन यह केवल एक आंशिक सुधार है। 2. यह नहीं कहना कि यह बिल्कुल आश्चर्यजनक से कम है (क्योंकि यह वह है, और मुझे यह सुविधा पसंद है), लेकिन यह निश्चित रूप से नहीं होता है एकमुश्त दुश्मनी का फायदा खत्म करो। हमारी परियोजना में, जब एनम का उपयोग करना है और जब एक प्रकार की खुली शैली का सवाल नहीं है, जिसके बारे में हम निश्चित नहीं हैं; दोनों दृष्टिकोणों में झुंझलाहट और फायदे हैं।
केरेन

30
एक बड़ा एक मैंने संख्याओं के लिए तार नहीं देखा है, लेकिन तार के साथ हो सकता है, जब आपके पास एक ही मूल्य के साथ दो जादू मूल्य होते हैं। फिर उनमें से एक बदल जाता है। अब आप कोड को पुराने मान को नए मान में बदल रहे हैं, जो अपने आप में काम कर रहा है, लेकिन आप यह सुनिश्चित करने के लिए भी EXTRA काम कर रहे हैं कि आप गलत मान नहीं बदल रहे हैं। निरंतर चर के साथ, न केवल आपको मैन्युअल रूप से इसके माध्यम से नहीं जाना है, लेकिन आप चिंता न करें कि आपने गलत चीज़ को बदल दिया है।
corsiKa

35
@Yogu मैं आगे तर्क देना चाहूंगा कि यदि संकलन के समय एक स्ट्रिंग शाब्दिक मूल्य की जाँच की जा रही है, तो यह एक जादुई स्ट्रिंग है । उस बिंदु पर यह सिर्फ एक सामान्य कॉन्स्ट / ईनम मूल्य है जो कि एक मजाकिया तरीके से लिखा जाना होता है। उस परिप्रेक्ष्य को देखते हुए, मैं वास्तव में यह तर्क दूंगा कि आपकी टिप्पणी वास्तव में एर्ड्रिक के बिंदुओं का समर्थन करती है, बजाय उन्हें नकारने के।
ग्रैंडऑपनर

89

अन्य उत्तरों ने जो कुछ समझा है, उसका शिखर यह नहीं है कि "जादुई मूल्य" खराब हैं, लेकिन यह होना चाहिए:

  1. स्थिरांक के रूप में पहचाने जाने योग्य;
  2. उनके संपूर्ण उपयोग के क्षेत्र में केवल एक बार परिभाषित किया गया है (यदि वास्तु सम्भवतः);
  3. एक साथ परिभाषित अगर वे स्थिरांक का एक सेट बनाते हैं जो किसी भी तरह से संबंधित हैं;
  4. जिस अनुप्रयोग में उनका उपयोग किया जाता है, उसमें सामान्यता के उचित स्तर पर परिभाषित किया गया है; तथा
  5. इस तरह से अनुचित संदर्भों में उनके उपयोग को सीमित करने के लिए परिभाषित किया गया है (उदाहरण के लिए जाँच करने के लिए उत्तरदायी)।

आम तौर पर "जादू मूल्यों" से स्वीकार्य "स्थिरांक" को अलग किया जाता है, इनमें से एक या अधिक नियमों का उल्लंघन है।

अच्छी तरह से इस्तेमाल किया, स्थिरांक बस हमें हमारे कोड के कुछ स्वयंसिद्ध अभिव्यक्त करने की अनुमति देते हैं।

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

उच्च-स्तरीय भाषाओं में निम्न-स्तरीय भाषाओं में प्रतिमानों के लिए निर्माण होते हैं जिन्हें स्थिरांक नियोजित करना होता है। उच्च-स्तरीय भाषा में भी इसी पैटर्न का उपयोग किया जा सकता है, लेकिन ऐसा नहीं होना चाहिए।

लेकिन यह एक विशेषज्ञ निर्णय हो सकता है जो सभी परिस्थितियों की छाप पर आधारित हो और जो एक समाधान की तरह दिखना चाहिए, और वास्तव में वह निर्णय कैसे उचित होगा यह संदर्भ पर बहुत अधिक निर्भर करेगा। वास्तव में यह किसी भी सामान्य सिद्धांत के संदर्भ में उचित नहीं हो सकता है, सिवाय इसके कि "मैं पहले से ही इस तरह के काम को देखने के लिए पर्याप्त बूढ़ा हो गया हूं, जिसके साथ मैं परिचित हूं, बेहतर किया है"!

संपादित करें: एक संपादन स्वीकार किए जाने के बाद, दूसरे को अस्वीकार कर दिया, और अब अपना स्वयं का संपादन किया है, तो क्या अब मैं अपने नियमों की सूची की प्रारूपण और विराम चिह्न शैली पर एक बार और सभी हाहा के लिए निपटा सकता हूं!


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

6
उदाहरण के रूप में, यदि कोई आपके कोड में "X: = 898755167 * Z" देखता है, तो वे शायद यह नहीं जान पाएंगे कि इसका क्या अर्थ है, और यह जानने की संभावना भी कम है कि यह गलत है। लेकिन अगर वे "स्पीड_ऑफ_लाइट: स्थिर इंटेगर: = 299792456" देखते हैं, तो कोई इसे देखेगा और सही मूल्य का सुझाव देगा (और शायद एक बेहतर डेटा प्रकार भी)।
WGroleau

26
कुछ लोग इस बिंदु को पूरी तरह से याद करते हैं और COMMA = "," SEPARATOR = "," के बजाय लिखते हैं। पूर्व कुछ भी स्पष्ट नहीं करता है, जबकि उत्तरार्द्ध इच्छित उपयोग बताता है और आपको बाद में एक ही स्थान पर विभाजक को बदलने की अनुमति देता है।
मार्कस

1
@marcus, वास्तव में! निश्चित रूप से सरल शाब्दिक मूल्यों का उपयोग करने के लिए एक मामला है - उदाहरण के लिए, यदि कोई विधि दो से एक मूल्य को विभाजित करती है, तो यह स्पष्ट और सरल हो सकता है कि केवल लिखने के लिए value / 2, बजाय अन्य के value / VALUE_DIVISORरूप में परिभाषित किया 2गया है। यदि आप CSV को संभालने वाली विधि को सामान्य बनाने का इरादा रखते हैं, तो आप संभवतः विभाजक को एक पैरामीटर के रूप में पास करना चाहते हैं, और इसे एक स्थिरांक के रूप में परिभाषित नहीं किया जाएगा। लेकिन यह सब संदर्भ में निर्णय का सवाल है - @ WGroleau का उदाहरण SPEED_OF_LIGHTकुछ ऐसा है जिसे आप स्पष्ट रूप से नाम देना चाहते हैं, लेकिन हर शाब्दिक को इसकी आवश्यकता नहीं है।
स्टीव

4
शीर्ष उत्तर इस उत्तर से बेहतर है यदि यह सुनिश्चित करने की आवश्यकता है कि जादू के तार एक "बुरी चीज" हैं। यह उत्तर बेहतर है यदि आप जानते हैं और स्वीकार करते हैं कि वे एक "बुरी चीज" हैं और उन आवश्यकताओं को पूरा करने के लिए सबसे अच्छा तरीका खोजने की आवश्यकता है जो वे एक रखरखाव योग्य तरीके से सेवा करते हैं।
corsiKa

34
  • उन्हें ट्रैक करना मुश्किल है।
  • सभी को बदलने के लिए संभवतः कई परियोजनाओं में कई फ़ाइलों को बदलने की आवश्यकता हो सकती है (बनाए रखने के लिए कठिन)।
  • कभी-कभी यह बताना कठिन होता है कि उनका उद्देश्य क्या है।
  • कोई पुन: उपयोग नहीं।

4
"पुन: उपयोग" का क्या अर्थ है?
अलविदा

7
एक चर / निरंतर आदि बनाने के बजाय और इसे अपने सभी प्रोजेक्ट / कोड में पुन: उपयोग करें जो आप प्रत्येक में एक नया स्ट्रिंग बना रहे हैं जो एक अनावश्यक दोहराव का कारण बनता है।
जसन

तो बिंदु 2 और 4 समान हैं?
थॉमस

4
@ThomasMoors नहीं वह उस तरीके के बारे में बात कर रहे हैं जिस तरह से आपको हर बार एक नई स्ट्रिंग का निर्माण करना होगा जो आप पहले से मौजूद मैजिक स्ट्रिंग का उपयोग करना चाहते हैं , बिंदु 2 स्ट्रिंग को स्वयं बदलने के बारे में है
पियरे अरलाउड

25

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

Field nameField = myEntity.GetField("ProductName");

(जादू स्ट्रिंग "ProductName" पर ध्यान दें)

इससे कई समस्याएं हो सकती हैं:

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

तो इसके लिए मेरा समाधान निकाय प्रकार द्वारा आयोजित इन नामों के लिए स्थिरांक उत्पन्न करना था। तो अब मैं उपयोग कर सकता हूं:

Field nameField = myEntity.GetField(Model.Product.ProductName);

यह अभी भी एक स्ट्रिंग स्थिर है और ठीक उसी बाइनरी के लिए संकलित है, लेकिन इसके कई फायदे हैं:

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

मेरी सूची में अगला: दृढ़ता से टाइप की गई कक्षाओं के पीछे इन स्थिरांक को छिपाएं - फिर डेटाटाइप भी सुरक्षित है।


+1 आप बहुत सारे अच्छे अंक लाते हैं जो कोड संरचना तक सीमित नहीं हैं: आईडीई समर्थन और टूलींग, जो बड़ी परियोजनाओं में एक जीवनरक्षक हो सकता है
किमीडायरको

यदि आपकी इकाई प्रकार के कुछ हिस्से पर्याप्त स्थिर हैं जो वास्तव में इसके लिए एक निरंतर नाम को परिभाषित करना सार्थक है, तो मुझे लगता है कि इसके लिए एक उचित डेटा मॉडल को परिभाषित करना अधिक उपयुक्त होगा ताकि आप बस कर सकें nameField = myEntity.ProductName;
रेयान

@ लाइरेन - सादे स्थिरांक उत्पन्न करने और उन्हें उपयोग करने के लिए मौजूदा परियोजनाओं को अपग्रेड करना बहुत आसान था। यही कारण है कि कहा, मैं कर रहा हूँ स्थिर प्रकार पैदा करने पर काम कर रहा तो मैं ठीक कर सकते हैं कि
हंस Ke सेंट ing

9

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

कुछ विशेष मामलों में, जादू के तार से बचा जाना चाहिए:

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

लेकिन कुछ मामलों में, "जादू के तार" ठीक हैं। कहते हैं कि आपके पास एक साधारण पार्सर है:

switch (token.Text) {
  case "+":
    return a + b;
  case "-":
    return a - b;
  //etc.
}

यहां वास्तव में कोई जादू नहीं है, और उपरोक्त वर्णित समस्याओं में से कोई भी लागू नहीं होता है। IMHO को परिभाषित करने string Plus="+"आदि के लिए कोई लाभ नहीं होगा । इसे सरल रखें।


7
मुझे लगता है कि "मैजिक स्ट्रिंग" की आपकी परिभाषा अपर्याप्त है, इसे छिपाने / अस्पष्ट / बनाने-रहस्यमय होने की कुछ अवधारणा की आवश्यकता है। मैं "+" और "-" का उल्लेख उस प्रति-उदाहरण में "जादू" के रूप में नहीं करूंगा, जितना कि मैं उस जादू में शून्य से अधिक करूंगा if (dx != 0) { grad = dy/dx; }
रूपए

2
@ रुपे: मैं सहमत हूं, लेकिन ओपी परिभाषा का उपयोग करता है " स्ट्रिंग मान जो सीधे एप्लिकेशन कोड के भीतर निर्दिष्ट होते हैं, जो एप्लिकेशन के व्यवहार पर प्रभाव डालते हैं। " जिसे स्ट्रिंग को रहस्यमय बनाने की आवश्यकता नहीं है, इसलिए यह वह परिभाषा है जिसमें मैं उपयोग करता हूं। उत्तर।
जैक्सबी

7
आपके उदाहरण के संदर्भ में, मैंने स्विच स्टेटमेंट देखे हैं जो प्रतिस्थापित "+"और "-"साथ हैं TOKEN_PLUSऔर TOKEN_MINUS। हर बार जब मैंने इसे पढ़ा तो मुझे लगा जैसे इसे पढ़ना और डीबग करना कठिन था! निश्चित रूप से एक जगह है जहाँ मैं सहमत हूँ कि सरल तार का उपयोग करना बेहतर है।
Cort Ammon

2
मैं मानता हूँ कि ऐसे समय होते हैं जब जादू के तार उपयुक्त होते हैं: उनसे बचना एक नियम है, और अंगूठे के सभी नियमों में अपवाद हैं। उम्मीद है, जब हम इस बारे में स्पष्ट होंगे कि वे एक बुरी चीज क्यों हो सकते हैं, हम चीजों को करने के बजाय बुद्धिमान विकल्प बनाने में सक्षम होंगे क्योंकि (1) हमने कभी नहीं समझा कि कोई बेहतर तरीका हो सकता है, या (2) हम एक वरिष्ठ डेवलपर या एक कोडिंग मानक द्वारा चीजों को अलग तरीके से करने के लिए कहा गया है।
क्रामि

2
मुझे नहीं पता कि यहां "जादू" क्या है। वे मुझे मूल स्ट्रिंग शाब्दिक की तरह दिखते हैं।
tchrist

6

मौजूदा उत्तरों में जोड़ने के लिए:

अंतर्राष्ट्रीयकरण (i18n)

यदि पाठ को स्क्रीन पर प्रदर्शित करना कठिन-कोडित है और कार्यों की परतों के भीतर दफन है, तो आपको उस पाठ के अनुवाद को अन्य भाषाओं में प्रदान करने में बहुत मुश्किल समय होने वाला है।

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

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


3

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

लेकिन फिर, यह कुछ डेवलपर्स के बारे में बहुत कुछ नहीं है।

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