为什么一个空的 else-if 语句是坏样式,我应该如何重写它?

2022-08-31 13:33:02

自动对我的代码进行评分的程序正在为其他代码停靠我的“样式点”,如果该程序不执行任何代码。它说它可能会导致错误,但我认为它不可能。

我不确定如何更改它,以便它仍然有效,但不会违反规则。为什么做这种糟糕的形式?我认为我写它的任何其他方式都会让读者更难理解。它应该如何编写?

if (! seesWater(LEFT))
{
    turn(LEFT);
}
else if (! seesWater(AHEAD));
else if (! seesWater(RIGHT))
{
    turn(RIGHT);
}
else
{
    turn180();
}

else-if 存在但什么都不做的原因是因为我希望代码起作用的优先级:

if (! seesWater(AHEAD)),那么我根本不希望其余的条件运行,因为它们无关紧要。


答案 1

谁说这是“糟糕的风格”?

要问的相关问题是,这是否比替代方案更清晰?在你的具体案例中,我会说是的。该代码清楚地表达了4个选项之间的选择,其中一个是“什么都不做”。

我唯一要做的改变是用一对空的大括号替换这个相当微不足道的分号,可能带有注释以明确这不是一个错误。

if (! seesWater(LEFT)) {
    turn(LEFT);
}
else if (! seesWater(AHEAD)) {
    // nothing required
}
else if (! seesWater(RIGHT)) {
    turn(RIGHT);
}
else {
    turn180();
}

这并不是赞同“空子句”作为一种普遍接受的风格;只是应该根据案件的是非曲直来论证案件,而不是根据必须遵守的某种规则进行辩论。这是一个培养好品味的问题,品味的判断是针对人类的,而不是无意识的自动机。


答案 2

如果这是您想要的逻辑,那么您的代码就没有问题。在代码样式方面,我同意其他用户的观点。在我看来,这样的事情会更清楚:

if (! seesWater(LEFT))
{
    turn(LEFT);
}
else if (! seesWater(AHEAD))
{
    //Do nothing
}
else if (! seesWater(RIGHT))
{
    turn(RIGHT);
}
else
{
    turn180();
}

但是,通过优先考虑左转而不是前进(通过什么都不做),运动可能会以圆圈结束:

enter image description here

如果你想让运动“什么都不做”,但避免像这样进入水域:

enter image description here

您可能希望将逻辑更改为如下所示:

if (! seesWater(AHEAD))
{
    //Do nothing. Keep moving
}
else if (! seesWater(LEFT))
{
    turn(LEFT);
}
else if (! seesWater(RIGHT))
{
    turn(RIGHT);
}
else
{
    turn180();
}

推荐