更清洁的代码:重新计算多个嵌套的if语句

时间:2013-07-17 18:10:38

标签: c# if-statement refactoring

我的代码看起来像这样:

if(condition1)
{
  //do some stuff
  if(condition2)
  {
   //do some other stuff
   if(condition3)
   {
       //do some more stuff
       if(condition4)
       { 
       //you probably got the point by now...
       }
   }
}

我想重新考虑一下看起来更好,更容易理解的代码 到目前为止,我得到的最好的是:

do{    
    if(!condition1){break;}
    //do some stuff
    if(!condition2){break;}
    //do some other stuff
    if(!condition3){break;}
    //do some more stuff
    if(!condition4){break;}
    //you probably got the point by now...

}while(false);   

我的问题是:
我还有另一种更好的方法吗?

我不认为这是相关的,但我正在使用C#...

2 个答案:

答案 0 :(得分:2)

可能将每个布尔条件所需的功能封装到方法中,并使用该方法而不是指定condition1,condition2,condition3等。

private boolean isRed() {
//do some stuff
}

private boolean isBlue() {
//do some other stuff
}

private boolean isGreen() {
//do some more stuff
}

...

if(isRed() && isBlue() && isGreen()) {
//do some more stuff
}

答案 1 :(得分:1)

由于您使用的是C#,因此@dseibert的概念可以进一步扩展,并使用委托变得灵活,在本例中为Func。 您可以创建一个List来保存Func并根据需要添加带有签名 bool函数(void)的函数,然后评估结果所有这些都使用LINQ

可以使用的三个示例函数:

private bool isRed()
{
    System.Console.WriteLine("red");
    return true;
}

private bool isBlue()
{
    System.Console.WriteLine("blue");
    return false;
}

private bool isGreen()
{
    System.Console.WriteLine("green");
    return true;
}

列出保存Funcs,其中包含测试函数和初始化结果:

var actions = new List<Func<bool>>();
actions.Add(() => isRed());
actions.Add(() => isGreen());
actions.Add(() => isBlue());
var result = true; // initial value

立即评估所有功能:

actions.ForEach(a => result &= a());
System.Console.WriteLine(result);

现在您唯一需要做的就是创建一个新方法并将其添加到列表中。

此解决方案的缺点是即使结果已经为假,也始终会调用每个方法,但可以优化ForEach扩展方法中的代码。