2009-12-09 12 views
11

पिछले कुछ महीनों में मैं जावा से ग्रोवी में एक संक्रमण कर रहा हूं और मैं इसके कई लाभों की सराहना कर सकता हूं: कम कोड, बंद, बिल्डर्स, एमओपी जो अंत में Grails की तरह ढांचे को बनाता है, लिखते समय मजाक कर आसानी से परीक्षण आदिक्या आपके पास गतिशील भाषाओं में "गतिशील" बहुत अधिक हो सकता है?

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

  1. मैं अपने मानकों, खेतों, आदि के लिए प्रकार की घोषणा करना चाहिए:

    तो, यहाँ विशेष सवाल मैं के साथ मदद की जरूरत है?

  2. क्या मुझे सरल विधि के दौरान कोड के ब्लॉक को बंद करने की घोषणा करनी चाहिए?

  3. मुझे पॉलिमॉर्फिक गतिशील प्रेषण के बजाय बतख टाइपिंग का उपयोग कब करना चाहिए। उदाहरण के लिए, ग्रोवी में मैं जानवर कर सकता हूं। "$ Action"() या def def; Animal.action(), पशु पशु = नए कुत्ते() के बजाय; animal.action()। मैं ओपन-क्लोज़ेड सिद्धांत के संदर्भ में पहली बार समस्या देख सकता हूं, लेकिन ओओ शैली बहुरूपता को प्राथमिकता देने के किसी अन्य कारण से?

  4. मुझे ग्रोवी (यदि कभी) में इंटरफेस का उपयोग कब करना चाहिए?

मुझे यकीन है कि कुछ अन्य समान दुविधाएं हैं जिन्हें मैं लिखने में विफल रहा हूं। मुझे यह भी लगता है कि ये प्रश्न न केवल ग्रोवी के लिए मान्य हैं, बल्कि किसी भी अन्य गतिशील भाषा के लिए मान्य हैं। आपकी राय क्या है?

+0

प्रकारों को घोषित करने का एक अन्य कारण यह है कि एसओएपी वेब सेवाओं को प्रोग्राम करते समय डब्लूएसडीएल में कुछ प्रकार की जानकारी हो सकती है ... – Dan

उत्तर

1

.1। क्या मुझे अपने पैरामीटर, फ़ील्ड इत्यादि के लिए प्रकार घोषित करना चाहिए?

मैं सार्वजनिक एपीआई के हिस्से के रूप में उपयोग की जाने वाली कक्षाओं पर प्रकारों की घोषणा करता हूं, अन्य चीजें जो अन्य डेवलपर बहुत उपभोग कर रही हैं, या जहां मैं इंटेलिजे से कुछ अतिरिक्त स्वत: पूर्ण सहायता चाहूंगा। अन्यथा मैं चीजों को 'def'।

.2। क्या मुझे सरल विधि के दौरान कोड के ब्लॉक को बंद करने की घोषणा करनी चाहिए?

मैं विधियों का उपयोग करता हूं जब तक कि यह एक चर के रूप में चारों ओर घूमने की योजना नहीं है। भले ही "foo। & बार" विधि dereference ऑपरेटर है, अधिकांश देवताओं को इसके बारे में पता नहीं है और जब वे इसे पार करते हैं तो इससे उलझन में हैं। मैं क्लोजर का भी उपयोग करता हूं जब यह कोड का एक छोटा टुकड़ा होता है जो वर्णनात्मक उद्देश्यों के लिए अपनी विधि में डालने के बजाय एक बड़ी विधि में रहने के लिए स्पष्ट होता है।

.3। मुझे polymorphic गतिशील प्रेषण के बजाय बतख टाइपिंग का उपयोग कब करना चाहिए। उदाहरण के लिए, ग्रोवी में मैं जानवर कर सकता हूं। "$ Action"() या def def; Animal.action(), पशु पशु = नए कुत्ते() के बजाय; animal.action()। मैं ओपन-क्लोज़ेड सिद्धांत के संदर्भ में पहली बार समस्या देख सकता हूं, लेकिन ओओ शैली बहुरूपता को प्राथमिकता देने के किसी अन्य कारण से?

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

.4। मुझे groovy (अगर कभी) में इंटरफेस का उपयोग कब करना चाहिए?

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

2

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

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

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

+1

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

+0

आपके हस्ताक्षर "स्थिर करने का सबसे आसान तरीका" में स्थिर प्रकार जोड़ रहा है? – Chuck

+0

क्या यह सबसे आसान तरीका है? शायद या शायद नही। यह अधिक बाध्य है, और एक अच्छा कारण स्पष्ट हो जाने के बाद बाद में इसे पूर्ववत किया जा सकता है। –

1

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

+0

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

6

यह हमेशा एक लोकप्रिय राय नहीं है, लेकिन मुझे लगता है कि आपका कोड अधिक स्पष्ट और स्पष्ट हो सकता है, बेहतर।

मैं निर्माणों कि आप अनुमान लगा पर अभी क्या हो रहा है छोड़ ...

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

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

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

+1

मुझे डायनामिक के ऑप्ट-इन दृष्टिकोण पसंद है कि सी # (उदाहरण के लिए) ले रहा है - जब भी संभव हो स्थिर, आवश्यक होने पर गतिशील या स्पष्ट लाभ होने पर। –

+0

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

-1

हाँ

-

नहीं

आपको पता इस प्रश्न के लिए कोई वास्तविक जवाब है?

+1

और यह कि मेरी बजाय एक टिप्पणी होनी चाहिए? – OscarRyz

+0

मुझे नहीं लगता कि सभी बिंदु व्यक्तिगत वरीयता के लिए नीचे हैं। उदाहरण के लिए जानवर। "$ कार्रवाई"() ओसीपी तोड़ता है; polymorphism पसंद करने के लिए पर्याप्त कारण है। – Dan

0

ऑब्जेक्ट उन्मुख भाषाओं के दो प्रमुख प्रकार हैं।

भाषाओं में सिमुला 67 परिवार, जैसे सी ++ और जावा, स्थिर रूप से टाइप किए गए चर, कंपाइलर और लिंकर्स और विधि vtables का पक्ष लेते हैं।

में छोटी भाषा परिवार जैसे रूबी, गतिशील रूप से टाइप किए गए चर, व्याख्या, और फ़ंक्शन-पॉइंटर-टेबल के बजाय संदेश-पासिंग का पक्ष लेते हैं।

दोनों ऑब्जेक्ट उन्मुख हैं, लेकिन ऑब्जेक्ट-ओरिएंटेशन की अवधारणा पर बहुत अलग है।

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