2016-02-15 8 views
5

मैं हाल ही में काम पर एक आवेदन वास्तुकार पूछा एक php स्क्रिप्ट मैं कुछ काम मैं हमारे सहायता डेस्क विभाग में साप्ताहिक कर स्वचालित करने के लिए लिखा था की समीक्षा करें।ऐसा क्यों है पाश के लिए एक की हालत में एक समारोह कॉल करने के लिए बुरा है?

अपनी समीक्षा में वह

## Loops

Your loops are good, you didn't do anything bad like calling functions in the condition

for ($i=0; $i < count($array); $i++); is BAD

ईमानदारी से कहा गया है, मुझे लगता है कि इससे पहले कि लेकिन मेरे कोड में इसे बनाया करने के लिए परीक्षा की गई कभी नहीं किया है मुझे आश्चर्य है कि यह बुरा क्यों होगा।

मुझे लगता है, क्योंकि एक समारोह का परिणाम सब पर किसी भी मूल्य हो सकता है यह है और यह एक बढ़िया तरीका अनंत लूप और सिर्फ सामान्य कारण अनपेक्षित व्यवहार बनाने के लिए की तरह लगता है।

मैं googling की कोशिश की, लेकिन किसी भी प्रासंगिक परिणाम नहीं मिल सकता है तो मैं आप से पूछना:

ऐसा क्यों है पाश के लिए एक की हालत में एक समारोह कॉल करने के लिए बुरा है?

नोट टिप्पणी अपने आप में count($array), एक गिम्मी मेरे लिए, है। बेशक, आप बस इसे कैश करना चाहते हैं। अधिक विशेष रूप से, मेरा मतलब है कि अन्य जटिल कार्यों का उपयोग करने के संदर्भ में।

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

+0

कारण प्रत्येक लूप पुनरावृत्ति पर बार-बार बुलाया जाता है, नहीं? –

+0

मुझे यकीन नहीं है कि यह ऑफटॉप है और कोडरेव्यू पर बेहतर है। वैसे भी, इसका कारण यह है कि आप लूप के प्रत्येक पुनरावृत्ति पर फ़ंक्शन को कॉल करेंगे, अतिरिक्त ओवरहेड यह लाता है। बस लूप के बाहर गिनती() परिणाम संग्रहित करें और चर –

+0

का उपयोग करें, मेरी राय के लिए इसे टालने का एकमात्र कारण यह तथ्य है कि उदा। _count ($ array) _ को _for_ प्रदर्शन के हर बार मूल्यांकन किया जाना चाहिए, जबकि स्पष्ट रूप से इसका मूल्यांकन केवल लूप के बाहर किए जाने पर ही किया जाएगा। – hherger

उत्तर

4

के कई कारण मैं के बारे में सोच सकते हैं के एक जोड़े हैं:

  • एक समारोह के रिटर्न मान, भिन्न हो सकते हैं तो आप निश्चित नहीं हो सकते अपने पाश परिमित रहेगा
  • वापसी प्रकार में guarenteed नहीं है कुछ भाषाओं, ताकि आप अपरिभाषित व्यवहार के लिए एक और अवसर है
  • यह आमतौर पर कम performant है (विशेष रूप से count() उदाहरण में)
  • यह पठनीयता कम कर देता है, एक डेवलपर अब की समीक्षा करने और समारोह को समझने के लिए सिर्फ इतना पता करने की जरूरत है क्योंकि कितनी बार पाश चलाना चाहिए
  • मैं का कारण है कि आप वास्तव में एक समारोह के रिटर्न मान की आवश्यकता होगी किसी भी वैध उदाहरण नहीं सोच सकते हैं, हर बार जब हालत
  • पुनरावृत्तियों की संख्या नहीं हो सकता मूल्यांकन किया जाता है (आसानी से) पर निर्धारित रन-टाइम, क्योंकि प्रत्येक पुनरावृत्ति के अंत में फ़ंक्शन को फिर से कॉल किया जाना चाहिए
+0

यह वह उत्तर है जिसे मैं ढूंढ रहा था, टिप्पणी में 'गिनती ($ सरणी)', मेरे लिए, एक चीज थी। मुझे और अधिक विशिष्ट होना चाहिए था, लेकिन मेरा मतलब था कि अन्य जटिल कार्य – DelightedD0D

+0

हाँ, मैंने पाया कि आपके प्रतिनिधि के आधार पर। मैं और उदाहरण खोजने की कोशिश करूंगा। – deed02392

+0

एक संभावित वैध उदाहरण: यदि आप सरणी में कुछ तत्व जोड़ते हैं। –

3

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

इस उदाहरण में, गिनती समारोह बहुत भारी नहीं है और अपने कार्यक्रम धीमी हो जाएगी नहीं नीचे (जब तक कि यह एक बड़ा सरणी है), लेकिन बड़ा कार्यों के साथ देखना।

+0

'गिनती' ओ (1) नहीं है? – a3f

+0

यह है। लेकिन अन्य कार्य नहीं हैं। –

+0

जोड़ा गया +1 लेकिन मुझे और अधिक विशिष्ट होना चाहिए – DelightedD0D

4
for ($i=0; $i < count($array); $i++); //is not efficient 

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

$count = count($array); 
for ($i= 0; $i < $count; $i++); //is much efficient 

क्योंकि इस कोड count समारोह एक बार निष्पादित करेंगे में। आपके पिछले कोड में count फ़ंक्शन कई बार निष्पादित करता है।

+0

जोड़ा गया +1 लेकिन मुझे अधिक विशिष्ट – DelightedD0D

+0

होना चाहिए था, आपको @ deed02392 से जवाब मिला। अधिक विशिष्ट की आवश्यकता है? –

+0

नहीं, क्षमा करें, मैं बस इतना कह रहा था कि आपका जवाब * मूल प्रश्न के लिए सही था * जिसे बाद में एहसास हुआ कि मुझे थोड़ा बेहतर शब्द की आवश्यकता है। ;) – DelightedD0D

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

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