2011-09-27 49 views
0

想象一下,對於一種方法來說,condintion應該是真的。哪個區塊代表最佳方法(與性能相關且可讀性),或者如果不是,您的建議是什麼?以下哪個代碼塊更符合邏輯?

private void method() 
{ 
    if(!condition) 
    { 
    MessageBox.Show("ERROR!"); 
    return; 
    }  
    else 
    { 
     //DO STUFF 
    } 
} 

OR

private void method() 
{ 
    if(condition) 
    { 
     //DO STUFF 
    }  
    else 
    { 
     MessageBox.Show("ERROR!"); 
     return; 
    } 
} 
+1

這個問題是更好地在這裏適用:http://codereview.stackexchange.com/ –

+2

有沒有你不拋出異常什麼特別的原因?看起來像這樣引發的錯誤,如「在錯誤消息」 – harold

+1

@harold上單擊確定後所有地獄崩潰,代碼位於頂層(UI),因此您不能向用戶建議拋出異常。 – hungryMind

回答

3

那麼,既不,因爲你不會使用b其他elsereturn

所以,你要麼做:

private void method() { 
    if (!condition) { 
    MessageBox.Show("ERROR!"); 
    } else { 
    //DO STUFF 
    } 
} 

或:

private void method() { 
    if (condition) { 
    //DO STUFF 
    } else { 
    MessageBox.Show("ERROR!"); 
    } 
} 

或:

private void method() { 
    if (!condition) { 
    MessageBox.Show("ERROR!"); 
    return 
    } 
    //DO STUFF 
} 

或:

private void method() { 
    if (condition) { 
    //DO STUFF 
    return; 
    } 
    MessageBox.Show("ERROR!"); 
} 

您使用哪種代碼主要取決於代碼的實際功能。代碼很少像例子中那樣簡單,所以它更重要的代碼將做什麼。

前兩個優點是具有單個退出點,這樣可以更容易地遵循代碼。您通常會先將較短的代碼放在第一位,因爲在較大的代碼塊後更易於發現,而不是else

第三個經常被用來與主代碼繼續之前,驗證輸入,你可以輕鬆擁有一個以上的驗證:

private void method() { 
    if (!condition) { 
    MessageBox.Show("ERROR!"); 
    return 
    } 
    if (!anotherCondition) { 
    MessageBox.Show("ANOTHER ERROR!"); 
    return 
    } 
    //DO STUFF 
} 

四是有用的,如果您有沒有幾個條件要放在同一if聲明:

private void method() { 
    if (condition) { 
    var data = GetSomeData(); 
    if (data.IsValid) { 
     var moreData = GetSomeMoreData(); 
     if (moreData.IsValid) { 
     //DO STUFF 
     return; 
     } 
    } 
    } 
    MessageBox.Show("ERROR!"); 
} 
+0

很好地列舉和清楚解釋! –

1

二!第二!

但是我確實承認如果「// DO STUFF」真的很長並且嵌套,有時會做第一個。

+0

理想情況下,doStuff()應該是另一種方法調用,如果我們遵循Bob Martin叔叔的Clean Code準則的函數 –

+1

是真的,但只有當它作爲一個工作單元纔有意義。 DavidHeffernan的解決方案同樣出色,但無論哪種情況,您都無法真正期望所有「// DO STUFF」每次都會被分解成新的方法。 – mlathe

12

都沒有。使用保護條款代替:

private void method() 
{ 
    if(!condition) 
    { 
     MessageBox.Show("ERROR!"); 
     return; 
    }  

    //inputs have been checked, proceed with normal execution 
} 

完成這樣你可以處理所有的異常行爲的前期,避免壓痕的正常執行路徑含量超標。

+0

我的答案與此不同,但您的是我在大部分代碼中實際使用的模式。 +1爲你思考它。 – David

+0

我更喜歡這種方式,所以我給+1。但值得注意的是,有些人堅持「每個職能應該有一個回報」。顯然這不是OP問題的一部分,所以再次只是需要注意的一點。 –

+0

@Kiley在例外和goto常見之前的日子裏,單次回訪非常受歡迎。時間已過。 –

0

我更喜歡「如果條件」的方法,而不是否定條件,但這只是個人偏好。

0

這取決於。

在大多數情況下,第二個版本。如果(!條件)塊中的代碼量只有幾行代碼,並且(條件)塊中的代碼是很多代碼,那麼我會將該答案顛倒過來。如果您不必滾動就可以看到「else」,那麼通過if語句更容易閱讀。

+0

如果條件塊中的代碼是很多代碼,它可能應該被重構並提取到另一個函數。 –

+0

我同意,如適用。我更喜歡做一件事情並且做得很好的小功能。但有些情況下不適用,在這種情況下,我仍然會回答我的答案。 – David

0

我更喜歡大衛提到的守衛條款,但在一般情況下,您應該首先將最常見的情況。它使得更容易遵循方法的流程。

0

這是一個比「邏輯」問題更多的風格問題。這兩種方法都有效,您將使用哪種方法通常取決於您作爲思考者/開發者的風格。

也就是說,一旦你開始使用這些樣式中的任何一種,它一般都是值得一致的。有了大型課堂,其中一些功能是第一種方式,第二種方式可能會導致後期的可維護性問題。

羅伯特·馬丁的Clean Code呈現上提出了職能有趣的一頁,無論您選擇何種方式,//做的東西的一部分應該是另一個函數調用

職能應該只做一件事

0

可讀性/標準明智。我會接受數字2.我不認爲有明顯的表現差異,但我不是一個低級別的人。

0

正如通常這是一個問題,要求以下答案:「它取決於」,我會通過兩個示例顯示。
如果不是條件 對於ASP。淨Web窗體驗證我看到很多時候這個代碼

protected void btSubmit_OnClick(object sender, EventArgs e) 
{ 
    Page.Valide(); 
    if (!Page.IsValid) 
    return; 
    var customer = new Customer(); 
    // init 20 properties of customer 
.... 
    var bo = new CustomerBO(); 
    bo.Save(customer); 
} 

還有就是另外一個更受歡迎:

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
        { 
        } 
     } 

if條件

public void UpdateCustomer(int customerId, string ...../*it might be a customer type also*/) 
{ 
    using (var ctx= CreateContext()) 
{ 
    var customer = ctx.Customers.FirstOrDefault(c=>c.CustomerId = customerId); 
    if (customer != null) 
    { 
      /*code update 20 properties */ 
    } 
} 
} 

我希望代碼明確:P