2011-11-05 48 views
62

我寻找过这个,但找不到答案,无论出于何种原因,我太羞耻地问教授,由于那种感觉,当数百人盯着你...如果我省略Java中的大括号可以吗?

无论如何,我的问题括号的重要性是什么?我可以忽略它们吗?例如:

for (int i = 0; i < size; i++) { 
    a += b; 
} 

VS

for (int i = 0; i < size; i++) 
    a += b; 

我知道他们两个的工作,但如果我省略了括号(我倾向于做了很多,由于能见度)将是改变任何东西,任何事情在所有?正如我所说,我知道它是有效的,我测试了十几次,但现在我的一些任务变得越来越大了,出于某种原因,我有非理性的担心,从长远来看,这是我的原因吗?有没有理由担心呢?

回答

101

除了之外,它不会改变任何东西代码的可维护性。我见过这样的代码:

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"); 
} 

我个人总是包括括号减少混淆的可能性读取或修改代码时。

在每一个公司,我为有需要这个工作的编码约定 - 这是不是说,其他一些公司不具备不同的约定......

和公正的情况下,你觉得它永远不会有所作为:我必须修复一次与上面的代码非常相当的错误。很难发现......(不出所料,这是几年前,我开始进行单元测试之前,这无疑使它更容易诊断)。

+0

是的,我意识到这个问题,我没有使用括号,当只有一行后,如果... – vedran

+9

@vedran:所以你知道这个问题,但你只是假设它永远不会咬你?而且每个阅读你的代码的人都会知道该期待什么?我只是说 - 有一个原因,为什么他们在我已经与之合作的编码规范中被要求:) –

+11

我只是觉得自己像一个私人人士一样被嘲笑。是的,尽管对我来说更方便,但我的团队中的其他人却觉得这很麻烦,也很麻烦。从现在开始,我会确保使用括号。 – vedran

10

没有区别。与第二版的主要问题是,你可能最终写这:

for (...) 
    do_something(); 
    do_something_else(); 

当您更新方法,以为do_something_else()被称为循环内。 (这导致头刮调试会话。)

还有第二个问题,即撑版本没有,它可能更难发现:

for (int i=0; i<3; i++); 
    System.out.println("Why on earth does this print just once?"); 

因此,保持大括号,除非你有一个很好的理由,这只是一些击键。

+3

第一点是好的,但第二点是错误的。大括号版本仍然可以有这个问题。 for(int i = 0; i <3; i ++); {System.out.println(“为什么只打印一次?”); }。我知道,因为我总是使用大括号,但有时会错误地添加额外的分号。 – emory

+3

大括号版本可以拥有它,但是如果大括号在同一行上,则更明显。确实,在下一行的支架上,它非常讨厌。 – Mat

+0

对于我来说,第二个版本与第一个版本同样重要,因为在第二个版本中,几乎不可能发现什么是错误的,直到你真正运行它才能看到世界正在发生什么。开发人员花费大量时间调试这样的代码,如果引入这些冗长的支架,很容易被发现。对我而言,省略那些波浪形括号不仅仅是一种风格问题,而且是可能的错误代码的良好指示。 –

4

如果您有一条语句,您可以省略括号,对于声明一个代码块所需的更多的语句括号。

当您使用您声明的代码块括号:

{ 

//Block of code 
} 

的括号也应使用只有一个语句时,你是在为提高可读性嵌套声明的局面,因此,例如:

for(; ;) 
    if(a == b) 
    doSomething() 

它更可读写有括号也如无必要:

for(; ;) { 
    if(a == b) { 
    doSomething() 
    } 
} 
3

使用方括号将来的修改代码对未来进行验证。我曾经看过一些情况,其中省略了括号,并且有人后来添加了一些代码,并且当时没有放置括号。结果是他们添加的代码没有进入他们认为它所做的部分。所以我认为答案就是根据未来对代码的更改,它的良好实践。我见过软件组采用这种标准作为标准,即出于这个原因,即使使用单行块也总是需要括号。

+0

我同意这一点。括号不适合你。他们是为了身后的人。有几次,我有代码,我坚持认为我不熟悉,没有使用括号,并有不好的缩进。在这个阶段,我可能正在修复一个bug,所以很高兴知道应该发生什么。省略大括号使其不太明显,我必须逐步完成代码,浪费时间。 –

4

如果使用括号,代码更具可读性。 如果您需要在同一个模块中添加一些运算符,则可以避免可能的错误

2

更多支持我的“always braces”组。 如果你忽略了单语句循环/分支支架,把语句放在同一行作为控制语句,

if (condition) doSomething(); 
for(int i = 0; i < arr.length; ++i) arr[i] += b; 

这样,它更难当体膨胀忘记插入括号。不过,反正使用卷曲。

26

使用大括号使代码更易于维护和理解。所以你应该认为它们默认为

我有时会跳过使用大括号guard clauses使代码更紧凑。我对此的要求是,它们是if语句,后面跟着语句,如returnthrow。另外,我将它们放在同一行,以引起对该习语的注意,例如:。

if (!isActive()) return; 

它们也适用于内部代码循环:

for (...) { 
    if (shouldSkip()) continue; 
    ... 
} 

而对于其他跳跃条件从不一定在方法体的顶部的方法。

一些语言(如Perl和Ruby)有一种条件语句,其中括号不适用的:

return if (!isActive()); 
// or, more interestingly 
return unless (isActive()); 

我认为这是相当于什么,我刚才所描述的,但明确支持该语言。

+6

+1 guard clause in inside如果没有花括号,循环通常更清晰。 – Viccari

+2

同意守卫条款。在我看来,使代码更具可读性,并且实际上提高了可维护性。虽然接受的答案是非常有效的,所以我会限制省略括号来防止子句。 – ChrisK

4

我认为如果你还使用自动格式,那么松散大括号是好的,因为比缩进总是正确的,所以很容易发现任何错误。

说大括号离开花括号是坏的,怪异的或不可读的只是错误的,因为整个语言是基于这个想法,并且它非常流行(python)。

但我不得不说,如果不使用格式化程序,它可能是危险的。

+0

缩进在Python中很重要。在Java,C,C++或其他C风格的语言中,它没有。 –

+0

@ChristopherSchneider这是蓬。 –

1

结果明智,这是同样的事情。

只有两件事情需要考虑。

- 代码可维护性
- 松散耦合的代码。 (可以执行 别的东西,因为你没有指定为循环的范围。)

注:在我的观察,如果是循环使用的循环。没有大括号的内环也是安全的。结果不会变化。

0

如果在循环中只有一条语句,它是相同的。

例如看到下面的代码:

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"); 

这里我们有两条语句,但只有第一条语句进入循环内部,但不是第二条语句。

如果您在单循环下有多个语句,您必须使用大括号。

3

对于大多数情况下,到目前为止提到的答案是正确的。但从安全角度来看,它有一些缺点。在支付团队工作之后,安全性成为决定动机的更强有力的因素。可以说你有以下代码:

if("Prod".equals(stage)) 
    callBankFunction (creditCardInput) 
else 
    callMockBankFunction (creditCardInput) 

现在让我们说你有这个代码不工作,由于一些内部问题。你想检查输入。所以,你做如下改变:

if("Prod".equals(stage)) 
    callBankFunction (creditCardInput) 
else 
    callMockBankFunction (creditCardInput) 
    Logger.log(creditCardInput) 

说你解决问题,(&你认为这不会造成,因为它不是一个问题“刺”的条件内,也许审稿)部署此代码。神奇的是,您的生产日志现在可以打印客户的信用卡信息,所有可以看到日志的人员都可以看到这些信息。上帝禁止他们中的任何人(有恶意的意图)掌握这些数据。

因此,不给予大括号和粗心大意的编码通常会导致违反安全信息。它也被划分为JAVA中的一个漏洞,由CERT - Software Engineering Institure, CMU

+0

我认为这是一个非常糟糕的设计,但重要的是有效的。 –

1

如果删除大括号,它只会读取第一行指令。任何额外的行将不会被读取。如果您有超过1行的指令要执行,请使用大括号 - 否则会引发异常。

0

使用冗余大括号声称代码更易维护提出以下问题:如果编写代码的人想知道并进一步维护代码时遇到类似前面描述的问题(缩进相关或可读性相关),那么他们可能不应该编程在所有...

0

它应该是一个反射重新格式化代码以及...那当然是专业团队中的专业程序员

0

对于简单的事实来说,最好使用大括号来调试这将是一个极端的麻烦。但其他方面,一行代码不一定需要括号。希望这可以帮助!

0

现在,很容易重新缩进代码,以找出哪个代码块在哪个iffor/while。如果你坚持重新缩进是很难做到的,那么放在错误缩进处的括号可能会让你感到困惑。

for(int i = 0; i < 100; i++) { if(i < 10) { 
    doSomething(); 
} else { for(int j = 0; j < 5; j++) { 
     doSomethingElse(); 
    } 
}} 

如果你在任何地方都这样做,你的大脑就会很快分崩离析。即使使用括号,您也依赖缩进来直观地查找代码块的开始和结束。

如果缩进非常重要,那么您应该已经使用正确的缩进方式编写代码,以便其他人不需要重新缩进代码即可正确读取。

如果你想争辩说,前面的例子是太假/深思熟虑,并且括号内是有捕捉粗心压痕问题(尤其是当你复制/粘贴代码),然后再考虑这一点:

for(int i = 0; i < 100; i++) { 
    if(i < 10) { 
    doSomething(); 
} 
else { 
    for(int j = 0; j < 5; j++) { 
     doSomethingElse(); 
    } 
} 

是的,它看起来不像前面的例子那么严重,但是你仍然可以通过这种缩进感到困惑。

恕我直言,编写代码的人负责检查代码,并确保在他们继续执行其他操作之前正确缩进。

相关问题