2016-01-21 74 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 
{ 
}