2016-02-15 39 views
5

我最近問了一位應用程序架構師在工作中查看我編寫的一個php腳本,用於自動執行我在幫助臺部門每週執行的一些任務。爲什麼在for循環的條件下調用函數是不好的?

在他的評論中他說

## 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

老實說,我從來沒有試着做,在我的代碼之前,但它使我想知道爲什麼它會壞。

我認爲這是因爲,函數的結果可能是任何值,它似乎是一個創建無限循環的完美方式,並且通常會導致意外的行爲。

我試着用搜索引擎,但讓我問找不到任何相關的結果:

爲什麼這樣做不好調用函數中的for循環的條件?

注意在評論本身count($array)是,對我來說,一個給我。當然,你只想緩存它。更具體地說,我的意思是在使用其他更復雜的功能的情況下。

對於那些一定會懷疑「爲什麼不問它是誰寫的傢伙」,他是超級忙碌,已經花時間來幫助我,我不希望推動與太遠「現在,你能向我解釋你的所有意見嗎?「

+0

原因函數在每次循環迭代時都會被重複調用,否? –

+0

我不確定這是否是代碼審查中的偏見和更好的。無論如何,因爲你會在循環的每一次迭代中調用函數,並帶來額外的開銷。只需在循環外存儲count()結果並使用變量 –

+0

就我的觀點而言,避免它的唯一原因是,例如, _count($ array)_必須在每次執行_for_時進行評估,但如果在循環之外完成,顯然將僅評估一次。 – hherger

回答

4

有一對夫婦的我能​​想到的原因:

  • 函數的返回值可以改變,所以你無法確定你的循環仍將有限
  • 返回類型不保證的廣告有些語言,讓你有未定義行爲另一個機會
  • 通常會少一些高性能(特別是在count()例子)
  • 它降低了可讀性,因爲開發人員現在需要審查和理解功能只知道循環應該運行多少次
  • 我想不出任何合法的例子,爲什麼你實際上需要函數的返回值,每次條件評估時
  • 迭代次數不能(很容易)在因爲必須在每次迭代結束時再次調用該函數
+0

這是我正在尋找的答案,對於我來說,評論中的count($ array)'對我來說是一個給予。我應該是更具體的,但我的意思是使用其他更復雜的功能 – DelightedD0D

+0

是的,我想這是基於你的代表。我會試着找到更多的例子。 – deed02392

+0

一個可能的合法的例子:如果你在數組中添加一些元素。 –

3

最好事先計算一下值,因爲如果你把它放在循環中,函數會在每次迭代時執行以檢查條件是否被滿足。

在這個例子中,計數函數不是太重,不會減慢你的程序(除非它是一個大數組),但要注意更大的函數。

+0

不是'count' O(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

相關問題