有时带标签的中断或继续可以使代码更具可读性。
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
我想知道标签的通用约定是什么。全部大写?第一个上限?
有时带标签的中断或继续可以使代码更具可读性。
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:
您可能会从其他答案中感觉到,您将很难找到一个除了“不要使用标签”之外的任何内容的编码标准。那么我想答案是你应该使用任何对你有意义的风格,只要它是一致的。
wrt 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 中。
但由于它们如此罕见,在我看来,最好三思而后行,它们是否真的是正确的工具。
如果它们是正确的工具,请将它们全部设置为大写,以便其他开发人员(或您以后)立即意识到它们是不寻常的。(正如克雷格已经指出的那样)
传统/最佳实践仍然是根本不使用它们并重构代码,以便使用提取作为方法更具可读性。
它们有点像 Java 的 goto - 不确定 C# 是否有它们。我从未在实践中使用过它们,我想不出避免它们不会导致代码更具可读性的情况。
但如果你必须 - 我认为所有大写都可以。大多数人不会使用带标签的中断,所以当他们看到代码时,大写字母会跳出来,迫使他们意识到发生了什么。
我知道,我不应该使用标签。
但只是假设,我有一些代码,可以从标记的中断中获得很多可读性,我如何格式化它们。
莫,你的前提是错误的。问题不应该是“我如何格式化它们?”
您的问题应该是“我的代码在循环中包含大量逻辑 - 如何使其更具可读性?”
该问题的答案是将代码移动到单独的、命名良好的函数中。然后,您根本不需要标记中断。