ved*_*ran 77 java coding-style brackets
我已经搜索了这个,但无法找到答案,无论出于何种原因,我太羞于问教授,因为有数百人盯着你的感觉......
无论如何,我的问题是拥有括号的重要性是什么?如果我省略它们可以吗?例:
for (int i = 0; i < size; i++) {
a += b;
}
Run Code Online (Sandbox Code Playgroud)
VS
for (int i = 0; i < size; i++)
a += b;
Run Code Online (Sandbox Code Playgroud)
我知道它们都可以工作,但是如果我省略括号(我倾向于做很多,由于可见性)会改变什么,什么都没有?正如我所说,我知道它有效,我测试了十几次,但现在我的一些单一任务变得越来越大,并且出于某种原因,我有非理性的恐惧,从长远来看,这是我的原因有些问题吗?有理由害怕吗?
Jon*_*eet 131
除了代码的可维护性之外,它不会改变任何东西.我见过这样的代码:
for (int i = 0; i < size; i++)
a += b;
System.out.println("foo");
Run Code Online (Sandbox Code Playgroud)
这意味着:
for (int i = 0; i < size; i++)
a += b;
System.out.println("foo");
Run Code Online (Sandbox Code Playgroud)
......但应该是这样的:
for (int i = 0; i < size; i++) {
a += b;
System.out.println("foo");
}
Run Code Online (Sandbox Code Playgroud)
我个人总是包括括号,以减少阅读或修改代码时混淆的可能性.
我所工作的每家公司的编码惯例都要求这样做 - 这并不是说其他一些公司没有不同的惯例......
并且万一你认为它永远不会有所作为:我必须修复一次错误,这几乎与上面的代码相同.很难发现......(不可否认,这是几年前,在我开始进行单元测试之前,这无疑会使诊断变得更容易).
Jor*_*dão 32
使用大括号使代码更易于维护和理解.所以你应该默认考虑它们.
我有时会跳过使用保护子句的大括号来使代码更紧凑.我对此的要求是它们的if
语句后跟一个跳转语句,如return
或throw
.另外,我把它们放在同一行,以引起对成语的注意,例如:
if (!isActive()) return;
Run Code Online (Sandbox Code Playgroud)
它们也适用于循环内的代码:
for (...) {
if (shouldSkip()) continue;
...
}
Run Code Online (Sandbox Code Playgroud)
以及来自不一定位于方法体顶部的方法的其他跳转条件.
某些语言(如Perl或Ruby)有一种条件语句,其中大括号不适用:
return if (!isActive());
// or, more interestingly
return unless (isActive());
Run Code Online (Sandbox Code Playgroud)
我认为它等同于我刚才描述的内容,但语言明确支持.
Mat*_*Mat 11
没有区别.第二个版本的主要问题是你可能最终写这个:
for (...)
do_something();
do_something_else();
Run Code Online (Sandbox Code Playgroud)
当你更新该方法时,认为do_something_else()
在循环内部调用.(这会导致令人头疼的调试会话.)
还有第二个问题是支架版本没有,它可能更难发现:
for (int i=0; i<3; i++);
System.out.println("Why on earth does this print just once?");
Run Code Online (Sandbox Code Playgroud)
除非你有充分的理由,否则请保持支撑,这只是几次击键.
小智 5
我认为,如果您还使用自动格式化,则松开花括号是很好的,因为缩进总是正确的,因此以这种方式很容易发现任何错误。
说出大括号是不好的,奇怪的或不可读的,这是错误的,因为整个语言都基于该思想,并且非常流行(python)。
但是我不得不说,如果不使用格式化程序,可能会很危险。
小智 5
对于大多数情况,到目前为止提到的答案是正确的。但是从事物的安全性角度来看,它有一些缺点。在支付团队工作过后,安全性是促使此类决策的重要因素。假设您有以下代码:
if( "Prod".equals(stage) )
callBankFunction ( creditCardInput )
else
callMockBankFunction ( creditCardInput )
Run Code Online (Sandbox Code Playgroud)
现在,假设您的代码由于某些内部问题而无法正常工作。您要检查输入。因此,您进行了以下更改:
if( "Prod".equals(stage) )
callBankFunction ( creditCardInput )
else
callMockBankFunction ( creditCardInput )
Logger.log( creditCardInput )
Run Code Online (Sandbox Code Playgroud)
假设您解决了问题并部署了此代码(也许是审阅者,并且您认为这不会引起问题,因为它不在“ Prod”条件下)。神奇的是,您的生产日志现在可以打印客户信用卡信息,所有可以看到该日志的人员都可以看到。如果其中任何一个人(出于恶意目的)掌握了这些数据,上帝就会禁止。
因此,不加括号和稍加粗心的编码通常会导致违反安全信息。CERT-软件工程研究所(CMU)也将该漏洞分类为JAVA中的漏洞。