क्या आप अपने कोड में संक्षिप्तता या पठनीयता पसंद करते हैं? [बन्द है]


21

कोड को अधिक संक्षिप्त बनाने के लिए अक्सर भाषा शॉर्टकट का उपयोग किया जा सकता है।

उदाहरण के लिए, टर्नरी और अशक्त सह-संचालन ऑपरेटर कोड की मात्रा को कम कर सकते हैं, लेकिन यकीनन पठनीयता की गिरावट:

C # में:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

कार्यात्मक रूप से इसके बराबर है:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

लेकिन जाहिर है एक बहुत अधिक क्रिया।

जब आप लाइन को ड्रा करने लगते हैं तो यह पठनीयता बनाम पठनीयता की बात आती है?


3
यह एक व्यक्तिपरक प्रश्न है, जिसने किसी को लागू किया है वह कहेगा कि उसका तरीका समझ में आता है, कोई व्यक्ति यह कहता है कि इसका कोई अर्थ नहीं है और इसे पढ़ने वाला दूसरा व्यक्ति यह कहेगा कि मुझे यह मिल गया है लेकिन मैं दूसरा तरीका पसंद करता हूं। यह केवल प्राथमिकता है।
क्रिस

20
मुझे लगता है कि दूसरा संस्करण अधिक पठनीय है।
वैभव

2
आप सांवलेपन के साथ कंफ्यूजन कर रहे हैं। निरंतरता पठनीयता में सुधार करती है। तपस्या इससे अलग हो जाती है।
फेरेकियो

1
@ ThorbjørnRavnAndersen: सी # कोड के लिए दर्शकों को आमतौर पर "डेवलपर्स एक सी # पृष्ठभूमि के साथ" है। मैंने जो देखा है, उससे प्रोग्रामर पर यहां आम सहमति बनती है। ऐसा लगता है कि आपको उपयोगी भाषा सुविधाओं का उपयोग करने से बचना चाहिए, क्योंकि कोई उनसे परिचित नहीं हो सकता है। (यह भी देखें: programmers.stackexchange.com/q/101513/33843। )
Heinzi

1
डुप्लिकेट ?: प्रोग्रामर .stackexchange.com/q/58630/ 15464 .. ओह, यह एक बड़ा है। :)
स्टीवन ज्यूरिस

जवाबों:


63

दोनों।

आपका पहला उदाहरण निश्चित रूप से अधिक क्रियात्मक है, और यकीनन अधिक स्पष्ट है ... लेकिन इसके लिए मुझे एक के बजाय पांच लाइनों को स्कैन करना होगा। इससे भी बदतर, यह अपने उद्देश्य deemphasizes - एक मूल्य प्रदान करने के लिए newGuy.Boss

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

अब, इसके विपरीत:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...साथ में:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

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


3
बहुत बढ़िया जवाब! - यह क्रिया के बारे में उतना नहीं है जितना कि यह उद्देश्य के बारे में है।
दामोविसा ६'१० बजे

2
@ डामोविसा: वास्तव में - कोड का लक्ष्य संचार है, और कोई सामान्य कारण नहीं है कि इसे जितना संभव हो उतना संक्षिप्त रूप से नहीं किया जाना चाहिए (लेकिन अब और नहीं)।
Shog9

1
अशक्त coalescing ऑपरेटर सीखने में एक से अधिक समय लगेगा - लेकिन यदि आप इसे नहीं जानते हैं, तो आपको इसे सीखना चाहिए!
केसबश

2
आह "??" जावा में अच्छा होगा।

भले ही अंतिम उदाहरण कोड के संदर्भ में कम है, यह वास्तव bossमें क्रिया उदाहरण में सिर्फ एक बार के विपरीत 3 बार मूल्यांकन कर रहा है । यह सिर्फ एक और कारण है कि सिर्फ छोटे होने के लिए छोटा कोड एक बुरा विचार है। मुझे लगता है कि संक्षिप्तता प्राथमिक उद्देश्य के लिए दूसरी होनी चाहिए, चाहे वह पठनीयता / स्थिरता (जटिल कोड के लिए) हो या प्रदर्शन (आंतरिक छोरों के महत्वपूर्ण वर्गों के लिए, आदि)। दूसरे शब्दों में, कभी भी पूर्णता के लिए शुद्ध रूप से अनुकूलन न करें - जब तक कि आप एक 1 जीबी कनेक्शन पर अपना कोड भेजने की योजना नहीं बनाते हैं;)
user193130

16

जबकि दोनों अच्छे लक्ष्य हैं, मैं हमेशा एक साथ चुनने के लिए मजबूर होने पर पठनीयता के साथ हूँ ।

मैं तर्क दूंगा कि आपका उदाहरण पठनीयता और संक्षिप्तता दोनों में सुधार करता है । हालाँकि, विचार करें:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

विरोध के रूप में

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

उत्तरार्द्ध संक्षिप्त है, लेकिन इसके माध्यम से पढ़ना मुश्किल है। पूर्व क्रिया है, लेकिन तर्क का प्रवाह स्पष्ट है।

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


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

कोड नमूने समतुल्य नहीं हैं: पहला गायब है ?? whatever.something
जॉन बी। लाम्बे

11

मैं कहूंगा कि एक सामान्य नियम कभी भी सुगमता के कारण पठनीयता का त्याग नहीं करता है, लेकिन कभी भी किसी अन्य प्रोग्रामर पर आधारित पठनीयता का न्याय नहीं करते हैं जो उस विषय पर ज्ञान का अभाव है।

संकीर्णता और पठनीयता विरोध नहीं है। इस उत्तर की तरह, कभी-कभी छोटा अधिक पठनीय होता है।


4
दूसरे प्रोग्रामर के ज्ञान की कमी न मानने के लिए +1। दिए गए उदाहरण में, दूसरा विकल्प केवल कम पठनीय है यदि आप अशक्त सहवर्ती ऑपरेटर से परिचित नहीं हैं। मैं अपना कोड इस धारणा के आधार पर कभी नहीं लिखूंगा कि मेरे सहकर्मियों को भाषा सिंटैक्स पता नहीं है। यहां तक ​​कि अगर वे नहीं जानते कि ??इसका क्या मतलब है, अगर मैं इसका उपयोग करता हूं और फिर वे इसे सीखते हैं, तो हम दोनों को फायदा हुआ है। और ऐसा नहीं है कि msdn.com पर "?? ऑपरेटर" टाइप करना मुश्किल है
टिम गुडमैन

4

मैं कहूंगा कि मैं पठनीयता पसंद करता हूं, हालांकि कभी-कभी संक्षिप्त कोड का उपयोग करने का मतलब है। (यानी एक बड़े सशर्त ब्लॉक के अंदर अपेक्षाकृत सरल स्थिति के लिए त्रिगुट।)

मूल रूप से, यदि यह समझना अनावश्यक रूप से कठिन है, तो ऐसा न करें।


3

पठनीयता सबसे पहले आती है जहां यह संक्षिप्तता के साथ संघर्ष करता है, क्योंकि कोड को शुरू में लिखे जाने की तुलना में अधिक बार संशोधित किया जाता है। दूसरी ओर:

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

  2. पठनीयता का आकलन इस आधार पर किया जाना चाहिए कि कोड को किसी अनुभवी प्रोग्रामर के लिए पढ़ना कितना आसान है, जो भाषा और उसकी अनूठी / उन्नत विशेषताओं को अच्छी तरह से जानता है, न कि कुछ सक्षम सक्षम कोड बंदर को जो केवल सबसे कम सामान्य भाजक को जानता है।


2

एक पहलू जो मुझे नहीं लगता कि अभी तक उल्लेख किया गया है: आपके लक्ष्य क्या हैं ?

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

यदि आप एक शांत नई परियोजना पर काम करते समय आसानी से अपना कोड किसी और को सौंपने में सक्षम होना चाहते हैं, तो पठनीयता, स्पष्टता और बहुत सारी ठोस टिप्पणियों के लिए जाएं।

नोट: उपरोक्त आपके बारे में व्यक्तिगत रूप से नहीं है, @ डामोविसा; यह दोनों पदों में से किसी को चुनने के लिए है।


यह एक नौकरी की सुरक्षा की तरह लगता है, लेकिन अगर आप एक प्रोग्रामर बनना चाहते हैं, तो यह गलत कंपनी में नौकरी की सुरक्षा है ...;)
एलोइस महदाल

2

एक बात है कि वर्बोज़ संस्करण का एक फायदा है।

इसकी अधिक लाइनें हैं, और अधिकांश डीबगर रेखा-उन्मुख हैं ! एक अभिव्यक्ति के बीच में एक ब्रेक पॉइंट सेट करना बहुत कठिन है, लेकिन आमतौर पर इसे ब्लॉक स्टेटमेंट के अंदर सेट करने के लिए सामान्य रूप से सरल है।

दूसरे शब्दों में, आप अपने संपादक में देखना चाहेंगे कि कौन आपका डिबगर कब लात मारना चाहता है boss == null?

(यह कहा कि मैं ?? - ऑपरेटर की तरह)


0

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

उन्होंने कहा, संक्षिप्तता एक ऐसी चीज है जो पठनीयता में योगदान कर सकती है। उदाहरण के लिए, आपके प्रश्न में दूसरा स्निपेट अधिक पठनीय और अधिक संक्षिप्त है।

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