2009-05-28 34 views
2

考慮:拼合條件的重構

if (something) { 
    // Code... 
} 

用的CodeRush安裝它建議這樣做:

if (!something) { 
    return; 
} 
// Code... 

可能有人解釋這是更好?肯定沒有什麼好處。

回答

7

孤立的,你已經提出 - 沒有任何好處。但是mark4o是正確的:它是嵌套少,這成爲如果你看看甚至很清楚,說4級嵌套:

public void foo() { 
    if (a) 
     if (b) 
      if (c) 
       if (d) 
        doSomething(); 
} 

public void foo() { 
    if (!a) 
     return; 
    if (!b) 
     return; 
    if (!c) 
     return; 
    if (!d) 
     return; 
    doSomething(); 
} 

早期回報這樣提高可讀性。

+5

在這種情況下,只要支持短路,我就會使用「如果a && b && c && d」。但是如果每個if語句裏面都是一個或兩個命令,那麼這是行不通的。 – Brian 2009-05-28 19:06:21

0

我不認爲CodeRush推薦它 - 而只是提供它作爲一個選項。

+0

按'推薦' - 它顯示爲一個選項是的。但是,我仍然不知道它的好處是什麼。 – Finglas 2009-05-28 18:59:05

5

在某些情況下,在方法開始時驗證所有輸入並且在出現任何不正確的情況下只需保留即可。您可以進行一系列單一級別的檢查,直到您確信您的輸入信息良好爲止,這些檢查會連續檢查越來越多的具體內容。該方法的其餘部分將更容易編寫,並且將傾向於具有更少的嵌套條件。

0

IMO,這取決於something!something是例外情況。如果something發生時存在大量代碼,則使用條件更有助於易讀性和潛在的嵌套減少。

2

它可以用來使代碼更易讀(通過更少的嵌套)。一個很好的例子見herehere關於優點的一個很好的討論。

那種模式通常用於替換:

void SomeMethod() 
{ 
    if (condition_1) 
    { 
     if (condition_2) 
     { 
      if (condition_3) 
      { 
       // code 
      } 
     } 
    } 
} 

有了:

void SomeMethod() 
{ 
    if (!condition_1) { return; } 
    if (!condition_2) { return; } 
    if (!condition_3) { return; } 

    // code 
} 

這是對眼睛容易得多。

0

嗯,看這樣說(我將使用PHP爲例):

您填寫表格並轉到此頁:validate.php

例子1:

<?php 

if (valid_data($_POST['username'])) { 

    if (valid_data($_POST['password'])) { 

     login(); 

    } else { 
     die(); 
    } 

} else { 
    die(); 
} 

?> 

VS

<?php 

if (!valid_data($_POST['username'])) { 
    die(); 
} 

if (!valid_data($_POST['password'])) { 
    die(); 
} 

login(); 

?> 

哪一個更好,更容易維護?請記住,這只是驗證兩件事情。想象一下這個註冊頁面或其他東西。

3

這是一個傳統的重構,意味着可維護性。請參閱:

http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html

有了一個條件,它不是一個大的提升。但是它遵循「快速失敗」的原則,當你有很多條件時,你真的開始注意到它的好處。如果你長大了「結構化編程」,它通常建議函數具有單一的退出點,它可能看起來不自然,但如果你曾經嘗試調試具有三個級別或更多嵌套條件的代碼,你會開始欣賞它。

0

我記得在一張大學工作的非常明顯地失去痕跡,因爲我曾與

if (!something) { 
    return; 
} 
// Code... 

格式了。我的講師認爲在一個函數中有多個出口點是不好的做法。我認爲這是堅果和20多年的計算機編程後,我仍然這樣做。爲了公平起見,他生活在一個通用語言爲C的時代,功能通常是頁面很長且充滿嵌套條件,這使得很難跟蹤發生的事情。

然而現在,簡單性就是王道:保持功能小巧並對它們進行評論是使事物易讀易維護的最佳方法。