2016-01-21 88 views
0

我有以下代碼(示例代碼),它工作得很好。 我只是想,如果還有其他更好的方法,我們可以用更少的代碼更精確地編寫下面的代碼片段。更好的方式來寫if-else塊

if(language == "English") 
{ 
    if(Student_id == 0) 
    { 
     someFunction(); 
    } 
    else 
    { 
     if(getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0) 
     { 
      someFunction(); 
     } 
    } 
} 

而且,請注意,如果Student_id0getMarks(Student_id)拋出錯誤

+10

這是更適合[codereview.se]。 –

+1

是「someFunction();」兩行中都有相同的功能? – nvoigt

+0

@nvoigt是的,它是相同的功能 –

回答

11

(更多複雜的情況下,簽出this

我的建議對你的情況是:

  1. 用較少的嵌套編寫它if-else阻止

    • 一個辦法做到這一點是反轉的條件
    • 早日迴歸儘可能
  2. 再以同樣的動作相結合的條件(在你的情況是someFunction

  3. 要利用Short Circuit Evaluation這是實施登錄在C#(也在許多其他編程語言中實現 - 正如他的評論中的Martheen所述)。

    if(language != "English") 
        return; //assuming nothing below 
    
    if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0) 
        someFunction(); //if someFunction is identical, this can be done 
    

    如果您有其他語言進行檢查,或者如果你有什麼要根據language == "English"完成獨立於你的行動,但是,那麼你不應該在if (language != "English")語句返回:

    if(language == "English") { 
        if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0) 
         someFunction(); //if someFunction is identical, this can be done 
    } 
    //Something else which must be done 
    

編輯(問題被編輯後):

對於附加條件,你CA n簡單地把它放在Student_id == 0之後,因爲C#總是會首先評估最左邊的if條件(對於它的|| short circuit evaluation)。

舉例說明:對於你的情況,這是確定:

if(Student_id == 0 || getMarks(Student_id) > 50){ 
    //if Student_id == 0 is true, then getMarks(Student_id) wouldn't get evaluated 
} 

但這 OK:

if(getMarks(Student_id) > 50 || Student_id == 0){ 
    //if Student_id is 0, then getMarks(Student_id) would throw exception before Student_id == 0 is evaluated 
} 
+0

我的道歉!我錯過了代碼中的一個條件。請參閱我的編輯 –

+0

是的。如果減少嵌套,反轉if是一個好方法。 +1。 –

+0

@ user2946329啊,是的。我也喜歡那招。 :) – Ian

4

在可讀性方面,它有時幫助,讓您的條件可讀名稱:

var languageIsEnglish = language == "English"; 
var studentIdIsNotSet = Student_id == 0; 
var hasMoreThanOneSubject = subjectCount > 1; 
var hasProjects = projectCount > 0; 

if(languageIsEnglish && (studentIdIsNotSet || (hasMoreThanOneSubject || hasProjects))) 
{ 
    someFunction(); 
} 
2

這可能工作;

if(language == "English" && (Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)) 
{ 
    someFunction(); 
} 
+0

這裏,如果Student_id爲0,getMarks會拋出錯誤 –

+2

由於如果Student_id爲0,則不執行'getMarks(Student_id)',那麼其他條件將不會被評估。 – Irshad

1
if(language == "English") 
{ 
    if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0) 
    { 
     someFunction(); 
    } 
} 

你else塊不提供任何替代和實際上調用相同的功能。在這種情況下,不需要另一個塊。

0

如果沒有其他爲第1,如果我覺得你可以把它寫在這樣一行

if(language == "English" && (Student_id == 0 || (getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0))) 
    someFunction(); 

如果有別的,你可以做這樣的

if(language == "English") 
{ 
    if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0) 
     someFunction(); 
} 
else 
{ 
}