वर्ग विधियों के साथ तार "शिथिल" के साथ युग्मन है?


18

मैं स्विंग का उपयोग करके जावा में एक स्कूल समूह परियोजना शुरू कर रहा हूं। यह डेटाबेस डेस्कटॉप ऐप पर एक सीधा GUI है।

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

मैं उन कारणों को खोजने की उम्मीद कर रहा हूं जिनकी प्रणाली अच्छी या बुरी है। (मैंने प्रोफेसर से पूछा और उन्होंने कहा कि मैं बाद में देखूंगा कि यह बेहतर क्यों है, जो मुझे संतुष्ट नहीं करता है।)

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

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

    else if(evt.getSource() == bicycleMakeField)
    {
        myRegistry.updateSubscribers("BicycleMake", bicycleMakeField.getText());
    }

वह कॉल अंततः वाहन मॉडल में इस विधि के लिए हो जाती है:

public void stateChangeRequest(String key, Object value) {

            ... bunch of else ifs ...

    else
    if (key.equals("BicycleMake") == true)
    {
                ... do stuff ...

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

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

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


स्पष्ट करने के लिए, मैं उपर्युक्त दृष्टिकोण की तुलना करना चाहता हूं, क्योंकि दृश्य स्पष्ट रूप से मॉडल के साथ जुड़ा हुआ है। उदाहरण के लिए, आप वाहन मॉडल ऑब्जेक्ट को देखने के लिए पास कर सकते हैं, और फिर वाहन के "मेक" को बदलने के लिए, यह करें:

vehicle.make = bicycleMakeField.getText();

यह कोड की 15 पंक्तियों को कम कर देगा जो वर्तमान में केवल एक जगह पर वाहन को बनाने के लिए उपयोग किया जाता है, कोड की एक एकल पठनीय लाइन के लिए। (और चूंकि इस तरह का ऑपरेशन पूरे ऐप में सैकड़ों बार किया जाता है, मुझे लगता है कि यह पठनीयता के साथ-साथ सुरक्षा के लिए भी एक बड़ी जीत होगी।)


अपडेट करें

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


12
ओटी। मुझे लगता है कि आपके प्रोफेसर को खुद को अपडेट करना चाहिए और पुराने कोड का उपयोग नहीं करना चाहिए। शिक्षा में वहाँ 2006 से एक जावा संस्करण का उपयोग करने का कोई कारण नहीं है जब यह 2012 है
Farmor

3
कृपया हमें पोस्ट करते रहें जब आप अंततः उसका उत्तर प्राप्त करते हैं।
जेएफओ

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

1
सच। मैंने उनसे बात करते हुए उन्हें जादू के तार नहीं कहा है, लेकिन आप सही कह रहे हैं, इसे ध्वनि से बदतर बनाने की कोई आवश्यकता नहीं है।
फिलिप

2
आपके प्रोफेसर का वर्णन है (श्रोताओं को घटनाओं को स्ट्रिंग के रूप में नामित करके सूचित करना) अच्छा हो सकता है। वास्तव में enums अधिक समझ में आ सकता है, लेकिन यह सबसे बड़ी समस्या नहीं है। मैं यहाँ जो वास्तविक मुद्दा देख रहा हूँ वह यह है कि अधिसूचना प्राप्त करने वाली वस्तु स्वयं मॉडल है, और फिर आपको उस तरह के ईवेंट के आधार पर मैन्युअल रूप से प्रेषण करना होगा। ऐसी भाषा में जहाँ फ़ंक्शंस प्रथम श्रेणी के होते हैं, आप किसी फ़ंक्शन को पंजीकृत करेंगे , न कि किसी ईवेंट के लिए। जावा में, मुझे लगता है कि किसी को किसी एकल फ़ंक्शन को लपेटकर किसी प्रकार की वस्तु का उपयोग करना चाहिए
एंड्रिया

जवाबों:


32

आपके प्रोफेसर के प्रस्ताव को सबसे अच्छे ढंग से टाइप किया गया है और लगभग हर स्तर पर गलत है।

निर्भरता व्युत्क्रम द्वारा युग्मन को सबसे कम किया जाता है , जो कई मामलों को हार्डवॉयर करने के बजाय एक बहुरूपी प्रेषण द्वारा करता है।


3
आप "लगभग हर स्तर" लिखते हैं, लेकिन आपने यह नहीं लिखा है कि यह (आपके विचार में) इस उदाहरण में उपयुक्त मामला क्यों नहीं है। जानना दिलचस्प होगा।
फकर

1
@ खाक्रे: उपयुक्त मामले नहीं हैं, कम से कम जावा में नहीं। मैंने कहा, यह "लगभग हर स्तर पर गलत है", क्योंकि यह बिना किसी अप्रत्यक्ष उपयोग के बेहतर है और सभी कोड को एक ही स्थान पर फेंकना है। हालांकि, एक मैनुअल प्रेषण के लिए आधार के रूप में (वैश्विक) जादू स्ट्रिंग स्थिरांक का उपयोग करना अंत में वैश्विक वस्तुओं का उपयोग करने का एक जटिल तरीका है।
back2dos

तो आपका तर्क है: कभी भी उपयुक्त मामले नहीं होते हैं, इसलिए यह एक भी नहीं है? यह शायद ही एक तर्क है और वास्तव में बहुत मददगार नहीं है।
हैकर 6

1
@ हेक्रे: मेरा तर्क है, यह दृष्टिकोण कई कारणों से खराब है (पैराग्राफ 1 - इससे बचने के लिए पर्याप्त कारण कड़ाई से टाइप किए गए स्पष्टीकरण में दिए गए हैं) और इसका उपयोग नहीं किया जाना चाहिए, क्योंकि एक बेहतर एक है (पैराग्राफ 2 )।
back2dos 6

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

19

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

प्रोफेसर के लिए कुछ हद तक उचित होने के लिए, वह जावा में बनाने की कोशिश कर रहा है जो कि कहे जाने वाले अत्यधिक सामान्य .NET इंटरफ़ेस के समान दिखता है INotifyPropertyChanged, जो परिवर्तन के माध्यम से परिवर्तन घटनाओं के ग्राहकों को सूचित करता है जो निर्दिष्ट करते हैं कि कौन सी संपत्ति बदल गई है। .NET में कम से कम, इस इंटरफ़ेस का उपयोग मुख्य रूप से ऑब्जेक्ट और GUI तत्वों (बाइंडिंग) को देखने के लिए डेटा मॉडल से संचार करने के लिए किया जाता है।

यदि सही किया जाता है ,तोइस दृष्टिकोण को लेने सेकुछ लाभ हो सकते हैं:

  1. दृश्य मॉडल पर निर्भर करता है, लेकिन मॉडल को दृश्य पर निर्भर होने की आवश्यकता नहीं है। यह नियंत्रण का उचित उलटा है
  2. आपके पास अपने व्यू कोड में एक ही स्थान है जो मॉडल से सूचनाएं बदलने का जवाब देता है, और केवल एक जगह सदस्यता / सदस्यता समाप्त करता है, जिससे एक लटकते संदर्भ मेमोरी लीक की संभावना कम हो जाती है।
  3. जब आप ईवेंट प्रकाशक से किसी ईवेंट को जोड़ना या निकालना चाहते हैं तो कम कोडिंग ओवरहेड होता है। .NET में, एक अंतर्निहित प्रकाशित / सदस्यता तंत्र कहा जाता है, eventsलेकिन जावा में आपको प्रत्येक घटना के लिए कक्षाएं या ऑब्जेक्ट बनाने और सदस्यता / सदस्यता समाप्त कोड लिखना होगा।
  4. इस दृष्टिकोण के साथ सबसे बड़ी गिरावट यह है कि सदस्यता कोड प्रकाशन कोड के साथ सिंक से बाहर हो सकता है। हालांकि, यह कुछ विकास के वातावरण में एक लाभ भी है। यदि मॉडल में एक नया ईवेंट विकसित किया गया है और इसे सब्सक्राइब करने के लिए व्यू अभी तक अपडेट नहीं किया गया है, तो व्यू अभी भी काम करेगा। इसी तरह, यदि कोई ईवेंट हटा दिया जाता है, तो आपके पास कुछ मृत कोड हैं, लेकिन यह अभी भी संकलित और चला सकता है।
  5. .NET में कम से कम, परावर्तक का उपयोग यहां बहुत प्रभावी ढंग से किया जाता है ताकि स्वचालित रूप से गेटर्स को कॉल किया जा सके और सब्सक्राइबर को दी गई स्ट्रिंग पर निर्भर करता है।

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


To खोज INotifyPropertyChangedकरने के लिए Google उन लाखों तरीकों को खोजता है, जिन्हें लागू करते समय लोग जादू की स्ट्रिंग का उपयोग करने से बचने की कोशिश करते हैं।


ऐसा लगता है कि आपने यहाँ SOAP का वर्णन किया है। : D ... (लेकिन हाँ, मुझे आपकी बात सही
लगी

11

enumpublic static final Stringमैजिक स्ट्रिंग्स के बजाय एस (या एस) का उपयोग किया जाना चाहिए।

आपका प्रोफेसर OO नहीं समझता है । उदाहरण के लिए एक ठोस वाहन वर्ग है?
और क्या इस वर्ग को साइकिल बनाने की समझ है?

वाहन अमूर्त होना चाहिए और बाइक नामक एक ठोस उपवर्ग होना चाहिए। मैं एक अच्छा ग्रेड पाने के लिए उसके नियमों से खेलता हूँ और फिर उसकी शिक्षा को भूल जाता हूँ।


3
जब तक कि इस अभ्यास का उद्देश्य बेहतर OO सिद्धांतों का उपयोग करके कोड में सुधार करना है। उस मामले में, दूर refactor।
joshin4colours

2
@ joshin4colours अगर StackExchange इसे ग्रेड कर रहा था तो आप सही होंगे; लेकिन चूंकि कब्र वही व्यक्ति है जो इस विचार के साथ आया था कि वह हम सभी को बुरे अंक देगा क्योंकि वह जानता है कि उसका कार्यान्वयन बेहतर था।
दान नीली

7

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

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

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


मैं इस बात से सहमत हूं कि एनम स्ट्रिंग स्ट्रिंगल से बेहतर हैं। लेकिन फिर भी, क्या वास्तव में "स्टेटक्रॉफ्टरैप्लेस्ट" को एनम कुंजी के साथ कॉल करना बेहतर है, या बस सीधे मॉडल पर एक विधि को कॉल करना है? किसी भी तरह से, मॉडल और दृश्य उस एक स्थान पर युग्मित होते हैं।
फिलिप

@Philip: तो ठीक है, मुझे लगता है कि मॉडल को डिकूप करने और उस बिंदु पर देखने के लिए, आपको ऐसा करने के लिए किसी तरह के नियंत्रक-वर्ग की आवश्यकता हो सकती है ...
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner - हाँ। MVC आर्किटेक्चर सबसे अधिक
अपकर्षित किया गया है

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

6

'उद्योग अनुभव' का उपयोग करना एक खराब तर्क है। आपके प्रोफेसर को उस :-) से बेहतर तर्क के साथ आने की जरूरत है।

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

मैं देखता हूं कि @backtodos ने इसे कवर किया है, जबकि मैं इसका उत्तर दे रहा था, इसलिए मैं बस अपनी राय जोड़ूंगा कि व्युत्क्रम नियंत्रण का उपयोग करना (जिनमें से डिपेंडेंसी इंजेक्शन एक रूप है, आप लंबे समय से पहले उद्योग में स्प्रिंग फ्रेमवर्क में चलेंगे। ..) इस प्रकार के डिकॉउलिंग से निपटने के लिए एक अधिक आधुनिक तरीका माना जाता है।


2
पूरी तरह से सहमत शिक्षा उद्योग की तुलना में कहीं अधिक आवश्यकताएं होनी चाहिए। शिक्षाविद == सर्वोत्तम सैद्धांतिक तरीका; उद्योग == सबसे अच्छा व्यावहारिक तरीका
किसान

3
दुर्भाग्य से, कुछ लोग जो इस सामान को शिक्षा में सिखाते हैं, वे ऐसा इसलिए करते हैं क्योंकि वे इसे उद्योग में नहीं काट सकते। सकारात्मक पक्ष में, शिक्षाविदों में से कुछ प्रतिभाशाली हैं और उन्हें कुछ कॉर्पोरेट कार्यालय में छिपाकर नहीं रखा जाना चाहिए।
FrustratedWithFormsDesigner

4

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

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


4

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

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

private Dictionary<string, Func<string>> methods;

private void InitDictionary() //called elsewhere
{
   methods = new Dictionary<string, Func<string>> 
      {{"Method1", ()=>doSomething()},
       {"MEthod2", ()=>doSomethingElse()}} //oops, fat-fingered it
}

public string RunMethod(string methodName)
{
   //very naive, but even a check for the key would generate a runtime error, 
   //not a compile-time one.
   return methods[methodName](); 
}

...

//this is what we thought we entered back in InitDictionary for this method...
var result = RunMethod("Method2"); //error; no such key

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


2

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

अगर कोई "साइकिलमेक" को "साईकिलमेक" में बदलता है तो कोई भी यह पता लगाने वाला नहीं है कि रनटाइम तक चीजें टूट जाती हैं।

संकलन समय त्रुटियों की तुलना में रनटाइम त्रुटियां अधिक महंगी हैं - यह सिर्फ सभी प्रकार की बुराई है।

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