嵌套if条件语句和多个分离的if条件语句带有每个条件语句的返回语句,哪一个更好?

6
以下两个函数中哪一个是最专业的代码样式?
如果函数变得更加复杂和庞大,例如需要进行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;
}

2
肯定是第二个。第一个嵌套太多了。 - Sweeper
我认为第一个更好,因为它是可扩展的。第二个很好,直到你需要检查vehicle.isMinivan,然后就需要进行重大重构了。 - Theodor Zoulias
“做一些事情”是什么意思?这个方法是在验证车辆还是修改它?如果两者都有,那就有点混淆了。但是对此的回答可能会指示如何简化代码。 - Scott Hannen
2个回答

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

使用使代码更易读和理解的方式。对于只有两个条件的情况,第一种方式更加合乎逻辑且易读。但如果有5或6个由&&、||和!连接的条件,则情况可能不再如此。

因此,当检查的数量为5个或更多时,您应该优先考虑第二种替代方案

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


1
第二个例子在阅读代码时需要较少的认知负荷。
在第一个例子中,您需要保持程序状态的“堆栈”在心理上。在第二个例子中,您只需要记住一些已知为真的事情的列表。
第二个例子也不太可能被放置不当的大括号所混淆;实际上,在这个例子中它根本不需要任何大括号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接