2010-11-15 71 views
1

關於編碼標準,速度和效率,以下哪一項是針對這種情況的更好的編程實踐?最佳實踐:如果邏輯控制

function foo() { 
    if(bar) { return 0; } 
    if(baz) { return 0; } 
    if(qux) { return 0; } 
} 

function foo() { 
    if(bar || baz || qux) { return 0; } 
} 

我倚向第一,因爲只有一個條件必須進行評估,因此會更快,但具有多個return s是不好的......?

//編輯

我會申請這主要是PHP和JavaScript,可能是C++和Ruby的語言。

+0

如果你的方法返回'bar || baz || qux'是假的? – 2010-11-15 07:30:16

+0

@Mark - 它實際上來自一個更大的上下文,所以爲了簡潔起見我刪除了其他內容。謝謝你的提醒。 – Ben 2010-11-15 07:47:51

回答

5

現在幾乎所有的編程語言都是uses short-circuit evaluation for ||,這意味着這兩個例子在控制流程和性能方面是等價的。

確實應該避免多次返回,如果它們遍佈函數並返回不同的東西,因爲這會降低可讀性。在另一方面,這是相當標準,有檢測不可接受的條件早期輸出條件和停止執行流程:由於您使用的是邏輯或第二條件

function getFriendList() 
{ 
    if (! has_internet_connection()) return null; 
    if (! is_logged_in()) return null; 

    return server.getFriendList(); 
} 
3

關於你的第二個例子,在大多數語言中||short-circuiting因此只有必要的條件纔會被評估。例如,如果bar評估爲真,則將評估bazqux

知道這一點,我可能會選擇第二個例子。

+1

+1短路 – Ben 2010-11-15 07:26:27

1

在C#中,您可以使用第二個版本,因爲它在性能上相同,但看起來更好。如果bar爲真,則其他標誌不再檢查。

0

這完全取決於語言。許多語言會將評估短路,因此,如果bar爲真,另外兩種語言不進行評估,並且任何半象限的編譯器都會在這種情況下優化這些評估。在你提到的四種語言(C++,Ruby,PHP和Javascript)中,它們都進行短路評估。

而且,儘管「避免多重回報」的人羣會告訴你,這是而不是你應該遵循的規則就像一隻羊。這意味着要避免很難看到返回(或循環中斷)發生的情況。您的第一個解決方案不會比第二個解決方案受到更多的困擾。

不理解背後原因的盲目遵守教條應該是一種應受到痛苦折磨的違法行爲。

+0

我可能會在水上板上24/7然後......但感謝您的建議。 Rob的'return'變量解決了「難以看到回報」的情況,我假設? – Ben 2010-11-15 07:31:29

+0

是的,但我認爲自己沒有必要,因爲原來的代碼很好。 Rob的回答提出了另一個方面,那就是一條代碼路徑,它什麼都沒有返回,但我認爲這只是一個片段,你意識到這是一個壞主意(無論如何,這是編譯器/解釋器應該捕獲的東西)。因爲他對我來說看起來很亂,我其實更喜歡Rob的原始解決方案,但這只是個人喜好 - 它仍然有效。 – paxdiablo 2010-11-15 07:38:24

+0

好的,謝謝@pax(+1)和其他人。我將@Victor作爲一個很好的總結,也因爲他的代表人數少於80k。 :p – Ben 2010-11-15 07:43:54

2

後者但是:

function foo() 
{ 

    var result = 1; 

    if(bar || baz || quz) 
    { 
     result = 0; 
    } 

    return result; 
} 

與「返回」退出代碼不管三七二十一是不好的做法,使調試一場噩夢 - 特別是如果這是別人的代碼,您要調試!控制流應始終在函數的底部退出!

+0

+1用於編碼標準提示和返回變量 – Ben 2010-11-15 07:28:52

0

在第二種情況下,只有當它被檢查是必要的,所以我希望更好的編碼標準與第二個一起去。

0

後面的例子在編碼方面更好。在一個OR語句中,至多有一個條件是正確的,這個語句是正確的。因此,如果第一個條件成立,則不會考慮進一步的條件。速度或效率沒有損失。