哪种编码风格更好?

12

在代码审查中,一位资深开发人员评论了我代码中的一些嵌套问题。他建议我设置一个bool值,以便我永远不会有超过一层的嵌套。我认为我的代码更容易阅读,但希望听听其他开发人员的意见。哪种风格更好?他对嵌套的反感是否合理?

以下是一些简化的代码示例。

嵌套:

If(condition1)
{
    If(condition2)
    {
        if(condition3)
        {
            return true;
        }
        else
        {
            log("condition3 failed");
        }
    else
    {
        log("condition2 failed")
    }
}
else
{
    log("condition1 failed")
}

return false;

或者

基于布尔值:

bool bRC = false;

bRC = (condition1);
if(brc)
{
    bRC = (condition2);
}
else
{
    log("condition1 failed");
    return false;
}

if(bRC)
{
    bRC = (condition3);
}
else
{
    log("condition2 failed");
    return false;
}

if(bRC)
{
    return true;
}
else
{
    log("condition3 failed");
    return false;
}

2
不要责怪你的高级开发人员;-) - JRoppert
我想我会选择选项2,因为使用选项1会导致编译错误。 - AndrewB
2
当您向高级开发人员展示此线程时,请报告他们的反应 :) - Peter Recore
好问题,讨论很多! - Charles Bretana
嵌套版本并不是很好看 - 但布尔版本更加可怕。 - Jonathan Leffler
14个回答

1
这是我的实现方式,前提是你的实现确实反映了所需的行为。
if (!condition1) {
    log("condition1 failed");
    return false;
}
if (!condition2) {
    log("condition2 failed");
    return false;
}
if (!condition3) {
    log("condition3 failed");
    return false;
}
return true;

然而,我认为更有可能的是每个失败的条件都应该被记录。

result = true;
if (!condition1) {
    log("condition1 failed");
    result = false;
}
if (!condition2) {
    log("condition2 failed");
    result = false;
}
if (!condition3) {
    log("condition3 failed");
    result = false;
}
return result;

1

我不喜欢这两种方式。当你有太多的嵌套时,就会出现问题。在表单验证或确实需要类似功能的情况下,请尝试找出更模块化或紧凑的解决方案。

一个例子是一个包含条件的数组,通过while迭代,并根据需要进行打印/中断。

由于实现取决于您的需求,因此创建示例代码是没有意义的。

作为经验法则,当您的代码看起来过于复杂时,它就很糟糕 :)。尝试重新思考它。遵循编码规范大多数情况下可以使代码变得更美观、更简短;显然,也更聪明。


0
if( condition1 && condition2 && condition3 )
    return true;

log(String.Format("{0} failed", !condition1 ? "condition1" : (!condition2 ? "condition2" : "condition3")));
return false;

这样,您就不必为了记录而查看许多代码行。如果您的所有条件都为真,则在必须记录时不浪费时间评估它们。


0

编码应该用所给的语言重新陈述问题。因此,我认为代码片段可以“更好”。这取决于被建模的问题。虽然我猜想这两个解决方案都不会完全符合实际问题。如果你把条件1、2、3换成真实术语,它可能会彻底改变“最佳”代码。
我怀疑有一种更好的(三维)方式将所有内容写在一起。


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