在java代码库中自动为所有if/else/for/while等添加花括号

rob*_*ert 9 java formatting sonarqube

我希望减少大型遗留Java代码库中声纳违规的数量,似乎"快速获胜"将更新所有这些条件语句以具有大括号.这似乎是一件容易的事情,我不明白为什么它不容易自动化.

有没有人知道可以像这样执行批量操作的工具?或者为什么做这样的事情可能是一个坏主意,然后我花时间自己写点什么?如果我自己写一个什么是最好的工具?理想情况下是Java语言识别的东西,所以我不必处理格式化角落等情况.

顺便说一句,规则是不可协商的,所以这确实是最好的方法.

Chr*_*ach 11

首先启用Control flow statement without braces检查设置.

IntelliJ Idea - >运行代码检查 - >快速修复(至少在商业版中有效)

  • 在较新的版本中,这是在 `Analyze` -> `Run Inspection By Name` -> `Run Code Inspection` 下 (4认同)
  • 就像尤达大师会讲的那样.这看起来很奇怪. (2认同)

Shy*_*hyJ 7

最简单的方法是使用Eclipse并单击Clean-up整个项目.在Clean-up配置文件配置选择Code style选项卡 在那里,你可以选择Use blocks in if/while/for/do statementsAlways.

  • 在重新格式化之前更新,并在进行进一步更改之前签入.如有必要,这将简化退出更改. (3认同)

Ste*_*n C 6

虽然建议对遗留代码保持谨慎,但检测遗留代码中的错误也是一件好事……或者至少使错误更容易被发现。

让我们考虑一下 Brian Agnew 的困难案例:

// Case #1
if (x) doMethodA(); doMethodB();
Run Code Online (Sandbox Code Playgroud)

事实上,就JLS和Java编译器而言,这意味着

if (x) doMethodA();
doMethodB();
Run Code Online (Sandbox Code Playgroud)

所以当转换器将代码重写为:

if (x) { 
    doMethodA();
}
doMethodB();
Run Code Online (Sandbox Code Playgroud)

它不会改变代码的含义,但它正在纠正一个可能导致某人误读代码并错过代码中已经存在的潜在错误的问题;即如果第二次调用应该是有条件的......

// Case #2
if (x) 
    // doMethodA();
    doMethodB();
Run Code Online (Sandbox Code Playgroud)

再一次,当它被重写时,你应该得到:

 if (x) {
    // doMethodA();
    doMethodB();
 }
Run Code Online (Sandbox Code Playgroud)

这意味着与原始内容相同。此外,这很可能反映了程序员的意图……如果缩进是可信的。但是考虑一下:

// Case #2a
if (x) 
    // doMethodA();
doMethodB();
Run Code Online (Sandbox Code Playgroud)

当我们将其重写为

if (x) {
    // doMethodA();
    doMethodB();
}
Run Code Online (Sandbox Code Playgroud)

代码的实际含义不会改变,错误的缩进也不会再误导。如果程序员决定取消对第一个调用的注释,他可能不会意识到之前的注释已经产生了意想不到的后果。(证据在我们“固定”的原始缩进中。)但是有一个潜在的解决方案;见下文。


如果我们假设代码转换工具在正确理解 Java 的语法和语义的情况下运行,那么它不会破坏任何尚未破坏的东西,并且它会(在某种程度上)使任何现有的破坏对某人来说更加明显阅读代码。对我来说,这是零风险的胜利,即使对于遗留代码也是如此。

现在,如果我们让 Transformer 更智能,它可以检测到一些原始缩进表明可能存在错误的情况(如上面的情况 #1 和 #2a),并标记它们以进行更仔细的代码检查。