更干净的代码:重新考虑多个嵌套if语句

本文关键字:嵌套 if 语句 新考虑 代码 | 更新日期: 2023-09-27 18:22:48

我有这样的代码:

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#。。。

更干净的代码:重新考虑多个嵌套if语句

可能将每个布尔条件所需的功能封装到一个方法中,并使用该方法而不是指定条件1、条件2、条件3等。

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
}

由于您使用的是C#,@dseibert的思想可以进一步扩展,并使用委托(在本例中为Func)使其变得灵活。您可以创建一个包含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);

现在,您只需要创建一个新方法并将其添加到列表中。

这种解决方案的缺点是,即使结果已经为false,也总是调用每个方法,但ForEach扩展方法中的代码可以进行优化。