2010-04-30 22 views
10

मैं आज मेरा कुछ सी # कोड के माध्यम से पढ़ रहा था और इस लाइन पाया:क्या आपको ऐसी भाषाएं पसंद हैं जो आपको "अगर" से पहले "फिर" डालने दें?

if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated) return; 

सूचना है कि आप स्क्रॉल यह है कि बिना बता सकते हैं एक "अगर" बयान है कि, ItemContainerGenerator.Status साथ काम करता है, लेकिन आप नहीं कर सकते आसानी से बताएं कि अगर "अगर" खंड "सत्य" का मूल्यांकन करता है तो विधि उस बिंदु पर वापस आ जाएगी।

वास्तव में मुझे अपने आप को "वापसी" कथन को एक पंक्ति में ले जाना चाहिए था, लेकिन यह मुझे उन भाषाओं के बारे में सोचने लगा जो पहले "कथन" के हिस्से को अनुमति देते थे। सी # यह अनुमति दी है, तो लाइन ऐसा दिखाई दे सकता:

return if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated); 

इसमें कुछ समय "तार्किक" हो सकता है, लेकिन मैं सोच रहा हूँ लोगों को निर्माण के इस प्रकार के बारे में क्या सोचते हैं। यह ऊपर की तरह लाइनों को और अधिक पठनीय बनाने के लिए काम कर सकता है, लेकिन यह भी विनाशकारी हो सकता है। इस कोड की कल्पना कीजिए:

return 3 if (x > y); 

तार्किक रूप से हम केवल लौट सकते हैं अगर एक्स> y, वहाँ कोई "और" है, क्योंकि, लेकिन मेरे की बात यह है कि को देखता है और सोचता है, "हम अभी भी लौट रहे हैं अगर एक्स < = y हैं? तो, हम क्या लौट रहे हैं? "

"अगर पहले" निर्माण के बारे में आप क्या सोचते हैं? क्या यह आपकी पसंद की भाषा में मौजूद है? क्या आप इसे अक्सर इस्तेमाल करते हैं? सी # इससे लाभ होगा?

+5

'x = 3 if (a = b)' –

+1

दिलचस्प है, लेकिन अधिकतर 'अगर' कोड ब्लॉक ट्रिगर नहीं करता है, एक साधारण ऑपरेशन नहीं। – UpTheCreek

+2

हाँ, शायद यह केवल वापसी बयान पर समझ में आता है जहां यह थोड़ा कम संदिग्ध है। अगर आपको पसंद है, तो @codeka! यह सीडब्ल्यू है इसलिए यह प्रतिनिधि के लिए नहीं है। –

उत्तर

4

यह मेरे लिए बदसूरत लग रहा है। मौजूदा वाक्यविन्यास बहुत बेहतर है।

if (x > y) return 3; 
+0

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

+1

दाएं। लेकिन किसी भी भाषा में चीजें भ्रमित होने से रोकने के लिए एक रूप में हैं। और अगर हम शुरुआत से और शुरुआत से लेकर अंत तक दोनों ही बयान लिखने देते हैं, तो यह बहुत भ्रमित होगा, क्योंकि आप कुछ पढ़ते हैं लेकिन आप तुरंत नहीं जानते हैं, अगर यह शुरुआत या अंत है। –

+0

यह अंग्रेजी में कहने के लिए समान रूप से सही है, और भ्रमित नहीं है, "अगर मेरे पास पर्याप्त पैसा है तो मैं लाल कार खरीदूंगा" बनाम "यदि मेरे पास पर्याप्त पैसा है तो मैं लाल कार खरीदूंगा"। प्रोग्रामर को देने का विकल्प उन्हें महत्वपूर्ण चीज़ों पर अधिक जोर देने की अनुमति देता है। –

9

हां। यह बेहतर पढ़ता है। रूबी अपने वाक्यविन्यास के हिस्से के रूप में यह है - अवधि जा रहा है 'statement modifiers'

irb(main):001:0> puts "Yay Ruby!" if 2 == 2 
Yay Ruby! 
=> nil 
irb(main):002:0> puts "Yay Ruby!" if 2 == 3 
=> nil 

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

10

मुझे यह आमंत्रित करने की अस्पष्टता पसंद नहीं है। निम्नलिखित कोड पर विचार करें:

doSomething(x) 
if (x > y); 
doSomethingElse(y); 

यह क्या कर रहा है? हां, संकलक इसे समझ सकता है, लेकिन यह प्रोग्रामर के लिए बहुत भ्रमित लग रहा होगा।

+3

यह उस अस्पष्टता का एक शानदार उदाहरण है जो इसे पेश कर सकता है। शायद अगर यह "वापसी" बयान तक ही सीमित था? मुझे नही पता। –

+0

अस्पष्टता कहां है? आपने जो कुछ किया है वह एक नई लाइन डाली गई है। – liammclennan

+0

मुझे अस्पष्टता दिखाई नहीं दे रही है। यह पूरी तरह से स्पष्ट है कि इसे कैसे पार्स किया जाएगा। – Blindy

1

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

0

पर्ल और रूबी दोनों में यह ठीक है और यह ठीक काम करता है। व्यक्तिगत रूप से मैं उतनी कार्यक्षमता के साथ ठीक हूं जिसे आप मुझ पर फेंकना चाहते हैं। मेरे कोड को जितना अधिक विकल्प मुझे लिखना है, उतनी ही बेहतर गुणवत्ता, सही? "नौकरी के लिए सही उपकरण" और वह सब।

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

3

मैं

return 3 if (x > y); 

यह शायद आपको परेशान करती है क्योंकि आप वाक्य रचना के आदी नहीं कर रहे हैं के साथ किसी भी समस्या नहीं दिख रहा।

return 3 unless y <= x 

यह एक अच्छा वाक्यविन्यास विकल्प है, लेकिन मुझे नहीं लगता कि सी # की आवश्यकता है।

+0

हां, रुबी जब तक कि कीवर्ड की अनुमति नहीं देता है। 'वापसी' सफलता! जब तक त्रुटि वापसी '0'' वापसी 'सफलता' के विपरीत नहीं है, तो त्रुटि गणना <1' यह तर्क दिया जा सकता है कि पहला कथन अधिक स्पष्ट है। – Armstrongest

15

आइए पुनः स्वरूपित कि थोड़ा और देखें:

using System.Windows.Controls.Primitives; 

... 

if (ProgenyList.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated) 
{ 
    return; 
} 

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

मौजूदा सी # वाक्यविन्यास का लाभ यह है कि पाठ क्रम क्रम निष्पादन आदेश को दर्शाता है - यदि आप जानना चाहते हैं कि क्या होगा, तो आप कोड को ऊपर से नीचे तक पढ़ते हैं।

व्यक्तिगत रूप से मैं "वापसी अगर ..." का प्रशंसक नहीं हूं - मैं आदेश बदलने के बजाय पठनीयता के लिए कोड को दोबारा सुधारना चाहता हूं।

+1

ठीक है, अनाम विधियों और lamdba अभिव्यक्तियों के साथ, पाठ क्रम क्रमशः निष्पादन आदेश को प्रतिबिंबित नहीं करता है। –

+0

@ सेंथिल: सच - लेकिन मुझे लगता है कि उस मामले में लाभ लागत से अधिक है। इस स्थिति में मैं वास्तव में ऐसा नहीं सोचता कि यह मामला है। –

+0

मुझे यह पसंद नहीं है कि इस तरह की एक सरल अवधारणा को व्यक्त करने के लिए कोड की चार पंक्तियां होती हैं। –

4

मुझे लगता है कि यह संभवतः ठीक है अगर दायरा केवल return कथन तक सीमित था। जैसा कि मैंने मेरी टिप्पणी में कहा, कल्पना अगर इस की अनुमति दी गई:

{ 
    doSomething(); 
    doSomethingElse(); 

    // 50 lines... 

    lastThink(); 
} if (a < b); 

लेकिन फिर भी इसे अनुमति देने के लिए केवल return पर बयान शायद एक फिसलन ढलान है। लोग पूछेंगे, "return x if (a); की अनुमति है, तो doSomething() if (a); जैसे कुछ क्यों नहीं?" और फिर आप ढलान के नीचे अपने रास्ते पर हैं :)

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

+0

'doSomething() अगर (ए); 'बिल्कुल ठीक है। हालांकि आपका उदाहरण ... शायद लागू नहीं किया जा सका। यह केवल एकल कथन अभिव्यक्ति तक ही सीमित होगा। – Blindy

+3

सी # 'एक सही तरीके से' प्रयास नहीं करता है। मैं सी #, 2 पूरी तरह से अलग LINQ वाक्यविन्यास, पुनरावृत्त करने के 4 अलग-अलग तरीकों, आदि में सशर्त करने के कम से कम 4 अलग-अलग तरीकों के बारे में सोच सकता हूं। यह फिसलन ढलान आप किस बारे में बोलते हैं? – liammclennan

+1

यह 'do/while' अभिव्यक्ति की तरह दिखता है। –

-1

इसे प्रश्न से पहले जवाब देने के लिए व्याकरणिक रूप से गलत माना जाता है कोड में यह अलग क्यों होगा?

+1

ठीक है, लेकिन यह पहले जवाब नहीं डाल रहा है, यह पहले ACTION डाल रहा है। "यदि हम बाहर हैं तो अंडे खरीदें" व्याकरणिक रूप से गलत नहीं है। – Blindy

+1

यदि यह आपके साथ ठीक है तो मैं यहां एक विवाद छोड़ दूंगा। :) –

0

मनुष्य समाप्त होने के लिए पढ़ते हैं। कोड प्रवाह का विश्लेषण करने में, limits of the short term memory अतिरिक्त बैकट्रैकिंग के कारण पोस्टफिक्स स्थितियों को पढ़ने में और अधिक कठिन बनाते हैं। लघु अभिव्यक्तियों के लिए, यह कोई समस्या नहीं हो सकती है, लेकिन लंबे अभिव्यक्तियों के लिए यह उन उपयोगकर्ताओं के लिए महत्वपूर्ण ओवरहेड लेगा जो seasoned भाषा पढ़ रहे हैं।

+0

यह सिर्फ इसका उपयोग करने लगता है। मनुष्य उल्लेखनीय रूप से अनुकूलनीय हैं। तागालोग को देखो ... 'ना का ताटे एंज सस्सी' लिप्यंतरित है 'पिता के साथ चाबियाँ' का अनुवाद किया गया है '' पिता के पास चाबियाँ हैं। '' मुझे यकीन है कि तागालोग के वक्ताओं घर पर 'वापसी x' ' – Armstrongest

1

व्यक्तिगत रूप से मुझे ऐसी भाषाएं पसंद हैं जो मुझे चुनने दें।

कहा यही कारण है, यह शायद कोई फर्क नहीं पड़ता कि क्या शैली आप उपयोग करते हैं, क्योंकि वे समान रूप से पढ़ा जा सके यदि आप पुनः स्वरूपित के रूप में भी refactor:

using System.Windows.Controls.Primitives; 

... 
var isContainersGenerated = 
    ProgenyList.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated; 

if (!isContainersGenerated) return; 
//alternatively 

return if (!isContainersGenerated); 
1

भ्रामक से सहमत थे, मैं कभी नहीं इस निर्माण के बारे में सुना इससे पहले, तो मैं सही तरीका अगर चाहिए हमेशा सामग्री किसी और का परिणाम से पहले तो का उपयोग कर,

return (x > y) ? 3 : null; 

किसी और तरह से जैसे

तरह पहल निर्माण का उपयोग करने का कोई मतलब नहीं है लगता है
return 3 if (x > y); 
return 4 if (x = y); 
return 5 if (x < y); 

यह imho थोड़े अजीब है, क्योंकि मैं पता नहीं है, जहां यह उपयोग करने के लिए है ...

1

वहाँ एक चिंता का विषय कोड आपको लगता है कि एक बयान केवल बाद में निष्पादित करेंगे पता लगाने के लिए पढ़ने है यह हो सकता है निष्पादित करें।

उदाहरण के लिए यदि आप "doSomething (x)" पढ़ते हैं, तो आप सोच रहे हैं "ठीक है तो यह कॉल कुछ (x)" है, लेकिन फिर आप इसके बाद "अगर" पढ़ते हैं और यह महसूस करना होगा कि पिछला कॉल सशर्त है अगर बयान पर।

जब "अगर" पहले होता है तो आप तुरंत जानते हैं कि निम्नलिखित कोड हो सकता है ऐसा हो सकता है और इसका इलाज कर सकता है।

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

0

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

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

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

0

मुझे लगता है कि यह एक उपयोगी निर्माण है और एक प्रोग्रामर इसका उपयोग कोड में महत्वपूर्ण है और जो महत्वपूर्ण नहीं है उस पर जोर देने के लिए इसका उपयोग करेगा। यह इरादे-खुलासा कोड लिखने के बारे में है।

मैं कुछ इस तरह (coffeescript में) का उपयोग करें:

सूचकांक = bla.find 'एक'
वापसी अगर सूचकांक है -1

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

तो यह निर्माण मुझे इस तरह से कोड करने में मदद करता है जो मेरे इरादे को थोड़ा बेहतर ढंग से दर्शाता है।

यह महसूस करना बहुत आश्चर्यजनक नहीं होना चाहिए कि जिस क्रम में सही अंग्रेजी या पारंपरिक प्रोग्रामिंग-भाषा व्याकरण की आवश्यकता होती है, वह हमेशा अर्थ बनाने का सबसे प्रभावी या सरल तरीका नहीं है।

कभी-कभी आपको सबकुछ बाहर निकलने की ज़रूरत होती है और सचमुच पुन: मूल्यांकन करने की ज़रूरत होती है कि वास्तव में कुछ करने का सबसे अच्छा तरीका क्या है।

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