Java 编码标准/最佳实践 - 中断/继续标签的命名约定
-
08-06-2019 - |
题
有时,带标签的中断或继续可以使代码更具可读性。
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
我想知道标签的共同约定是什么。全部大写?第一个上限?
解决方案
如果您必须使用它们,请使用大写字母,这会引起人们的注意,并将它们从被错误地解释为“类”名称中脱颖而出。引起人们对它们的注意还有一个额外的好处,那就是吸引人们的注意力,他们会重构你的代码并删除它们。;)
其他提示
我不明白这个“不要使用标签”规则从何而来。在执行重要的循环逻辑时,中断或继续的测试并不总是整齐地位于周围块的末尾。
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
}
当然它更漂亮一些,但它仍然传递了一个多余的布尔值。如果内部循环修改了局部变量,将其重构为方法并不总是正确的解决方案。
那么为什么你们都反对标签呢?针对上述情况,请给我一些充分的理由和实际的替代方案。
惯例是完全避免标签。
使用标签来跳出循环的正当理由非常非常少。打破是可以的,但你可以通过稍微修改你的设计来完全消除打破的需要。在您给出的示例中,您将提取“大量代码”部分,并将它们放入具有有意义名称的单独方法中。
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
编辑: 看过有问题的实际代码(在这里),我认为使用标签可能是使代码可读的最佳方式。在大多数情况下使用标签是错误的方法,在这种情况下,我认为这是可以的。
Sun 的 Java 代码风格似乎更喜欢以与变量相同的方式命名标签,即首字母小写的驼峰式命名法。
我最常看到的约定就是简单的驼峰式大小写,就像方法名称一样......
myLabel:
但我也看到过带有下划线前缀的标签
_myLabel:
或者与实验室...
labSomething:
您可能可以从其他答案中感觉到,您将很难找到除“不要使用标签”之外的任何编码标准。我想答案是你应该使用任何对你有意义的风格,只要它是一致的。
沃特 Sadie的代码示例:
你给了
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 语言规范有一个带有标签的示例,它们位于 non_cap 中。
但由于它们如此罕见,我认为最好三思而后行,它们是否真的是正确的工具。
如果它们是正确的工具,请将它们全部设置为大写,以便其他开发人员(或稍后您自己)立即意识到它们是不寻常的。(正如克雷格已经指出的)
约定/最佳实践仍然是根本不使用它们并重构代码,以便使用 extract 作为方法更具可读性。
它们是 Java 的 goto - 不确定 C# 是否有它们。我从未在实践中使用过它们,我想不出避免它们不会产生更具可读性的代码的情况。
但如果你必须——我认为全部大写都可以。大多数人不会使用带标签的中断,因此当他们看到代码时,大写字母会跳到他们身上,迫使他们意识到发生了什么。
我知道,我不应该使用标签。
但假设,我有一些代码,可以从标记的中断中获得很多可读性,我如何格式化它们。
莫,你的前提是错误的。问题不应该是“我如何格式化它们?”
您的问题应该是“我的代码在循环内包含大量逻辑 - 如何使其更具可读性?”
这个问题的答案是将代码移动到单独的、命名良好的函数中。那么你根本不需要标记中断。