2009-11-16 10 views
5

संबंधित प्रश्न: Benefits of using short-circuit evaluation, Why would a language NOT use Short-circuit evaluation?, Can someone explain this line of code please? (Logic & Assignment operators)शॉर्ट-सर्किट कोड का उपयोग क्यों करें?

वहाँ शॉर्ट सर्किट कोड का उपयोग कर एक भाषा के लाभों के बारे में सवाल कर रहे हैं, लेकिन मैं क्या एक प्रोग्रामर के लिए लाभ कर रहे हैं सोच रहा हूँ? क्या यह सिर्फ कोड को थोड़ा और संक्षिप्त बना सकता है? या प्रदर्शन कारण हैं?

मैं स्थितियों में, जहां दो संस्थाओं वैसे भी मूल्यांकन की आवश्यकता है उदाहरण के लिए, के बारे में पूछ नहीं कर रहा हूँ: मेरे लिए

if($user->auth() AND $model->valid()){ 
    $model->save(); 
} 

तर्क वहाँ स्पष्ट है - के बाद से दोनों सही होने की जरूरत है, आप और अधिक को छोड़ सकते हैं महंगा उपयोगकर्ता सत्यापन यदि उपयोगकर्ता डेटा को सहेज नहीं सकता है।

यह भी एक (मेरे लिए) स्पष्ट उद्देश्य होता है:

if(is_string($userid) AND strlen($userid) > 10){ 
    //do something 
}; 

क्योंकि यह एक गैर-स्ट्रिंग मान के साथ strlen() कॉल करने के लिए बुद्धिमान नहीं होगा।

जो मैं सोच रहा हूं वह शॉर्ट-सर्किट कोड का उपयोग है जब यह किसी अन्य कथन को प्रभावित नहीं करता है। उदाहरण के लिए, Zend आवेदन डिफ़ॉल्ट सूचकांक पेज से:

defined('APPLICATION_PATH') 
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

यह हो सकता था:

if(!defined('APPLICATION_PATH')) 
    define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

तो क्यों छोटी का उपयोग करें:

if(!defined('APPLICATION_PATH')){ 
    define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 
} 

या एक भी बयान के रूप में सर्किट कोड? नियंत्रण संरचनाओं के स्थान पर तर्क ऑपरेटरों का उपयोग करने के लिए 'कूलनेस' कारक के लिए? बयान अगर नेस्टेड को मजबूत करने के लिए? क्योंकि यह तेज़ है?

+0

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

+0

@ डेविड क्या यह स्क्रिप्टिंग भाषाओं के लिए भी सच होगा? –

+0

@ टिमलिटल व्याख्या की गई भाषाओं में आप अलग-अलग पार्सिंग और व्याख्या के कारण अलग-अलग व्यवहार कर सकते हैं। कोड के पास चलाने का अवसर होने से पहले कंपाइलर्स को ऐसा करने का लाभ होता है। –

उत्तर

4

प्रोग्रामर के लिए, एक और अधिक वर्बोज़ वाक्य रचना के ऊपर एक कम वर्बोज़ वाक्य रचना के लाभ हो सकता है:

  • कम टाइप करने के लिए है, इसलिए उच्च कोडिंग दक्षता
  • पढ़े जाने की कम, इसलिए बेहतर रख-रखाव।

अब मैं केवल इस बारे में बात कर रहा हूं कि कम वर्बोज़ सिंटैक्स किसी भी तरह से मुश्किल या चालाक नहीं है, बल्कि ऐसा करने का एक ही मान्यता प्राप्त तरीका है, लेकिन कम वर्णों में।

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

  • किसी फ़ंक्शन में पॉइंटर पास करने के बजाय जावा में अनाम आंतरिक कक्षाएं (कोड की अधिक लाइनें)।
  • रुबी में, || = ऑपरेटर, एक अभिव्यक्ति का मूल्यांकन करने के लिए और इसे असाइन करने के लिए असाइन करें यदि यह गलत या शून्य है। निश्चित रूप से, आप कोड की 3 पंक्तियों से एक ही चीज़ प्राप्त कर सकते हैं, लेकिन क्यों?
  • और कई और अधिक ...
0

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

+0

हां, यह उन उदाहरणों में से एक है जिन्हें मैंने स्पष्ट कारण बताया है। $ Model-> मान्य() उदाहरण देखें। –

+0

बिल्कुल। शॉर्ट-सर्किट मूल्यांकन का उपयोग करने के सभी कारण हैं जो आप उद्धृत करते हैं। – Poindexter

4

लोगों को भ्रमित करने के लिए इसका इस्तेमाल करें!

+0

या शायद कोड के साथ गड़बड़ करने से (आसानी से भ्रमित) रिफ-रैफ को रखने के लिए। – NVRAM

4

मैं PHP पता नहीं है और मैं शॉर्ट-सर्किट के बाहर इस्तेमाल कभी नहीं देखा है एक अगर या जब भाषाओं के सी परिवार में हालत है, लेकिन पर्ल में यह कहना बहुत मुहावरेदार है:

open my $filehandle, '<', 'filename' or die "Couldn't open file: $!"; 

एक इसे एक बयान में रखने का लाभ परिवर्तनीय घोषणा है। अन्यथा आपको कहना होगा:

my $filehandle; 
unless (open $filehandle, '<', 'filename') { 
    die "Couldn't open file: $!"; 
} 

दूसरे मामले का दावा करना मुश्किल है कि उस मामले में क्लीनर है। और यह अभी भी ऐसी भाषा में वर्डियर होगा जिसमें unless

+2

टाइप करने के लिए कम सामान प्रोग्रामर खुश बनाता है। – nos

2

मुझे लगता है कि आपका उदाहरण शीतलन कारक के लिए है। इस तरह कोड लिखने का कोई कारण नहीं है।

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

1

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

0

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

एक और बी और सी

इस सूत्र में दो शब्दों बाएं से दाएं मूल्यांकित कर रहे हैं।

यदि कोई और बी FALSE का मूल्यांकन करता है तो अगली अभिव्यक्ति और सी या तो गलत और गलत या गलत और गलत हो सकती है। दोनों FALSE का मूल्यांकन करते हैं इससे कोई फर्क नहीं पड़ता कि सी का मूल्य क्या है। इसलिए संकलक में संकलित प्रारूप में और सी शामिल नहीं है इसलिए कोड को छोटा सर्किट करना।

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

केस 1:

2

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

if (a != NULL) { 
    if (*a != 0) { 
    ⋮ 
    } 
} 

हालांकि, शॉर्ट सर्किट ऑपरेटर आपको अधिक दृढ़तापूर्वक यह लिखने की अनुमति: कुछ ज्ञान में

if (a != NULL && *a != 0) { 
    ⋮ 
} 

कि *a होगा नहीं का मूल्यांकन किया जाना चाहिए यदि aNULL है।

केस 2। आप कार्यों की एक श्रृंखला में से एक से लौटे एक गैर झूठी मूल्य के लिए एक चर सेट करना चाहते हैं, तो आप बस कर सकते हैं:

my $file = $user_filename || 
      find_file_in_user_path() || 
      find_file_in_system_path() || 
      $default_filename; 

यह $user_filename को $file का मूल्य निर्धारित करता है अगर यह मौजूद है, या का परिणाम find_file_in_user_path(), यदि यह सच है, या ... इतने पर। यह सी से अधिक पर्ल में शायद अधिक बार देखा जाता है, लेकिन मैंने इसे सी

पर उपयोग किए गए अन्य उदाहरण हैं, जिनमें ऊपर उल्लिखित उदाहरण शामिल हैं। लेकिन वे एक उपयोगी उपकरण हैं, और एक जिसे मैंने कम जटिल भाषाओं में प्रोग्रामिंग करते समय याद किया है। इस तरह से इसके बारे में

+0

यह 'कथन समेकित है अगर बयान' मुझे अतीत में देखकर याद नहीं आया या उदाहरण कोड सोचो। –

0

Think, यदि आप

if(A AND B) 

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

शॉर्ट सर्किट मूल्यांकन भी आपके कोड को एक और ब्रैकेट किए गए इंडेंटेशन को रोकने से अधिक पठनीय बनाता है और ब्रैकेट में जोड़ने की प्रवृत्ति होती है।

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