क्या मुझे बाइनरी ऑपरेटरों से पहले या बाद में नई सुर्खियों में लाना चाहिए? [बन्द है]


11

जब आप पायथन या जावास्क्रिप्ट में होते हैं, तो आपको हमेशा अपने कोड को समय से पहले समाप्त करने से रोकने के लिए द्विआधारी ऑपरेटरों को पिछली पंक्ति के अंत में रखना चाहिए ; यह आपको त्रुटियों को पकड़ने में मदद करता है।

लेकिन C या C ++ में, यह कोई समस्या नहीं है, इसलिए मैं सोच रहा हूँ:

क्या मेरे लिए पहले के दूसरे संस्करण को पसंद करने का कोई कारण है?

return lots_of_text
       + 1;

बनाम

return lots_of_text +
       1;

(उदाहरण के लिए, क्या उनमें से एक अन्य प्रकार की त्रुटियों को रोकने में मदद करता है? या उनमें से एक को अधिक पठनीय माना जाता है?)


नहीं, आपको पायथन में ऐसा नहीं करना चाहिए, ज्यादातर इसलिए क्योंकि आपके पास इसका दावा करने वाला प्रभाव नहीं है। एक अनुगामी ऑपरेटर एक लाइन निरंतरता का कारण नहीं बनता है; एक बैकस्लैश या अपवित्र कोष्ठक, कोष्ठक या ब्रेसिज़ करता है।

@ डायलेन: मैंने (बहुत सावधानी से) यह कभी नहीं कहा कि यह एक लाइन निरंतरता का कारण बनता है। मुझे पता है कि आपको अभी भी समूहीकरण वर्णों को घेरने की आवश्यकता है। मैंने कहा कि यह आपकी लाइन को समय से पहले खत्म करने के साथ गलतियों को रोकने में मदद करता है, जो यह करता है, आपको एक त्रुटि देता है।
user541686

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

@ डायलेन: यह वास्तव में अपने टेक्स्ट एडिटर के साथ गलती से इंडेंटेशन को पेंच करने के लिए बहुत आसान है, जैसे जब थोक-संपादन या आयताकार चयन करते हैं। और यदि / जब रखरखाव के दौरान ऐसा होता है, तो आपको पहले मामले में कोई त्रुटि नहीं मिलेगी और यह आपके द्वारा चुपचाप खिसक जाएगा, लेकिन आपको दूसरे मामले में एक अच्छी त्रुटि मिलेगी।
user541686

4
यकीन नहीं हो रहा था कि यह क्यों ठुकरा दिया गया। यह एक उचित कोडिंग शैली प्रश्न की तरह लगता है।
स्टुअर्ट मार्क्स

जवाबों:


18

जैसा कि आप उत्तरों से देख सकते हैं, इस मामले पर कोई आम सहमति नहीं है। जब तक आप किसी टीम में काम नहीं करते हैं, तब तक जो आप अधिक सहज होते हैं उसका उपयोग करें ।


मैं ऑपरेटरों से पहले एक नई पंक्ति सम्मिलित करना पसंद करता हूं

जब भी मुझे लाइनें तोड़नी होती हैं, मैं आमतौर पर एक लाइन पर एक ही "स्तर" के अधिकांश एक शब्द डालता हूं:

पायथन में न्यूटन के गुरुत्वाकर्षण का नियम:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

इसकी तुलना करें:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

मैं जानना चाहता हूं, कि मैं " दूरी चुकता करके विभाजित करता हूं" , मैं यह नहीं जानना चाहता कि "mass_2 विभाजित हो गया", क्योंकि यह नहीं है कि मैं गणितीय अभिव्यक्तियों के बारे में कैसे सोचता हूं।

इसके अलावा, मैं आमतौर पर पहले जानना चाहता हूं कि मैं क्या कर रहा हूं (ऑपरेटर), इससे पहले कि मैं इस बात की परवाह करता हूं कि मैं (ऑपरेंड) क्या करता हूं ।

या इस जटिल SQL कथन पर विचार करें:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

यह मुझे यह देखने की अनुमति देता है कि व्यक्तिगत परिस्थितियों को बहुत आसानी से कैसे जोड़ा जाता है, बस ऊपर से नीचे तक हर पंक्ति को पढ़ने के बिना स्केमिंग द्वारा ऑपरेटर को खोजने के लिए अंत तक विरोध करने के लिए:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

मैं पूर्व के बारे में " Xसत्य है" के बारे में सोचता हूं , फिर मैं यह कहकर संशोधन करता हूं: " और यह भी सत्य है" जो मुझे अन्य तरीकों की तुलना में अधिक स्वाभाविक लगता है । इसके अलावा, मुझे नेत्रहीन को पार्स करने का पहला आसान तरीका मिल गया है।

या एक PHP उदाहरण:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

फिर से, मैं सिर्फ पढ़ने के लिए संक्षिप्त रूप से स्किम पढ़ सकता हूं क्योंकि मैं केवल पाठ को संक्षिप्त कर रहा हूं, क्योंकि ज्यादातर बार मुझे लगता है कि मुझे वास्तव में परवाह नहीं है कि स्ट्रिंग्स / शर्तों के अंदर क्या है।

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


पहले उदाहरण के लिए लापता कोष्ठक जोड़ा गया।
केविन क्लाइन

1
+1: बिल्कुल सही; गणित हमेशा टाइपसेट होता है ताकि एक ऑपरेटर के साथ निरंतरता रेखाएं शुरू हो जाएं।
केविन क्लाइन

आपके द्वारा वर्णित समान कारणों के लिए +1, लेकिन आपका PHP उदाहरण मुझे काफी अजीब लगता है । क्या उन समारोहों को नहीं होना चाहिए ., नहीं .=?
इज़काता

@ इज़काता ओह हाँ, आप निश्चित रूप से सही हैं। धन्यवाद। केविन: कोष्ठक सही थे;) मैंने अभी उनके साथ गठबंधन किया हैforce
प्रेत

11

मैं लगभग हमेशा बाइनरी ऑपरेटरों से पहले लाइनों को तोड़ता हूं ताकि कोड के पाठकों को स्पष्ट किया जा सके कि यह एक अभिव्यक्ति की निरंतरता है न कि अगले बयान। यह महत्वपूर्ण है अगर अगले बयान सामान्य रूप से इंडेंट किया जाएगा। उदाहरण के लिए, एक पर विचार करता है, तो बयान एक जटिल सशर्त अभिव्यक्ति है:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

सशर्त अभिव्यक्ति का दूसरा भाग तत्कालीन भाग के पहले कथन से आसानी से भ्रमित हो जाता है। यह काफी भ्रामक हो सकता है यदि स्थिति का पहला भाग लंबा है और && दाईं ओर ऊपर की ओर समाप्त होता है। इस विकल्प के साथ तुलना करें:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

यह थोड़ा अजीब लगता है, लेकिन इससे यह स्पष्ट हो जाता है कि हालत का दूसरा हिस्सा एक बयान की शुरुआत नहीं है।

मैं दूसरों के संदर्भों में भी ऐसा करता हूं, लेकिन यदि कथन सबसे महत्वपूर्ण है, क्योंकि इंडेंटेशन अस्पष्ट है। बेशक, कोई इंडेंटेशन या ब्रेस प्लेसमेंट बदल सकता है, लेकिन यह भी अजीब लगता है।

tl; लाइन के बायें छोर को जल्दी से पढ़ने की समझ के लिए अधिक महत्वपूर्ण है, इसलिए ऑपरेटर को बाएं छोर पर रखना अधिक प्रमुख मार्कर है कि यह एक निरंतर अभिव्यक्ति है, न कि एक बयान।


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

"सशर्त अभिव्यक्ति का दूसरा भाग तत्कालीन भाग के पहले कथन से आसानी से भ्रमित हो जाता है।": यदि आप शुरुआत और अंत बनाने के लिए "{" और "}" लंबवत (एक ही कॉलम) को संरेखित करते हैं तो ऐसा नहीं होता है। ब्लॉक अधिक स्पष्ट रूप से बाहर खड़ा है।
जियोर्जियो

8

मैं हमेशा पहले का उपयोग करूँगा। आप चाहते हैं कि यह स्पष्ट हो कि आप उस 1 के साथ क्या कर रहे हैं। अगर मैंने देखा और उस 1 के ऊपर पाठ की एक दीवार थी, तो मुझे नहीं पता होगा कि उस 1 के उपयोग के रूप में क्या चल रहा था।

1 के बगल में '+' होने से यह स्पष्ट हो जाता है कि कम से कम मैं 1 प्रश्न के साथ कुछ कर रहा हूं, बजाय इसके कि "मैं आपके सभी कोड में हूँ ..." बिना किसी स्पष्ट कारण के।


दूसरा ...........
जेम्स

7

मुझे लगता है कि जब एक रेखा इंगित करती है कि बाइनरी ऑपरेटर अंत में बयान जारी रखता है, और इस तरह बयान अधूरा है, तो यह जबरदस्त ढंग से पढ़ने में मदद करता है। लापता अर्धविराम मेरे लिए तुरंत ऐसा समझने के लिए पर्याप्त नहीं है।

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

EDIT: जियोर्जियो टिप्पणियों में एक उत्कृष्ट बिंदु बनाता है: यह उपयोग गणित और प्राकृतिक भाषाओं दोनों में सामान्य विराम चिह्न को प्रतिध्वनित करता है। आप लिखेंगे

मैं डूबता हूं,
इसलिए मैं तैरता हूं

आप नहीं लिखेंगे

मैं डूबता हूं
, इसलिए मैं तैरता हूं


3
+1: मैं पंक्ति के अंत में + को पढ़ने के लिए एक अल्पविराम के रूप में दो आइटम्स को ऑपरेंड की सूची में अलग करता हूं। इस कारण से मैं एक पंक्ति के अंत में + रखना पसंद करता हूं क्योंकि मैं एक अल्पविराम के साथ करूँगा (मैं एक अल्पविराम के साथ एक पंक्ति शुरू नहीं करूँगा)।
जियोर्जियो

@Giorgio यह बिंदु इतना उत्कृष्ट है कि मैंने इसे अपने उत्तर के लिए चुरा लिया है। मैं आशा करता हूं कि तुम मुझे माफ़ कर दोगे।
कोनराड रुडोल्फ

आगे बढ़ो: मैं सम्मानित महसूस कर रहा हूं। ;-)
जियोर्जियो

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

3
गणितीय टाइपिंग में, लाइन ब्रेक हमेशा एक ऑपरेटर से पहले होता है, कभी नहीं। अभियोजन उदाहरण में, ऑपरेटर "इसलिए" है। अंग्रेजी गद्य में, कॉमा अनिवार्य रूप से सांस के निशान हैं।
केविन क्लाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.