题 大括号/块末尾的Java注释


Java编程语言中的一个公认的做法是结束带有注释的代码块的括号,该注释简要说明了括号关闭的代码块?我个人认为它们是无用的评论,混乱了代码的可读性,但也许我可能是错的。例如:

public void myMethod(int foo) {    
    // some code
    if (foo == 2) {
        for (int i = 0; i < myMax; i++) {
            while (true) {
                // some more code
            } // end while
        } // end for
    } // end if
} // end myMethod(int)

是否以类似的方式对代码块进行注释是一种公认​​的做法?


32
2017-10-09 02:27


起源


等到你有几个内部块,分开10或甚至100的线......然后它会有所帮助。想想如果你有其他的东西会是什么样子 if 循环中的陈述...... - MadProgrammer
如果你在一个区块中有100个线条,你应该考虑从那里拉出一个方法并使一切变得更简单。 - digitaljoel
当我这样做时,我会略微增加信息,例如 } // end for i 区别于嵌套 } // end for j - Henry
如果您的代码如此令人困惑,以至于您觉得应该重新引入oldskool if-endif语法,那么您应该减少代码混乱。 :) - Joren
我认为Linus Torvalds说“如果你的代码有三个以上的缩进级别,那么它就不是一段好的代码”。也就是说,代码块末尾的注释可能表示代码过于复杂......保持简单,它将帮助您(以及那些阅读代码的人)玩得开心 - Barranka


答案:


这不是一个糟糕的做法,但它是一个 致命的副作用 差的面向对象编码实践!

此外,这违反了风格指南和原则 “自我记录代码”。你应该永远不要有那么多括号或方法足以让读者混淆支架放置,而是将该功能封装在另一个有详细记录的方法中。

括号意味着循环或复杂的if-else逻辑链,良好的编程习惯是让方法完成一件事并做好,然后从这些较小的雾化方法构建程序。我会读巴特勒兰普森的开创性作品 “计算机系统设计的提示”。它介绍了如何设计优秀软件的一些细节。

基本上,不要这样评论,因为:

  1. 它违反了风格指南
  2. 它显示了糟糕的面向对象编程 - 雾化您的功能!
  3. 编码实践的致命副作用与创建Java的基本概念背道而驰 - 封装,特别是信息隐藏
  4. 它违反了自我记录代码的概念
  5. 其他程序员会取笑你。

38
2017-10-09 03:46





我的看法是,通常这不是一个好习惯。与规则一样,可能有例外,但非常罕见。

这不是一个好习惯,因为

  1. 当您将光标放在结束时,现代编辑器会突出显示开始括号,反之亦然。
  2. 最重要的是:如果有可能看不到条款的开头,则意味着该方法很大(超过半页),这是一种不好的做法。
  3. 它会给代码增加噪音,这会使习惯于更传统的Java编码风格的读者感到困惑。
  4. 合并LordScree-Joachim Sauer评论:这些评论会 要保持颈部疼痛。所以很可能它不会被维护,信息通常会与现实不同步。

58
2017-10-09 02:33



+1:4。维持a **会很痛苦 - oliver-clare
@LordScree:甚至是推论:“4。它不会被维护,信息通常会与现实不同步” - Joachim Sauer
例如,如果将鼠标光标放在结束括号上,eclipse会显示块的信息。 - Nick Dandoulakis


这取决于方法或功能的复杂程度。就像你有一些可以很容易阅读和理解的东西一样,用一个解释该部分已经结束的评论来结束每一行都不会有任何意义。这就是压痕和换行符的含义。但是,如果您的某些内容非常复杂且会影响代码的主要部分,那么您应该表示该代码的结束位置以及该部分的作用。


1
2017-10-09 02:31



我不同意,代码应该重构。 - Matsemann


我只在代码中有一个地方相互之间有很多关闭括号时才这样做。但不是每个支架。主要是我似乎将它用于循环,以便您可以轻松地看到什么是重复的代码块。

看起来像这样的东西:

            // ...
            file.Close();
          }
        }
      }
    }
  }
}

然后它有助于添加一些评论:

            // ...
            file.Close();
          }
        }
      }
    } // for:每个文件
  }
}

1
2017-11-21 07:31





如果存在相同类型的嵌套块,则可能会混淆而不是做好事。假设您有4或5个嵌套if语句(请记住,这只是一个示例来说明情况,无论“哦你应该分开那些”或“提出方法”建议)在这种情况下你将有4或5不同的//如果排序则结束。过了一段时间,它让你混淆哪个“结束如果”是哪个声明,让你花费额外的努力无意识地看透实际的代码/声明,因为它并不像你的例子一样干净/简短。


0
2017-10-09 02:54





IMO,它没有多大帮助。循环或if语句中的代码不应该太大。 如果循环中有500行,那会有所帮助。


0
2017-10-09 03:04