2009-09-28 12 views
5

को स्टेटिक टंकण मैं हमेशा स्थिर टाइप किया भाषाओं (C/C++, जावा) पर काम किया है से। मैं क्लोजर के साथ खेल रहा हूं और मुझे वाकई यह पसंद है।गतिशील टाइपिंग

एक बात मैं के बारे में है चिंतित हूँ: कहते हैं कि मैं एक खिड़कियों कि तर्क के रूप में और जिस तरह से आवश्यकताओं को बदलने के साथ 3 मॉड्यूल लेता है और मैं समारोह के लिए एक और मॉड्यूल पारित करने के लिए की आवश्यकता है। मैं बस फ़ंक्शन बदलता हूं और संकलक हर जगह शिकायत करता हूं मैंने इसका इस्तेमाल किया। लेकिन क्लोजर में यह तब तक शिकायत नहीं करेगा जब तक कि फ़ंक्शन को बुलाया न जाए। मैं सिर्फ एक रेगेक्स खोज कर सकता हूं और प्रतिस्थापित कर सकता हूं लेकिन ऐसा लगता है कि कॉल को याद करने का मौका है और यह तब तक अनजान हो जाएगा जब तक कि उस समारोह को वास्तव में बुलाया न जाए। आप लोग इस से कैसे निपटते हैं?

+4

आप लोग इस से कैसे निपटते हैं? मेरे अनुभव में, सही उत्तर होगा, "बहुत अच्छा नहीं।" –

उत्तर

8

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

+2

+1। अनिवार्य रूप से, स्थैतिक प्रकार प्रणाली यूनिट परीक्षणों का एक ऑटो-जनरेटेड सेट है (क्योंकि मेरे गतिशील-प्रचारक मित्रों में से एक को इंगित करना पसंद है)। आपको उन लोगों को गतिशील भाषा में कोड करने की आवश्यकता है, जो आपको अधिक लचीलापन देता है लेकिन अधिक प्रयास भी करता है। यह तय करने के लिए कि आपका व्यापार एक गतिशील या स्थिर भाषा के पक्ष में है या नहीं, यह आपके और आपके विशेष डिजाइन पर निर्भर है। – rmeador

+1

आप इस तथ्य पर चमकते हैं कि स्थिर प्रकार प्रणाली से निपटने के लिए प्रयास की आवश्यकता है। सवाल यह है, जो अधिक है? – jshen

+2

@jshen: लेकिन कितना प्रयास? * अच्छी * स्थिर रूप से टाइप की गई भाषा में, आप बहुत अधिक भूल सकते हैं कि यह स्थिर रूप से टाइप किया गया है। यह केवल भाषाओं के सी-परिवार की तरह जंक में है कि आपको लगातार सबकुछ के कंपाइलर को याद दिलाना होगा। – jalf

0

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

+0

मेरी अज्ञानता क्षमा करें लेकिन गतिशील टाइपिंग आपको कुछ स्तर का रिफैक्टरिंग कैसे खो देती है? – khelll

+0

शायद इसका मतलब है "स्वचालित रिफैक्टरिंग" यहां। –

+0

मेरा मानना ​​है कि वाक्य का मतलब है "सुरक्षा को दोबारा बनाना"। – DigitalRoss

0

टिम ब्रै ने इसे here पर चर्चा की, जिसमें सेड्रिक here की आलोचना है, और post पर आर्टिमा पर इसकी लंबाई पर चर्चा की गई है।

3

पहली बात मैं उल्लेख करना चाहते हैं कि ब्रूस एकेल एक बहुत ही दिलचस्प Strong Typing vs Strong Testing कहा जाता है (लिंक, दुर्भाग्य से इस समय नीचे है, लेकिन उम्मीद है कि इसे जल्दी ही हो जाएगा) लेख लिखा गया है।

उनका विचार है कि जब संकलित भाषाओं के साथ काम कर, संकलक बस स्वत: परीक्षण के पहले, स्वत: कदम के रूप में काम कर रहा है है। गतिशील भाषा में जाने के दौरान, आप स्वचालित परीक्षण के पहले स्तर को खो देते हैं। लेकिन दोनों मामलों में, यह पहला, स्वचालित स्तर परीक्षण का केवल एक हिस्सा है, और यहां तक ​​कि एक बहुत ही महत्वपूर्ण हिस्सा नहीं है।

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

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

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

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

मैं सुझाव दूंगा कि क्लोजर की कौन सी तकनीकें सिमिलियर चीजों की अनुमति देती हैं, और निर्णय लेती हैं कि वे आवेदन करते हैं या नहीं आपकी स्थिति में

1

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

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

यदि आप एक सार्वजनिक इंटरफ़ेस का हिस्सा थे, तो आप वही काम करते हैं जो आप एकमात्र उपयोगकर्ता नहीं थे।

आप अतिरिक्त मॉड्यूल के साथ एक नई विधि जोड़ते हैं और पुराने को एक उपयुक्त डिफ़ॉल्ट के साथ कॉल करने के लिए पुराने को बदलते हैं।

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

1

आप Clojure में संकलक समर्थन के बिना पूरी तरह से नहीं कर रहे हैं। आपके द्वारा दिए गए विशिष्ट उदाहरण में, यह उस फ़ंक्शन की धैर्य है जो बदली गई है, जिसे क्लोजर कोड संकलित करके उठाया जाएगा। मैं अभी भी मजबूत -> गतिशील टाइपिंग संक्रमण कर रहा हूं और यह आरामदायक ढूंढ रहा हूं!

0

यदि आपको वास्तव में स्थिर टाइपिंग की आवश्यकता है, तो आप https://github.com/clojure/core.typed का उपयोग कर सकते हैं और स्थिर वैरिएबल पासिंग का परीक्षण करने के लिए यह लीनिंग मॉड्यूल है।

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