【问题标题】:Is it ok if I omit curly braces in Java? [closed]如果我在 Java 中省略花括号可以吗? [关闭]
【发布时间】:2011-12-22 15:26:11
【问题描述】:

我已经搜索过这个,但找不到答案,无论出于何种原因,我都不好意思问教授,因为当数百人盯着你看时的那种感觉......

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

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

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

我知道它们都可以工作,但是如果我省略括号(由于可见性,我经常这样做)会改变任何东西吗?正如我所说,我知道它有效,我测试了几十次,但现在我的一些大学作业越来越大,出于某种原因,我有一种非理性的恐惧,从长远来看,这会导致一些问题?有理由担心吗?

【问题讨论】:

  • 我总是使用代码格式化程序来提高可读性,因为这解决了许多潜在的混淆原因。这会使使用大括号变得多余

标签: java coding-style brackets


【解决方案1】:

如今,重新缩进代码很容易找出哪个代码块在哪个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();
    }
}

是的,它看起来不像前面的例子那么严重,但你仍然会被这种缩进弄糊涂。

恕我直言,编写代码的人有责任检查代码并确保缩进正确,然后再继续执行其他操作。

【讨论】:

    【解决方案2】:

    最好在任何地方都使用花括号,因为调试这将是一个非常麻烦的简单事实。但另一方面,一行代码不一定需要括号。希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      这也应该是重新格式化代码的一种反应……这当然是针对专业团队中的专业程序员的

      【讨论】:

        【解决方案4】:

        使用冗余大括号来声称代码更易于维护会引发以下问题:如果编写、想知道和进一步维护代码的人遇到之前描述的问题(缩进相关或可读性相关),也许他们不应该在所有...

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            在大多数情况下,到目前为止提到的答案都是正确的。但是从事物的安全角度来看,它也有一些缺点。在支付团队工作后,安全性是推动此类决策的一个更强大的因素。假设您有以下代码:

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

            现在假设您的代码由于某些内部问题而无法正常工作。你想检查输入。因此,您进行以下更改:

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

            假设您解决了问题并部署了此代码(也许审阅者并且您认为这不会导致问题,因为它不在“Prod”条件之内)。神奇的是,您的生产日志现在打印客户信用卡信息,所有可以看到日志的人员都可以看到这些信息。上帝禁止他们中的任何人(出于恶意)掌握这些数据。

            因此,不给予支持和一点粗心的编码通常会导致安全信息遭到破坏。它也被CERT - Software Engineering Institure, CMU归类为JAVA中的漏洞。

            【讨论】:

            • 我认为这是一个非常糟糕的设计,但这一点是有效的。
            【解决方案7】:

            如果循环中只有一个语句,则相同。

            例如看下面的代码:

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

            这里我们有两个语句,但只有第一个语句进入循环,而第二个语句没有。

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

            【讨论】:

              【解决方案8】:

              结果是一样的。

              只需要考虑两件事。

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

              注意:在我的观察中,如果它在循环中循环。没有大括号的内环也是安全的。结果不会改变。

              【讨论】:

                【解决方案9】:

                如果您还使用自动格式,我认为松开花括号很好,因为您的缩进总是正确的,因此很容易发现任何错误。

                说把大括号去掉是不好的、奇怪的或不可读的,这是错误的,因为整个语言都是基于这个想法,而且它非常流行(python)。

                但我不得不说,不使用格式化程序可能很危险。

                【讨论】:

                • 缩进在 Python 中很重要。在 Java、C、C++ 或其他 C 风格的语言中,它不会。
                • @ChristopherSchneider 这就是桥。
                【解决方案10】:

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

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

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

                我工作过的每家公司的编码约定都要求这样做 - 这并不是说其他​​一些公司没有不同的约定...

                以防万一您认为它永远不会产生影响:我必须修复一次错误,该错误几乎等同于上面的代码。很难发现...(诚然,这是几年前的事了,在我开始单元测试之前,这无疑会使诊断变得更容易)。

                【讨论】:

                • @vedran:所以你知道这个问题,但你只是假设它永远不会咬你?并且每个阅读您的代码的人都会知道会发生什么?我只是说 - 在我使用的编码约定中需要它们是有原因的:)
                • 我只是觉得自己像一个被军士压倒的私人。是的,虽然这对我来说更方便,但我小组中的其他人觉得这很烦人且有问题。从现在开始,我将确保在任何地方都使用括号。
                • @vedran 很好的比喻,除了 Jon Skeet 不是中士,他是总司令 :-)
                • @stivlo 哦,我相信他的恩典会原谅轻微的不服从 ;) 就我个人而言,我确实在语句后加上括号,因为它是我见过的每个编码指南的一部分,但我认为它很漂亮今天的论点很弱。随处可见自动代码格式化,无论如何您都不应该看到第一种形式的代码,如果缩进正确,括号不会提供任何额外信息。
                • 更多参数总是使用大括号:imperialviolet.org/2014/02/22/applebug.html
                【解决方案11】:

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

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

                if (!isActive()) return;
                

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

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

                以及来自不一定在方法体顶部的方法的其他跳转条件。

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

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

                我认为它与我刚才描述的内容等价,但语言明确支持。

                【讨论】:

                • +1 循环内的保护子句通常在没有花括号的情况下更清晰。
                • 同意保护条款。在我看来,使代码更具可读性,实际上提高了可维护性。不过,接受的答案提出的观点非常有效,所以我会将大括号的省略限制在保护子句中。
                【解决方案12】:

                我对“总是大括号”组的更多支持。 如果您省略了单语句循环/分支的大括号,请将语句与控制语句放在同一行,

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

                这样,当身体展开时,更难忘记插入大括号。不过,无论如何都要使用卷曲。

                【讨论】:

                  【解决方案13】:

                  没有区别。第二个版本的主要问题是你最终可能会这样写:

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

                  所以除非你有充分的理由,否则请保留大括号,只需多敲几下键即可。

                  【讨论】:

                  • 第一点不错,第二点错了。大括号版本仍然存在这个问题。对于 (int i=0;i
                  • 大括号版可以有,但大括号在同一行会更显眼。确实,在下一行加上大括号,这非常糟糕。
                  • 第二个版本对我来说和第一个一样重要,因为查看第二个版本几乎不可能发现哪里出了问题,除非你真正运行它来看看到底发生了什么。开发人员花费大量时间调试这样的代码,如果引入了那些波浪形的括号,很容易发现这些代码。对我来说,省略那些曲折的括号不仅是一种风格问题,而且是可能存在错误代码的一个很好的指标。
                  【解决方案14】:

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

                  【讨论】:

                  • 没有。在单条指令的情况下使用括号会降低代码的可读性,因为您会用更多的符号来养眼和思考,在这种情况下,不会带来额外的信息。这就是为什么phyton变得流行的原因。用那种语言编程会花费你更少的精力,因为它的代码更短并且不需要的元素更少。
                  【解决方案15】:

                  使用方括号来证明代码可以防止以后的修改。我见过省略括号的情况,后来有人添加了一些代码并且当时没有放入括号。结果是他们添加的代码没有进入他们认为的部分。所以我认为答案是,鉴于未来对代码的更改,它是一种很好的做法。我已经看到软件组将其作为标准采用,即始终需要括号,即使是单行块也是如此。

                  【讨论】:

                  • 我同意这一点。括号不适合你。他们是为你身后的人准备的。有几次,我维护的代码我不熟悉,它没有使用括号并且缩进很糟糕。在这个阶段,我可能正在修复一个错误,所以很高兴知道应该发生什么。省略大括号使其不那么明显,我必须单步执行代码,浪费时间。
                  • 一个人可以保护一切。那将是完美的。但不宜居:)
                  【解决方案16】:

                  如果你只有一个语句,你可以省略括号,因为多于一个语句,括号是声明代码块所必需的。

                  当你使用括号时,你是在声明一个代码块:

                  {
                  
                  //Block of code
                  }
                  

                  在嵌套语句的情况下,括号也应该只与一个语句一起使用,以提高可读性,例如:

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

                  如果没有必要,用括号写起来更易读:

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

                  【讨论】:

                  • 完全正确 :) 更具可读性 = 所需工作量更少。因此,为了防止将来可能出现的错误,我们最终都会陷入括号的泥潭,我们需要看到并写下:)
                  猜你喜欢
                  • 1970-01-01
                  • 2013-01-31
                  • 1970-01-01
                  • 2012-11-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多