Java编码标准/最佳实践-中断/继续标签的命名约定
有时,标记为break或continue可以使代码更具可读性Java编码标准/最佳实践-中断/继续标签的命名约定,java,label,convention,Java,Label,Convention,有时,标记为break或continue可以使代码更具可读性 OUTERLOOP: for ( ;/*stuff*/; ) { //...lots of code if ( isEnough() ) break OUTERLOOP; //...more code } 我想知道标签的一般惯例是什么。所有的帽子?第一杯 惯例是完全避免使用标签 使用标签打破循环的有效理由非常少。中断是可以的,但是您可以通过稍微修改一下设计来完全消除中断的需要。在您给出的示例中,您将提取“大
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
我想知道标签的一般惯例是什么。所有的帽子?第一杯 惯例是完全避免使用标签 使用标签打破循环的有效理由非常少。中断是可以的,但是您可以通过稍微修改一下设计来完全消除中断的需要。在您给出的示例中,您将提取“大量代码”部分,并将它们放在具有有意义名称的单独方法中
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
Edit:看到了有问题的实际代码(),我认为使用标签可能是使代码可读的最好方法。在大多数情况下,使用标签是错误的方法,在这种情况下,我认为这是好的。对流/最佳实践仍然是根本不使用标签,并重构代码,以便使用extract as方法更具可读性。如果必须使用标签,请使用大写字母,这引起了人们对它们的注意,并使它们避免被错误地解释为“类”名称。吸引人们的注意力还有一个额外的好处,那就是吸引别人的眼球,从而重构代码并删除它们 它们有点像Java的后起之秀——不确定C#是否拥有它们。我从未在实践中使用过它们,我想不出哪种情况下,避免使用它们不会导致更可读的代码 但是如果你不得不这样做的话,我想所有的帽子都可以。大多数人不会使用带标签的换行符,因此当他们看到代码时,大写字母会跳出来,迫使他们意识到发生了什么 我知道,我不应该使用标签 但只要假设,我有一些代码,可以从标记的中断中获得很多可读性,我如何格式化它们 莫,你的前提是错误的。 问题不应该是“如何设置格式?” 您的问题应该是‘我的代码在循环中包含大量逻辑—如何使其更具可读性?’
这个问题的答案是将代码移动到单独的、命名良好的函数中。然后,您根本不需要标记中断。我最熟悉的约定就是简单的驼峰大小写,比如方法名
myLabel:
但我也看到了以下划线为前缀的标签
_myLabel:
或者和实验室
labSomething:
但是,从其他答案中,您可能会感觉到,您将很难找到一个编码标准,该标准除了“不要使用标签”之外,还包含任何内容。我想答案是,你应该使用任何对你有意义的风格,只要它是一致的。我不明白“不使用标签”规则从何而来。在执行非平凡的循环逻辑时,中断或继续的测试并不总是整齐地位于周围块的末尾
outer_loop:
for (...) {
// some code
for (...) {
// some code
if (...)
continue outer_loop;
// more code
}
// more code
}
是的,像这样的情况确实经常发生。人们建议我用什么来代替?像这样的布尔条件
for (...) {
// some code
boolean continueOuterLoop = false;
for (...) {
// some code
if (...) {
continueOuterLoop = true;
break;
}
// more code
}
if (continueOuterLoop)
continue;
// more code
}
恶心将其重构为一种方法并不能缓解以下问题:
boolean innerLoop (...) {
for (...) {
// some code
if (...) {
return true;
}
// more code
}
return false;
}
for (...) {
// some code
if (innerLoop(...))
continue;
// more code
}
当然它有点漂亮,但它仍然传递了一个多余的布尔值。如果内部循环修改了局部变量,那么将其重构为方法并不总是正确的解决方案
那为什么你们都反对标签呢?对于上述情况,请给出一些确凿的理由和切实可行的替代方案。wrt:
你给
outerloop:
for (...) {
// some code
for (...) {
// some code
if (...)
continue outerloop;
// more code
}
// more code
}
举个例子。你说得很对。我最好的猜测是:
public void lookMumNoLabels() {
for (...) {
// some code
doMoreInnerCodeLogic(...);
}
}
private void doMoreInnerCodeLogic(...) {
for (...) {
// some code
if (...) return;
}
}
但也有一些例子表明,这种重构与您所做的任何逻辑都不匹配。因为标签很少有用,所以似乎没有明确的约定。Java语言规范有一个带有标签的示例,它们是非大写的 但由于它们如此罕见,在我看来,最好三思而后行,看看它们是否真的是正确的工具
如果它们是正确的工具,请将它们全部设置为大写,以便其他开发人员(或稍后的您)立即意识到它们是不寻常的。(正如Craig已经指出的)Sun的Java代码风格似乎更喜欢以与变量相同的方式命名标签,这意味着首字母小写的驼峰大小写。四年后更新:Scala和Clojure等函数式语言有越来越大的趋势,其中不使用标签的建议是有充分理由的。但对于普通Java,我上面的答案仍然有效。和javascrpt以及任何基于事件的语言。因此,对于bean来说,它可能没有那么大的用处,除非这是一些非常(可能太)冗长的事件处理的一部分。奇怪的是,得票最多的答案根本没有回答最初的问题。(“我想知道标签的通用惯例是什么。所有的帽子?第一个帽子?”)没错,@Jonik。我的回答是针对已经被一个观点占据的线索,并希望平衡它。这两个问题都不是对原来问题的真正答案。令人惊讶的是,这是公认的答案。Oracle使用了
test
作为示例标签,很明显这不是大写的(尽管是否应该使用camelCase
,下划线_小写
等更是一个悬而未决的问题)。