如果我省略了Java中的大括号可以吗?
我find了这个,但找不到答案,无论出于何种原因,我都很惭愧地问教授,因为这种感觉,当数百人盯着你时…
无论如何,我的问题是括号的重要性是什么? 我可以忽略它们吗? 例:
for (int i = 0; i < size; i++) { a += b; }
VS
for (int i = 0; i < size; i++) a += b;
我知道他们两个都会工作,但是如果我省略括号(我倾向于做很多,由于能见度),这会改变什么,什么都可以? 正如我所说,我知道它是有效的,我testing了十几次,但是现在我的一些任务变得越来越大了,出于某种原因,我有一些非理性的恐惧,从长远来看,这是我的一些问题吗? 有理由担心吗?
除了代码的可维护性之外,它不会改变任何东西。 我看过这样的代码:
for (int i = 0; i < size; i++) a += b; System.out.println("foo");
这意味着这个:
for (int i = 0; i < size; i++) a += b; System.out.println("foo");
…但本应该是这样的:
for (int i = 0; i < size; i++) { a += b; System.out.println("foo"); }
就个人而言,我总是包括括号,以减less在阅读或修改代码时出现混淆的可能性。
在我工作过的每家公司,编码惯例都要求这样做 – 这并不是说其他一些公司没有不同的惯例。
而且万一你认为它永远不会有所作为:我必须修复一个与上面的代码非常相当的错误。 很难发现…(不出所料,这是几年前,我开始进行unit testing之前,这无疑更容易诊断)。
使用大括号使代码更易于维护和理解。 所以你应该默认考虑它们。
我有时候会跳过对警卫子句使用大括号来使代码更紧凑。 我的要求是,他们是if
后面是跳转语句,如return
或throw
语句。 另外,我把它们放在同一句话中以引起对这个成语的注意,例如:。
if (!isActive()) return;
它们也适用于循环内的代码:
for (...) { if (shouldSkip()) continue; ... }
对于其他的跳转条件,不一定在方法体的顶部。
有些语言(比如Perl或者Ruby)有一种条件语句 ,大括号不适用:
return if (!isActive()); // or, more interestingly return unless (isActive());
我认为这与我刚才所描述的相同,但是明确地受到这种语言的支持。
没有区别。 第二个版本的主要问题是你可能最终写这个:
for (...) do_something(); do_something_else();
当你更新该方法时,认为do_something_else()
在循环中被调用。 (这会导致头痛的debugging会话。)
还有第二个问题,支架版本没有,它可能更难以发现:
for (int i=0; i<3; i++); System.out.println("Why on earth does this print just once?");
所以,除非你有一个很好的理由,否则只要保留大括号,这只是一些击键。
我没有看到公约的重点。
总是使用大括号的原因是相当薄弱的,因为它假定程序员知道语言语法,并且知道没有大括号的if语句仅适用于跟在它后面的第一个语句。
如果Oracle决定这是一个“良好的做法”,那么总是使用大括号来编写if语句,那为什么他们不改变语法呢?
我的想法:
如果我写一个“没有大括号的声明”,我总是把它放在一行。 放两行这种代码很奇怪:
if(statement) code; // weird and ugly for me. if(statement) code; // ok for me, I often use in very short codes. // but if the code is long, so I prefer the code below. if(statement) { code; // if this makes your code clear, then ok. // But there is cases when I think the second option is better. }
我不喜欢基于这样愚蠢的理由的公约。
补充:在这篇文章中很多人都同意:你应该这样做,以提高可读性。 但我认为这样做是为了避免错误是不必要的。
你是否认为改变这样的代码:
while(statement) { if (condition) i++; }
进入这个:
while(statement) { if (condition) { i++; } }
会提高可读性? 我不这么认为。 这可能是一个更复杂的if语句。 但是我所认识的每个人都只用简单的if语句就可以这样编码。 不用说,第一个案子看起来更清楚。
但有人认为有一些程序员可以这样做:
while (statement) { if (condition) i++; statement; }
认为这个陈述是if的一部分。 我觉得没有必要担心这个。 因为如果一些程序员有这样的能力,那就更糟了。
我认为,应该避免的是写一个没有大括号的if语句像这样的两行:
while (statement) { if (condition) i++; statement; }
或嵌套unbraces声明,如:
while (statement) if (condition) i++;
这我同意它的错误容易,而且经常由初学者完成。 你应该避免编写复杂的,如果没有大括号相似的陈述。
如果你有一个单独的语句,你可以省略括号,为了声明一个代码块,需要更多的语句括号。
当你使用方括号时,你声明了一个代码块:
{ //Block of code }
为了提高可读性,当您处于嵌套语句的情况时,括号也应该只用一个语句,例如:
for( ; ; ) if(a == b) doSomething()
如果不是必须的话,用括号写的更具可读性:
for( ; ; ) { if(a == b) { doSomething() } }
如果你使用括号,你的代码更具可读性。 如果您需要在同一个块中添加一些运算符,则可以避免可能的错误
我认为如果你使用的是自动格式,大括号的花括号是很好的,因为比你的缩进总是正确的,所以很容易发现任何错误。
说离开大括号是坏的,怪异的或不可读的只是错误的,因为整个语言是基于这个想法,它是相当stream行(python)。
但是我不得不说,如果不使用格式化程序,可能会很危险。
使用括号将来可以certificate这些代码是针对以后的修改的。 我已经看到了括号被省略的情况,并且有人后来添加了一些代码,并没有把括号放在那个时候。 结果是他们添加的代码并没有进入他们认为的那个部分。 所以我觉得答案就是根据未来对代码的修改,这是一个很好的实践。 我已经看到软件组采用这个标准,即因为这个原因,总是要求使用括号。
对于大多数情况,迄今为止提到的答案是正确的。 但是从安全的angular度来看,它有一些缺点。 在一个支付团队工作,安全是一个更强大的因素,动机这样的决定。 比方说你有以下代码:
if( "Prod".equals(stage) ) callBankFunction ( creditCardInput ) else callMockBankFunction ( creditCardInput )
现在让我们说你有这个代码不工作,由于一些内部问题。 你想检查input。 所以你做了以下的改变:
if( "Prod".equals(stage) ) callBankFunction ( creditCardInput ) else callMockBankFunction ( creditCardInput ) Logger.log( creditCardInput )
假设你解决了这个问题并且部署了这个代码(也许这个评论者&你认为这不会导致一个问题,因为它不在'Prod'条件之内)。 神奇的是,您的生产日志现在打印客户的信用卡信息,所有可以看到日志的人员都能看到。 上帝禁止他们(有恶意的意图)获得这些数据。
因此,不给大括号和粗心大意的编码往往会导致违反安全的信息。 它也被CERT(软件工程研究所)列为JAVA中的一个漏洞。
更多的支持我的“总是大括号”小组。 如果省略单语句循环/分支的大括号,则将该语句放在与控制语句相同的行上,
if (condition) doSomething(); for(int i = 0; i < arr.length; ++i) arr[i] += b;
这种方式很难忘记在扩展主体时插入大括号。 不过,仍然使用curl。
结果明智,这是一回事。
只有两件事情要考虑。
– 代码可维护性
– 松耦合的代码。 (可能会执行其他操作,因为您没有指定循环的范围。)
注意:在我看来,如果是在一个循环中循环。 没有牙套的内环也是安全的。 结果不会变化。
如果你删除大括号,它只会读取第一行的指令。 任何额外的行将不会被读取。 如果你有超过1行的指令被执行,请使用大括号 – 否则会抛出exception。
如果你在循环中只有一个语句,它是一样的。
例如看下面的代码:
for(int i=0;i<4;i++) System.out.println("shiva");
我们在上面的代码中只有一个声明。 所以没有问题
for(int i=0;i<4;i++) System.out.println("shiva"); System.out.println("End");
在这里,我们有两个陈述,但只有第一个陈述进入循环,而不是第二个陈述。
如果在单循环下有多个语句,则必须使用大括号。
使用冗余大括号声称代码更易于维护提出了以下问题:如果编写代码的人想知道并进一步维护代码,就会遇到类似前面所述的问题(缩进相关或可读性相关),也许他们不应该编程。 。
它应该是一个reflection,以重新格式化的代码…这当然是专业团队的专业程序员
这可能是最好的使用大括号到处,简单的事实是,debugging这将是一个极端的麻烦。 但是另一方面,一行代码不一定需要括号。 希望这可以帮助!