在java代码bas中自动向所有if/else/for/while etc添加花括号

2024-05-14 05:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个大型的遗留java代码库中减少声纳违规的数量,而且看起来“快速的胜利”是更新所有这些条件语句,使其具有花括号。这似乎是一件容易的事情,我不明白为什么它不容易被自动化。

有人知道有什么工具可以执行这样的批量操作吗?或者为什么在我花时间自己写东西之前做这样的事情可能是个坏主意?如果我自己写一个,最好的工具是什么?理想情况下是java语言感知的,这样我就不必处理格式化角点大小写之类的事情。

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


Tags: 工具代码语言数量时间情况语句批量
3条回答

最简单的方法是使用Eclipse并在整个项目上单击Clean-up。在Clean-up配置文件配置中,选择Code style选项卡。在这里您可以选择Use blocks in if/while/for/do statements作为Always

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

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

虽然谨慎使用遗留代码是明智的,但检测遗留代码中的错误也是一件好事。。。或者至少能让窃听器更容易被发现。

让我们来看看布莱恩·阿格纽的疑难案例:

// Case #1
if (x) doMethodA(); doMethodB();

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

if (x) doMethodA();
doMethodB();

因此,当转换器将代码重写为:

if (x) { 
    doMethodA();
}
doMethodB();

它并没有改变代码的含义,但它正在纠正一个可能导致有人误读代码的问题,以及代码中已经存在的潜在错误,即如果第二个调用是有条件的。。。

// Case #2
if (x) 
    // doMethodA();
    doMethodB();

再次,当重写时,您应该得到:

 if (x) {
    // doMethodA();
    doMethodB();
 }

意思和原作一样。此外,这很可能反映了程序员的意图。。。如果压痕是可信的。但考虑一下:

// Case #2a
if (x) 
    // doMethodA();
doMethodB();

当我们把它改写成

if (x) {
    // doMethodA();
    doMethodB();
}

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


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

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

相关问题 更多 >