在一行代码中省略花括号是否被认为是正确的?

3

我个人认为,省略if-else语句中的花括号是不对的,并且我非常清楚为什么要避免这样做。

但是现在我遇到了一个有趣的用例,示例代码如下:

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (result) return;
    throw exceptionSupplier.get();
}

我认为这段代码非常简洁,以下将展示其他变体。同时该代码不容易出现添加一行代码更改逻辑的问题。
我个人会将其设定成一个规则,仅在控制流语句中使用它,实际上指的是return、break和continue。
下面展示了该代码的两个替代版本。 替代方案一:
public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (result) {
        return;
    }
    throw exceptionSupplier.get();
}

方案2

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (!result) {
        throw exceptionSupplier.get();
    }
}

我认为它们都使代码看起来更加复杂,没有任何明显的原因。

2
我认为在某种程度上,这取决于个人的编码风格。但是我强烈不喜欢没有花括号的单行代码,因为如果条件和语句在同一行上,很容易忽略掉后面的语句。我还想补充一点,你提出的替代方案对我来说并不复杂。 - adarshr
1
答案取决于你习惯使用哪种形式。话虽如此,这主要是基于个人观点的。 - devnull
2
该方法的名称描述了代码为“如果不是结果则抛出异常”(我猜这大概是我将要放在JavaDoc中的内容)。因此,我更喜欢在代码中使用if (!result) throw ..(即使只有1行),因为这与预期的行为相符。 - zapl
3个回答

2

在单行代码里省略大括号是否被认为是正确的?

其实没有硬性规定。但是考虑到可用性,我会总是使用大括号。这样能使代码更易读,对初级开发者来说也更容易理解。当然,这完全是个人/公司(代码标准)的选择。

而在你的备选方案中,我会选择备选方案2

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (!result) {
        throw exceptionSupplier.get();
    }
}

为什么?

  1. 更加简洁
  2. 行数更少
  3. 逻辑更加直接

1
我会选择方案2
尽管省略大括号可能会使代码更漂亮、更简洁,但方案2是最难误解的。
有一点小概率,看函数的人可能会错过return语句,因为它不在自己的行上,而在方案2中更难犯这种错误。

0

我认为在可以由多个语句组成的主体处添加 花括号,这是一种 防御性编程,可以防止微妙的逻辑错误。但是如果您的团队重视:

  • 易读的代码
  • 手动格式化的代码

那么您可以使用另一条规则,这也是我在我的源代码中应用的规则:

omit `curly braces` when the single statement of a body occurs at the same line.

这样可以避免额外的无用标记,对于读者来说没有任何有用的信息。但是需要整个团队的纪律和承诺来手动格式化代码或应用正确的格式化规则。在这些情况下,我总是手动格式化我的代码,以使其最易读。


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