जावास्क्रिप्ट में वृद्धि ("++") और गिरावट ("-") ऑपरेटरों से क्यों बचें?


357

Jslint टूल की युक्तियों में से एक है:

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

मैं जानता हूँ कि पीएचपी निर्माण करती है कि ऐसा $foo[$bar++]नहीं है आसानी से-एक करके त्रुटियों के साथ हो सकता है, लेकिन मैं एक से पाश को नियंत्रित करने के लिए एक बेहतर तरीका समझ नहीं सकता while( a < 10 ) do { /* foo */ a++; }या for (var i=0; i<10; i++) { /* foo */ }

क्या jslint उन्हें हाइलाइट कर रहा है क्योंकि कुछ ऐसी ही भाषाएं हैं जिनमें " ++" और " --" सिंटैक्स की कमी है या इसे अलग तरीके से संभालते हैं, या " ++" और " --" से बचने के लिए अन्य तर्क हैं कि मैं गायब हो सकता हूं?


59
इसलिए किसी को सरणी [++ इंडेक्स] के बजाय एरे [इंडेक्स = इंडेक्स + १] करना चाहिए (यदि पूर्व की अनुमति है तो भी!)। हू का क्या भार।
लॉरेंस Dol

34
मैंने क्रॉकफोर्ड इंडेक्स = इंडेक्स + १ नहीं देखा है। मैंने उसे इंडेक्स + = 1 करते देखा है। मुझे लगता है कि यह एक उचित विकल्प है। और यह अच्छा है जब आप स्ट्राइड को कुछ के अलावा बदलना चाहते हैं 1.
नोसरेडना

124
व्यक्तिगत रूप से मैं क्रॉकफोर्ड का बहुत बड़ा प्रशंसक नहीं हूं। वह ऐसी किसी भी चीज के बारे में सोचता है जिसने कभी भी उसके कोड में एक बुराई पैदा की हो।
पाओलो बरगिनिनो

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

40
++बग पैदा नहीं करता है। का उपयोग करते हुए ++"मुश्किल" तरीकों से कर सकते हैं , कीड़े के लिए नेतृत्व, खासकर अगर एक से अधिक व्यक्ति codebase बनाए रखने की है, लेकिन यह है कि ऑपरेटर के साथ एक समस्या नहीं है, यह प्रोग्रामर के साथ एक समस्या है। मैंने जेएस को विश्वविद्यालय में नहीं सीखा (क्योंकि यह अभी तक मौजूद नहीं था), लेकिन ऐसा क्या है? मैंने सी किया, जो ++पहले था , लेकिन यह भी एक "ऐसा क्या?" मैं एक विशिष्ट भाषा सीखने के लिए विश्वविद्यालय नहीं गया था, मैं अच्छी प्रोग्रामिंग प्रथाओं को सीखने गया था जिसे मैं किसी भी भाषा में लागू कर सकता हूं ।
nnnnnn

जवाबों:


408

मेरा विचार यह है कि हमेशा ++ और - एक पंक्ति में स्वयं का उपयोग करें, जैसे कि:

i++;
array[i] = foo;

के बजाय

array[++i] = foo;

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


3
हाँ, मैं भी यही करता हूँ। गलत हो जाना, और अन्य लोगों के लिए यह पता लगाना आसान है कि आप क्या कर रहे हैं।
नोसरेडना

65
ऐसा लगता है कि इस मुद्दे और मेरी उलझन के मूल में है। अकेले इस्तेमाल किया, मैं ++; क्रिस्टल स्पष्ट है। जिस मिनट में आप उस मूल अभिव्यक्ति के आसपास अन्य कोड जोड़ते हैं, पठनीयता और स्पष्टता का नुकसान होने लगता है।
आर्टलंग

2
सहमत हूं, लेकिन यह केवल जावास्क्रिप्ट से संबंधित नहीं है
तोबियस

5
आप यह नहीं कहते कि आप C या C ++ लिख रहे हैं या नहीं। संभवतः आपको C ++ में उपसर्ग वृद्धि इंक्रीमेंट का उपयोग करना चाहिए, यदि iवैरिएबल बाद में एक समग्र वर्ग बन जाता है, तो जिस स्थिति में आप अनावश्यक रूप से एक अस्थायी ऑब्जेक्ट बनाना चाहते हैं। मुझे लगता है कि पोस्टफ़िक्स ऑपरेटर अधिक सौंदर्यवादी रूप से सुखदायक है।
mc0e

2
मैं 1-लाइन संस्करण पसंद करता हूं। यह एक स्टैक ऑपरेशन की याद दिलाता है। पुश ऐरे [++ i] = foo, पॉप बार = एरे [i--] है। (लेकिन 0-आधारित सरणियों के साथ, सरणी [i ++] = फू और बार = सरणी [- i] अभी भी बेहतर दिखती है)। एक और बात, अगर किसी ने i ++ के बीच अतिरिक्त कोड जोड़ दिया तो मुझे इससे नफरत होगी; और सरणी [i] = फू ;;
फ्लोरियन एफ

257

मैं उस सलाह से स्पष्ट रूप से भ्रमित हूं। मेरे हिस्से में आश्चर्य होता है कि इसका अनुभव जावास्क्रिप्ट कोडर के साथ अनुभव (कथित या वास्तविक) की कमी के साथ अधिक है।

मैं देख सकता हूँ कि कैसे कुछ नमूना कोड पर किसी को सिर्फ "हैकिंग" करना एक ++ और - के साथ एक निर्दोष गलती कर सकता है, लेकिन मैं यह नहीं देखता कि एक अनुभवी पेशेवर उनसे क्यों बचेंगे।


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

14
@artlung शायद "ए आलसी और असावधान अनुभवहीन हैकर" के साथ ऐसा करने के लिए और अधिक शायद इस कोड के साथ गड़बड़ करेगा, और मैं उसे भ्रमित नहीं करना चाहता।
क्रिस कुडमोर जू

9
मैं आपके उत्तर से पूरी तरह असहमत हूं। मेरी राय में, 'क्या मैं इसका उपयोग करने के लिए पर्याप्त अनुभवी हूं?' - लेकिन 'स्पष्ट है या नहीं?' अगर एक लूप के अंदर, या अकेले, यह गंभीर है - हर कोई समझ जाएगा कि कोई नुकसान नहीं है। समस्या तब आती है जब ++विच ++ एक्स में अधिक जटिल अभिव्यक्ति में डाल दिया जाता है, x ++ से अलग होता है, इस प्रकार कुछ पढ़ने में आसान नहीं होता है। क्रॉकफोर्ड का विचार 'क्या मैं इसे कर सकता हूं?' यह 'मैं त्रुटियों से कैसे बच सकता हूं?'
आर्टोएले

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

1
मैं पूरी तरह सहमत हूँ। भाषा के हिस्से का उपयोग न करके खुद को क्यों विकलांग करें? मुझे पोस्ट और प्री-इन्क्रीमेंट और डीक्रीमेंट दोनों का उपयोग करने के अच्छे कारण मिलते हैं। मेरे लिए, इस तरह की एक पंक्ति स्पष्ट और संक्षिप्त है ... यदि (--imagesLoading === 0) प्रारंभ (); अगर आपको लगता है कि आपका कोड अस्पष्ट है, तो टिप्पणियों का उपयोग करें!
xtempore

69

चीजों को करने का C में एक इतिहास है जैसे:

while (*a++ = *b++);

एक स्ट्रिंग की नकल करने के लिए, शायद यह अत्यधिक प्रवंचना का स्रोत है जिसका वह उल्लेख कर रहा है।

और वहाँ हमेशा सवाल है क्या

++i = i++;

या

i = i++ + ++i;

वास्तव में करते हैं। इसे कुछ भाषाओं में परिभाषित किया गया है, और दूसरे में कोई गारंटी नहीं है कि क्या होगा।

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


104
i = i ++ + ++ i; मेरी आँखों को थोड़ा चोट लगी - :)
ह्यूगोवर

3
मेरा भि। भले ही वे सभी एक ही चर नहीं थे, कहते हैं कि मेरे पास x = a ++ + ++ b था; - वह संयोजन तुरन्त मेरे सिर में धारण करने के लिए x, a और b को कठिन बनाता है। अब, यदि प्रत्येक अलग-अलग लाइनों पर अलग-अलग कथन थे, जैसे कि - a ++; ++ ख; x = a + b; पहली नजर में समझना आसान होगा।
आर्टलुंग

10
काश, (a ++; b ++; x = a = b) समान मान नहीं है (a ++ + ++ b)।
थॉमस एल होलाडे

8
@ मार्स: x = a+++b-> x = (a++)+b-> x = a + b; a++। टोकन लेने वाला लालची होता है।
कैलम रोजर्स

14
अतिरिक्त नौकरी सुरक्षा के लिए, अपने अंतिम उदाहरण में रिक्त स्थान को हटा दें।
mc0e

48

यदि आप जावास्क्रिप्ट द गुड पार्ट्स पढ़ते हैं, तो आप देखेंगे कि क्रॉकफोर्ड का i ++ के लिए लूप में प्रतिस्थापन i + = 1 है (i = i + 1 नहीं)। यह बहुत साफ है और पठनीय है, और कुछ मुश्किल में मार्फ करने की संभावना कम है।

क्रॉकफोर्ड ने स्वसंरचना और ऑटोडेसेरेमेंट को jsLint में एक विकल्प के रूप में अस्वीकार कर दिया। आप चुनते हैं कि सलाह का पालन करना है या नहीं।

मेरा अपना निजी नियम है कि ऑटोनक्रिमेंट या ऑटोडेसेरेमेंट के साथ संयुक्त कुछ भी न करें।

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

तो, मेरे अपने नियमों के लिए, लूप के लिए वेतन वृद्धि के रूप में i ++ का उपयोग ठीक है।


"प्लसप्लस" विकल्प के बारे में उत्कृष्ट बिंदु सिर्फ एक विकल्प है। आपके और अन्य उत्तरों के आधार पर, मुझे लगता है कि मुझे यह समझ आ रही है कि ++ स्वयं या फॉर-लूप में और स्वयं भ्रमित नहीं हैं। दूसरा आप उस ++ को एक और कथन में जोड़ते हैं, जिसे आप r कथन के संदर्भ में पढ़ना और समझना अधिक कठिन हो जाता है।
आर्टलुंग

6
हर कोई बफर ओवरफ्लो हो जाता है। यहां तक ​​कि ओपनएसएसएच उनके खुले स्रोत और संशोधन के कई कॉमेडीज़ के साथ
एरिक

11
@ ईरिक ने आपकी पांच साल पुरानी टिप्पणी पर फिर से विचार किया: ओह, आप कितने सही थे!
वचर्जिन

27

एक लूप में यह हानिरहित है, लेकिन एक असाइनमेंट स्टेटमेंट में यह अप्रत्याशित परिणाम दे सकता है:

var x = 5;
var y = x++; // y is now 5 and x is 6
var z = ++x; // z is now 7 and x is 7

चर और ऑपरेटर के बीच व्हाट्सएप अप्रत्याशित परिणाम भी दे सकता है:

a = b = c = 1; a ++ ; b -- ; c; console.log('a:', a, 'b:', b, 'c:', c)

एक बंद में, अप्रत्याशित परिणाम एक मुद्दा हो सकता है:

var foobar = function(i){var count = count || i; return function(){return count++;}}

baz = foobar(1);
baz(); //1
baz(); //2


var alphabeta = function(i){var count = count || i; return function(){return ++count;}}

omega = alphabeta(1);
omega(); //2
omega(); //3

और यह एक नई सीमा के बाद स्वचालित अर्धविराम प्रविष्टि को ट्रिगर करता है:

var foo = 1, bar = 2, baz = 3, alpha = 4, beta = 5, delta = alpha
++beta; //delta is 4, alpha is 4, beta is 6

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

संदर्भ


13
यदि आप ऑपरेटर को समझते हैं तो वे "अप्रत्याशित" नहीं हैं। यह कभी उपयोग नहीं कर की तरह है ==क्योंकि आप के बीच का अंतर समझ में नहीं आता ==और ===
greg84

1
बिल्कुल सही। वहाँ एक # सवाल है जो गलत धारणाओं पर बहस करता है।
पॉल स्वेट्टे

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

आपका व्हॉट्सएप लिंक टूटा हुआ लग रहा है।
रुस्लान

आपके "व्हाट्सएप" उदाहरण के बारे में क्या मुश्किल है? मैं का एक सीधा उत्पादन मिलता है a: 2 b: 0 c: 1। मुझे पहले उदाहरण ("असाइनमेंट स्टेटमेंट") में कुछ भी अजीब या अप्रत्याशित नहीं दिख रहा है।
केन विलियम्स

17

निम्नलिखित कोड पर विचार करें

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[i++] = i++;
    a[i++] = i++;
    a[i++] = i++;

चूँकि i ++ का दो बार मूल्यांकन किया जाता है, इसलिए (vs2005 डिबगर से)

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

अब निम्नलिखित कोड पर विचार करें:

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = ++i;
    a[++i] = ++i;
    a[++i] = ++i;

ध्यान दें कि आउटपुट समान है। अब आप सोच सकते हैं कि ++ i और i ++ समान हैं। वो नहीं हैं

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

अंत में इस कोड पर विचार करें

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = i++;
    a[++i] = i++;
    a[++i] = i++;

उत्पादन अब है:

    [0] 0   int
    [1] 1   int
    [2] 0   int
    [3] 3   int
    [4] 0   int
    [5] 5   int

इसलिए वे समान नहीं हैं, दोनों परिणाम बहुत सहज व्यवहार नहीं है। मुझे लगता है कि लूप के लिए ++ के साथ ठीक है, लेकिन जब आप एक ही लाइन या एक ही निर्देश पर कई ++ प्रतीक रखते हैं, तो बाहर देखें


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

28
मैं पहले उदाहरण के बाद रुक गया। आपने कहा "निम्नलिखित कोड पर विचार करें"। नहीं, कोई भी उस कोड को नहीं लिखता है। यह बेवकूफ है जो लिखता है कि कौन त्रुटिपूर्ण है, भाषा निर्माण नहीं।
सैम हैरवेल

4
आपने दिखाया है कि कोड के दो अलग-अलग टुकड़े अलग-अलग आउटपुट उत्पन्न करते हैं और यह साबित करता है कि यह खराब है?
निकफ

7
निष्कर्ष यह है कि "जब आप एक ही पंक्ति या एक ही निर्देश पर एक से अधिक ++ प्रतीक रखते हैं तो देखें"। मुझे नहीं लगता कि आपने इसे पढ़ा है
एरिक

1
"चूंकि i ++ दो बार मूल्यांकन किया जाता है" - गलत! अनुक्रम बिंदुओं के बीच दो बार एक चर को संशोधित करना और इसका उपयोग करना C ++ में अमान्य है और अपरिभाषित व्यवहार की ओर जाता है। इसलिए कंपाइलर जो चाहे कर सकता है। यहाँ प्रस्तुत परिणाम संकलक कार्यान्वयन के आकस्मिक हैं।
छबील

16

"पूर्व" और "पद" वेतन वृद्धि और वेतन वृद्धि ऑपरेटरों की प्रकृति उन लोगों के लिए भ्रमित हो सकती है जो उनसे परिचित नहीं हैं; यह एक तरीका है जिसमें वे मुश्किल हो सकते हैं।


29
माना; हालांकि, एक अनुभवी पेशेवर को भ्रमित नहीं होना चाहिए।
रात्रि

1
मुझे लगता है कि यह सब कुछ स्थिर या वैश्विक बनाने से बचने के लिए मार्गदर्शन के समान है। प्रोग्रामिंग कंस्ट्रक्शन के रूप में इसके साथ कुछ भी गलत नहीं है, लेकिन अनभिज्ञ अति प्रयोग से खराब कोड हो सकता है।
जोएल मार्टिनेज

6
सवाल यह नहीं है कि क्या एक अच्छा प्रोग्रामर तर्क के माध्यम से "अपने तरीके से काम कर सकता है" - अच्छा कोड आदर्श रूप से समझने के लिए किसी भी कार्य की आवश्यकता नहीं है। मुझे लगता है कि McWafflestix की बात सिर्फ इतनी है कि आपको यह कोड नहीं लिखना चाहिए कि संक्षिप्त निरीक्षण के दौरान दो सप्ताह या दो साल में बग को जोड़ा जा सकता है। मुझे पता है कि मैं एक रूटीन में कोड जोड़ने का दोषी हूं जिसे मैं पूरी तरह से समझ नहीं पाया :)
माइक

1
@ माइक: हाँ, ध्यान दें कि मैंने यह कैसे निर्दिष्ट नहीं किया कि ऑपरेटर कोड के मूल लेखक के लिए मुश्किल हो सकते हैं या बाद के रखवाले के लिए। आम तौर पर, हम यह मानने की कोशिश करते हैं कि मूल कोडर उन निर्माणों का उपयोग नहीं करते हैं जिनसे वे परिचित / सहज नहीं हैं (दुख की बात है, यह अक्सर एक गलत धारणा है); हालाँकि, वह परिचितता निश्चित रूप से अनुरक्षकों तक नहीं फैलती है (और, जैसा कि ऊपर उल्लेख किया गया है, शायद यह संज्ञा लेखक भी नहीं बढ़ा सकता है)।
पॉल सोनियर

मैं पढ़ने के लिए अन्य प्रोग्रामर के लिए अपना कोड लिखने की कोशिश करता हूं, लेकिन मैं इसे शुरुआती लोगों के लिए लिखने की कोशिश नहीं करता
ल्यूक एच

16

मेरे विचार में, "स्पष्ट हमेशा निहित से बेहतर होता है।" क्योंकि कुछ बिंदु पर, आप इस वेतन वृद्धि के बयान से भ्रमित हो सकते हैं y+ = x++ + ++y। एक अच्छा प्रोग्रामर हमेशा अपने कोड को अधिक पठनीय बनाता है।


1
X ++ या ++ y में कुछ भी निहित नहीं है।
फ्लोरिअन एफ

1
यह पठनीय कोड बात मुश्किल है ... मुझे लगता है कि एक आधार रेखा है कि आपका कोड कितना सरल होना चाहिए, और हम -स एक समुदाय- को थोड़ा रोमांचित करना चाहिए और वह पढ़ने में सक्षम होना चाहिए जो अब पढ़ने योग्य नहीं है, जैसे कि वन-लाइनर्स नेस्टेड टर्नरीज़ के साथ, जैसा कि अधिक चीजों को किक करने की अनुमति देने के लिए।
हमजा औगाध

14

++ या - से बचने के लिए सबसे महत्वपूर्ण तर्क यह है कि ऑपरेटर एक ही समय में मान लौटाते हैं और दुष्प्रभाव पैदा करते हैं, जिससे कोड के बारे में तर्क करना कठिन हो जाता है।

दक्षता के लिए, मैं पसंद करता हूं:

  • ++ मैं जब उपयोग नहीं कर रहा हूँ रिटर्न मान है (कोई अस्थायी नहीं)
  • i ++ रिटर्न वैल्यू का उपयोग करते समय (कोई पाइपलाइन स्टाल नहीं)

मैं मिस्टर क्रॉकफोर्ड का प्रशंसक हूं, लेकिन इस मामले में मुझे असहमत होना पड़ेगा। यकीनन और स्पष्ट रूप ++iसे पार्स करने के लिए 25% कम पाठ है ।i+=1


13

मैं इस पर डगलस क्रॉकफोर्ड का वीडियो देख रहा हूं और वेतन वृद्धि का उपयोग नहीं करने के लिए उनका स्पष्टीकरण यही है

  1. इसका उपयोग अन्य भाषाओं में अतीत में सरणियों की सीमा को तोड़ने और खराब होने के सभी शिष्टाचार और कारण के लिए किया जाता है
  2. यह अधिक भ्रमित और अनुभवहीन जेएस डेवलपर्स नहीं जानता कि यह क्या करता है।

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

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

+++ ++ b जैसी अभिव्यक्तियाँ, यदि आपको ऊपर याद है तो काम करना सरल है।

var a = 1, b = 1, c;
c = a ++ + ++ b;
// c = 1 + 2 = 3; 
// a = 2 (equals two after the expression is finished);
// b = 2;

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

Btw, मुझे लगता है कि डगलस क्रॉकफोर्ड वैसे भी एक किंवदंती है, लेकिन मुझे लगता है कि वह एक ऑपरेटर के लिए बहुत डराने का कारण है जो इसके लायक है।

मैं गलत साबित होने के लिए जी रहा हूं ...


10

एक और उदाहरण, बढ़े हुए मूल्य की साधारण वापसी के साथ कुछ दूसरों की तुलना में अधिक सरल:

function testIncrement1(x) {
    return x++;
}

function testIncrement2(x) {
    return ++x;
}

function testIncrement3(x) {
    return x += 1;
}

console.log(testIncrement1(0)); // 0
console.log(testIncrement2(0)); // 1
console.log(testIncrement3(0)); // 1

जैसा कि आप देख सकते हैं, रिटर्न स्टेटमेंट में कोई पोस्ट-इन्क्रीमेंट / डिक्रीमेंट का उपयोग नहीं किया जाना चाहिए, यदि आप चाहते हैं कि यह ऑपरेटर परिणाम को प्रभावित करे। लेकिन रिटर्न पोस्ट-इन्क्रीमेंट / डेक्रिमेंट ऑपरेटरों को "कैच" नहीं करता है:

function closureIncrementTest() {
    var x = 0;

    function postIncrementX() {
        return x++;
    }

    var y = postIncrementX();

    console.log(x); // 1
}

आपके एक फ़ंक्शन को केवल एक पैरामीटर के रूप में x प्राप्त होता है
Calimero100582

8

मुझे लगता है कि प्रोग्रामरों को उस भाषा में सक्षम होना चाहिए जो वे उपयोग कर रहे हैं; इसे स्पष्ट रूप से उपयोग करें; और इसे अच्छी तरह से उपयोग करें। मुझे नहीं लगता कि उन्हें जिस भाषा का उपयोग कर रहे हैं उसे कृत्रिम रूप से अपंग करना चाहिए। मैं अनुभव से बोलता हूं। मैंने एक बार एक कोबोल की दुकान के लिए सचमुच अगले दरवाजे पर काम किया था जहाँ उन्होंने ELSE का उपयोग नहीं किया था 'क्योंकि यह बहुत जटिल था'। Reductio ad absurdam।


@downvoter आकर्षक। आपको नहीं लगता कि प्रोग्रामर्स को भाषा में सक्षम होना चाहिए? आपको लगता है कि उन्हें कृत्रिम रूप से भाषा को अपंग करना चाहिए ? यह किसका है? यहां कोई तीसरी पसंद नहीं।
लोर्ने का जुलूस

1
और उस COBOL उदाहरण के लिए एक उत्थान, मुझे और भी खुशी देता है कि COBOL ज्यादातर कोडिंग में आने से पहले ही मर गया
मार्क के कोवान

1
@MarkCowan मैं क्यों नहीं देख रहा हूँ। मेरी बात मनमाने प्रतिबंध के बारे में है, भाषा के बारे में नहीं। उपाख्यान कोबोल के साथ कुछ भी गलत नहीं दर्शाता है। मरने की जरूरत क्या है कि प्रोग्रामिंग की दुकान थी, और यह किया। किसी भी बड़े बैंक के प्रवेश द्वार पर जाएं और आप पाएंगे कि कोबोल जीवित और अच्छी तरह से है।
लोर्न

2

जैसा कि कुछ मौजूदा उत्तरों में उल्लेख किया गया है (जो कि मैं टिप्पणी करने में असमर्थ हूं), समस्या यह है कि x ++ ++ x विभिन्न मूल्यों (वेतन वृद्धि के बाद बनाम) से पहले मूल्यांकन करता है, जो स्पष्ट नहीं है और बहुत भ्रमित हो सकता है - अगर उस मूल्य का उपयोग किया जाता है। cdmckay वेतन वृद्धि ऑपरेटर के उपयोग की अनुमति देने के लिए काफी समझदारी से सुझाव देता है, लेकिन केवल इस तरह से कि लौटे मूल्य का उपयोग नहीं किया जाता है, उदाहरण के लिए अपनी लाइन पर। मैं एक लूप के लिए मानक उपयोग को भी शामिल करूंगा (लेकिन केवल तीसरे विवरण में, जिसका रिटर्न वैल्यू उपयोग नहीं किया गया है)। मैं दूसरे उदाहरण के बारे में नहीं सोच सकता। अपने आप को "जला" दिया गया है, मैं अन्य भाषाओं के लिए भी यही दिशानिर्देश सुझाऊंगा।

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


1
उत्तर के लिए धन्यवाद। टिप्पणी करने के लिए आपको 50 या उससे अधिक के मान की आवश्यकता होगी। देखें: stackoverflow.com/faq
artlung

1
@ कार्टलंग: मैं इसके बारे में, और इसके पीछे के तर्क से अवगत हूँ। मैं सिर्फ यह कह रहा था कि यह कष्टप्रद है :)
प्रिवमैन के पास

2

मेरे अनुभव में, ++ i या i ++ ने ऑपरेटर के काम करने के तरीके के बारे में जानने के अलावा कभी भ्रम पैदा नहीं किया। यह छोरों के लिए सबसे बुनियादी के लिए आवश्यक है और जबकि किसी भी हाईस्कूल या कॉलेज के पाठ्यक्रम द्वारा उन भाषाओं में पढ़ाया जाता है जहां आप ऑपरेटर का उपयोग कर सकते हैं। मैं व्यक्तिगत रूप से कुछ ऐसा कर रहा हूँ जो देखने के लिए नीचे है और पढ़ने से बेहतर है कि ++ एक अलग लाइन पर होना।

while ( a < 10 ){
    array[a++] = val
}

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

इसके अलावा, क्रॉकफोर्ड को i- = 1 का उपयोग करना प्रतीत होता है, जो मुझे पढ़ने में कठिन लगता है - I या i--


2

मेरा 2cents यह है कि उन्हें दो मामलों में टाला जाना चाहिए:

1) जब आपके पास एक चर है जिसे कई पंक्तियों में उपयोग किया जाता है और आप इसे पहले कथन पर बढ़ाते हैं / घटाते हैं (इसका उपयोग करता है (या अंतिम, या, और भी बदतर, बीच में):

// It's Java, but applies to Js too
vi = list.get ( ++i );
vi1 = list.get ( i + 1 )
out.println ( "Processing values: " + vi + ", " + vi1 )
if ( i < list.size () - 1 ) ...

इस तरह के उदाहरणों में, आप आसानी से याद कर सकते हैं कि वैरिएबल ऑटो-इन्क्रीमेंटेड / डीक्रिनेटेड है या पहले स्टेटमेंट को हटा भी सकता है। दूसरे शब्दों में, इसका उपयोग केवल बहुत छोटे खंडों में या जहाँ चर एक-दो करीबी कथनों में खंड में दिखाई देता है।

2) एकाधिक ++ के मामले में और - एक ही कथन में एक ही चर के बारे में। यह याद रखना बहुत मुश्किल है कि इस तरह के मामलों में क्या होता है:

result = ( ++x - --x ) * x++;

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


1

क्या फोरट्रान एक सी-जैसी भाषा है? इसका न तो ++ है और न ही -। यहाँ आप एक लूप कैसे लिखते हैं :

     integer i, n, sum

      sum = 0
      do 10 i = 1, n
         sum = sum + i
         write(*,*) 'i =', i
         write(*,*) 'sum =', sum
  10  continue

सूचकांक तत्व I को हर बार लूप के माध्यम से भाषा के नियमों द्वारा बढ़ाया जाता है। यदि आप 1 के अलावा किसी अन्य चीज़ से बढ़ाना चाहते हैं, तो उदाहरण के लिए दो से पीछे की ओर गिनें, वाक्यविन्यास है ...

      integer i

      do 20 i = 10, 1, -2
         write(*,*) 'i =', i
  20  continue

क्या पायथन सी-लाइक है? यह एक सूचकांक को बढ़ाने की आवश्यकता को दरकिनार करने के लिए सीमा और सूची समझ और अन्य वाक्यविन्यास का उपयोग करता है :

print range(10,1,-2) # prints [10,8.6.4.2]
[x*x for x in range(1,10)] # returns [1,4,9,16 ... ]

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

क्या फोरट्रान और पायथन प्रक्रियात्मक भाषाओं की तुलना में एक बग चुंबक से काफी कम हैं जो ++ और - हैं? मेरे पास कोई सबूत नहीं है।

मेरा दावा है कि फोरट्रान और पायथन सी-लाइक हैं क्योंकि मैं सी में किसी ऐसे व्यक्ति से कभी नहीं मिला, जो 90% सटीकता के साथ अनुमान नहीं लगा सका कि गैर-बाधित फोर्ट्रान या पायथन का इरादा सही है।


1
हां, इफोर्ट्रान 1950 के दशक का है, जबकि सी 1970 का है, इसलिए हो सकता है कि फोरट्रान सी-लाइक न हो। प्लसटन ऑपरेटर की तरह पायथन में कुछ कमी का उदाहरण दिलचस्प है। पायथन में डेटा संरचनाओं पर ध्यान केंद्रित करना अधिक स्पष्ट रूप से नियंत्रित किया जाता है, पायथन को "भिन्न रूप से" ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट किया जा रहा है। शायद क्रॉकफोर्ड की सलाह पुनरावृत्ति के लिए अधिक ओओ-जैसे सिंटैक्स का उपयोग करने के बारे में है।
आर्टलुंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.