【问题标题】:Nested if-conditions vs multiple separated if-conditions with return statement in each one嵌套的 if 条件与多个单独的 if 条件,每个条件都有 return 语句
【发布时间】:2019-10-14 19:22:57
【问题描述】:

以下两个函数中最专业的代码风格是什么?
如果函数变得更复杂和更大,比如有 20 个检查怎么办?
注意:每次检查后我都需要做一些事情,所以我不能在一个 if 语句中连接所有内容,例如:
if (vehicle.isBus) && (vehicle.numberOfWheels == 6) && (vehicle.motorVersion == 2019)

//first alternative
public bool validate(Vehicle vehicle)
{
    if(vehicle.isBus)
    {
        //do some stuff here related to vehicle.isBus
        if (vehicle.numberOfWheels == 6)
        {
            //do some stuff here related to vehicle.numberOfWheels
            if (vehicle.motorVersion == 2019)
            {
                //do some stuff here related to vehicle.motorVersion
                return true;
            }
        }
    }
    return false;
}

//second alternative
public bool validate(Vehicle vehicle)
{
    if (!vehicle.isBus)
    {
        return false;
    }
    //do some stuff here related to vehicle.isBus

    if (vehicle.numberOfWheels != 6)
    {
        return false;
    }
    //do some stuff here related to vehicle.numberOfWheels

    if (vehicle.motorVersion != 2019)
    {
        return false;
    }
    //do some stuff here related to vehicle.motorVersion

    return true;
}

【问题讨论】:

  • 绝对是第二个。第一个嵌套太多。
  • 我认为第一个更好,因为它是可扩展的。第二个很好,直到您还需要检查vehicle.isMinivan,然后需要进行重大重构。
  • 什么是“做一些事情?”该方法是验证车辆还是修改车辆?如果两者都做,那就有点混乱了。但这个问题的答案可能表明了如何简化代码。

标签: c# .net if-statement coding-style conditional-statements


【解决方案1】:

第二个示例在阅读代码时需要较少的认知开销。

在第一个示例中,您需要保留程序状态的心理“堆栈”。在第二个示例中,您只需要保留一份您已经知道是真实的事情的列表。

第二个例子也不太可能被错位的大括号混淆;事实上,在这个例子中它根本不需要任何大括号。

【讨论】:

    【解决方案2】:

    我遵循的一条黄金法则是尽可能避免嵌套。

    使用使代码更具可读性和可理解性的代码。仅针对两种情况,第一种方式更具逻辑性和可读性。与 &&、|| 链接的 5 或 6 个条件可能不再是这种情况。和!。

    因此,当检查次数超过 5 次时,您应该选择第二个替代方案。

    注意:多个 if 没有每个调用返回意味着 2 个或多个 if 可能为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2017-10-29
      相关资源
      最近更新 更多