有时标记的中断或继续可以使代码更具可读性。
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
我想知道标签的常见惯例是什么。全部大写?第一次上限?
答案 0 :(得分:34)
我不明白这个“不使用标签”的规则来自哪里。在执行非平凡的循环逻辑时,中断或继续的测试并不总是在周围块的末尾。
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
}
Yuck!将其重构为一种方法并不能减轻这种情况:
boolean innerLoop (...) {
for (...) {
// some code
if (...) {
return true;
}
// more code
}
return false;
}
for (...) {
// some code
if (innerLoop(...))
continue;
// more code
}
当然它有点漂亮,但它仍然传递一个多余的布尔值。如果内部循环修改了局部变量,那么将其重构为方法并不总是正确的解决方案。
那么为什么你们都反对标签呢?给我一些坚实的理由,以及上述案例的实用替代方案。
答案 1 :(得分:16)
如果你必须使用它们使用大写字母,这会引起对它们的注意,并将它们单独错误地解释为“类”名称。引起对它们的关注还有一个额外的好处,就是能够抓住某个人的眼睛并重构你的代码并删除它们。 ;)
答案 2 :(得分:14)
惯例是完全避免标签。
使用标签打破循环的有效理由非常非常少。突破是可以的,但你可以通过稍微修改你的设计来消除破坏的需要。在您给出的示例中,您将提取“许多代码”部分并将它们放在具有有意义名称的单个方法中。
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
编辑:看过实际的代码(over here),我认为使用标签可能是使代码可读的最佳方式。在大多数情况下,使用标签是错误的方法,在这种情况下,我认为它很好。
答案 3 :(得分:7)
Sun的Java代码风格似乎更喜欢以与变量相同的方式命名标签,这意味着驼峰的情况下以小写字母表示第一个字母。
答案 4 :(得分:2)
我最常见的惯例是简单的驼峰,就像一个方法名......
myLabel:
但我也看过以下划线为前缀的标签
_myLabel:
或与实验室......
labSomething:
你可能会从其他答案中感觉到,你很难找到一个除了“不要使用标签”之外的其他任何东西的编码标准。我猜的答案是你应该使用任何对你有意义的风格,只要它是一致的。
答案 5 :(得分:1)
wrt sadie's code example:
你给了
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;
}
}
但是会有一些例子表明,无论你正在做什么逻辑,这种重构都不能正确理解。
答案 6 :(得分:1)
由于标签很少有用,似乎没有明确的惯例。 Java语言规范有一个带标签的例子,它们在non_cap中。
但是,由于它们非常罕见,我认为最好是三思而后行是否真的是正确的工具。
如果它们是正确的工具,请将它们全部设为上限,以便其他开发人员(或者您自己以后)立即将其视为不寻常的事物。 (正如克雷格已经指出的那样)
答案 7 :(得分:0)
约定/最佳实践仍然不会使用它们并重构代码,以便使用extract作为方法更具可读性。
答案 8 :(得分:0)
它们是Java的焦点 - 不确定C#是否有它们。我从来没有在实践中使用它们,我想不出这样一种情况,即避免使用它们不会产生更易读的代码。
但如果你必须 - 我认为所有的上限都可以。大多数人不会使用带标签的断点,因此当他们看到代码时,大写字母会跳出来并迫使他们意识到正在发生的事情。
答案 9 :(得分:0)
莫,你的前提是错的。 问题不应该是“如何格式化它们?”我知道,我不应该使用标签。
但是假设我有一些代码,可以从标记的中断中获得很多可读性,我该如何格式化它们。
你的问题应该是'我的代码在循环中有大量的逻辑 - 我如何使它更具可读性?'
该问题的答案是将代码移动到单独的,命名良好的函数中。那么你根本不需要标记断点。