2009-05-19 19 views
6

ऐसा लगता है कि एक स्थैतिक/दृढ़ता से टाइप की गई प्रोग्रामिंग भाषा के बारे में सबसे अमूल्य बात यह है कि यह रीफैक्टरिंग में मदद करता है: यदि आप किसी एपीआई को बदलते हैं, तो कंपाइलर आपको बताएगा कि वह परिवर्तन क्या है टूट गया है।स्टेटिक/मजबूत टाइपिंग और रीफैक्टरिंग

मैं एक क्रम/दुर्बलता से टाइप भाषा में कोड लिखने कल्पना कर सकते हैं ... लेकिन मैं संकलक की मदद के बिना रिफैक्टरिंग कल्पना नहीं कर सकते, और मैं पुनर्रचना के बिना कोड की लाइनों की हजारों लेखन कल्पना नहीं कर सकते।

क्या यह सच है?

+0

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

उत्तर

13

मुझे लगता है कि जब आप चेक किए जाते हैं तो प्रकारों की जांच की जाती है तो आप उलझन में हैं। रनटाइम टाइपिंग जरूरी नहीं है।

स्थिर प्रकारों का मुख्य लाभ वही है जो आप कहते हैं: वे संपूर्ण हैं। आप भरोसा कर सकते हैं कि सभी कॉल साइटें कंपाइलर को यह करने की अनुमति देकर इस प्रकार के अनुरूप होती हैं।

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

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

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

अपने दूसरे प्रश्न के रूप में:

हम कैसे फिर से कारक कर सकते हैं सुरक्षित रूप से एक क्रम टाइप किया भाषा में?

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

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

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

+0

क्या आप कृपया स्थिर प्रकार के सिस्टम से जो गुम हो रहे हैं, उस पर विस्तृत जानकारी दे सकते हैं? जहां तक ​​मैं कह सकता हूं, मुझे किसी भी कमी का एहसास नहीं है जिसे टाइप सिस्टम के लिए निर्धारित किया जा सकता है, न ही मैं कुछ साल पहले सी ++ सीखने के बाद से हूं। मैं कुछ खो रहा था और इसे ध्यान में नहीं देख सकता था, इस मामले में यह मेरे लिए यह इंगित करने के लिए बहुत मूल्यवान होगा। –

+0

@ जॉन: लैम्ब्डा पर अल्टीमेट पर कोई भी आपको बेहतर जवाब दे सकता है, लेकिन मेरी सीमित समझ से, ऐसा लगता है कि सी ++ टाइपिंग में बड़ी कमजोर जगह कुल योगों पर बाधा है। सी ++ टेम्पलेट हैकिंग ला ला एलेक्सेंड्रेस्यूक आपको बहुत दूर ले जा सकता है, लेकिन मुझे लगता है कि अभी भी कंटेनर/सरणी से संबंधित कोड का थोड़ा सा हिस्सा है जो रनटाइम चेक के लिए रिसॉर्ट करता है। उदाहरण के लिए, अगर मैं एक वेक्टर के आकार को बाधित करना चाहता हूं तो क्या होगा? या एक स्ट्रिंग की लंबाई को एक सीमा तक सीमित करें? आश्रित प्रकार इस तरह के चीजों को व्यक्त कर सकते हैं। –

+0

मैंने 'आश्रित प्रकार' वाली भाषा का उपयोग नहीं किया है ... 'रन-टाइम टाइपिंग' की मेरी धारणा जावास्क्रिप्ट की तरह अधिक है! – ChrisW

1

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

5

मैं पूरी तरह से आपकी भावना से सहमत हूं। गतिशील रूप से टाइप की जाने वाली भाषाओं में बहुत लचीलापन वास्तव में अच्छा माना जाता है, वास्तव में कोड को बनाए रखने के लिए बहुत कठिन बनाता है। असल में, क्या ऐसी कोई ऐसी चीज है जो एक प्रोग्राम के रूप में काम करती रहती है यदि डेटा प्रकार वास्तव में कोड को बदले बिना गैर-मामूली तरीके से बदलते हैं?

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

मुझे लगता है कि Google के आंतरिक उपकरण वास्तव में एक संकलन करते हैं और शायद उनके जावास्क्रिप्ट को जांचते हैं। काश मैं उन उपकरणों था।

+1

क्या आप मूल रूप से Google वेब टूलकिट (http://code.google.com/webtoolkit/) के बारे में बात नहीं कर रहे हैं? –

+0

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

1

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

2

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

मुझे स्थिर प्रकार की कमी को रेफैक्टरिंग की समस्या नहीं है। क्या मैं एक समस्या को खोजने के एक पुनर्रचना ब्राउज़र की कमी है। गतिशील भाषाओं में समस्या है कि आप वास्तव में नहीं जानते कि कोड वास्तव में तब तक क्या करने जा रहा है जब तक आप इसे वास्तव में नहीं चलाते। पर्ल में यह अधिक से अधिक है। पर्ल में बहुत ही जटिल, लगभग अवांछित, वाक्यविन्यास होने की अतिरिक्त समस्या है। परिणाम: कोई रिफैक्टरिंग टूल नहीं (हालांकि they're working very rapidly on that)। अंतिम परिणाम मुझे हाथ से रिफैक्टर करना है। और यही वह है जो बग पेश करता है।

मेरे पास उन्हें पकड़ने के लिए परीक्षण हैं ... आमतौर पर। मैं अपने आप को अक्सर यह परीक्षण करने के लिए कोड refactor करने के लिए होने के चिकन/अंडे की समस्या के साथ अपरीक्षित और समीप untestable कोड का एक गुस्से में ढेर के सामने पाते हैं, लेकिन इसे refactor करने में यह परीक्षण करने के लिए हो रही है। Ick। इस बिंदु पर मैं कुछ बहुत ही गूंगा, उच्च स्तर लिखने के लिए है बस सुनिश्चित करें कि मैं कुछ नहीं तोड़ा बनाने के लिए परीक्षण की तरह "कार्यक्रम उत्पादन एक ही बात यह पहले किया था करता है"।

स्टेटिक प्रकार, जावा या सी ++ या सी # में कल्पना के रूप में, वास्तव में केवल प्रोग्रामिंग समस्याओं का एक छोटा सा वर्ग का समाधान। वे गारंटी देते हैं कि आपके इंटरफेस सही लेबल वाले डेटा के बिट्स पास हो गए हैं। लेकिन सिर्फ इसलिए कि आप संग्रह प्राप्त करते हैं इसका मतलब यह नहीं है कि संग्रह में वह डेटा होता है जो आपको लगता है। क्योंकि आप एक पूर्णांक प्राप्त करते हैं इसका मतलब यह नहीं है कि आपको सही पूर्णांक मिला है। आपकी विधि उपयोगकर्ता ऑब्जेक्ट लेती है, लेकिन क्या उपयोगकर्ता लॉग इन है?

क्लासिक उदाहरण: public static double sqrt(double a)signature for the Java square root function है। स्क्वायर रूट नकारात्मक संख्याओं पर काम नहीं करता है। यह कहां कहता है कि हस्ताक्षर में? यह नहीं है इससे भी बदतर, यह कहता है कि यह कार्य क्या करता है? हस्ताक्षर केवल यह कहता है कि यह किस प्रकार लेता है और यह क्या लौटाता है। यह कहता है कि बीच में क्या होता है और जहां दिलचस्प कोड रहता है।कुछ लोगों ने design by contract का उपयोग करके पूर्ण एपीआई को कैप्चर करने का प्रयास किया है, जिसे व्यापक रूप से आपके फ़ंक्शन के इनपुट, आउटपुट और साइड इफेक्ट्स (या इसकी कमी) के रन-टाइम परीक्षण एम्बेड करने के रूप में वर्णित किया जा सकता है ... लेकिन यह एक और शो है।

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

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

+1

"एक एपीआई केवल फ़ंक्शन हस्ताक्षर से कहीं अधिक है" ... यदि मैं इसके हस्ताक्षर को बदले बिना किसी विधि का अर्थ बदलता हूं, तो मैं बस विधि का नाम बदल सकता हूं: फिर संकलक मुझे सभी स्थानों को खोजने में मदद करेगा/शेष कार्यक्रम में जो पुराने नाम का उपयोग कर रहे हैं और पुराने अर्थ की अपेक्षा कर रहे हैं। – ChrisW

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