24

有时带标签的中断或继续可以使代码更具可读性。

OUTERLOOP: for ( ;/*stuff*/; ) {
    //...lots of code

    if ( isEnough() ) break OUTERLOOP;
    //...more code
}

我想知道标签的通用约定是什么。全部大写?第一个上限?

4

10 回答 10

41

我不明白这个“不使用标签”规则的来源。在执行重要的循环逻辑时,中断或继续测试并不总是整齐地位于周围块的末尾。

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
}

当然它有点漂亮,但它仍然传递一个多余的布尔值。如果内部循环修改了局部变量,将其重构为方法并不总是正确的解决方案。

那为什么你们都反对标签呢?给我一些充分的理由,以及上述案例的实际替代方案。

于 2008-08-19T09:46:52.577 回答
20

如果您必须使用它们,请使用大写字母,这会引起对它们的注意并将它们从被错误地解释为“类”名称的情况中挑选出来。吸引他们的注意力还有一个额外的好处,那就是吸引别人的眼球,然后重构你的代码并删除它们。;)

于 2008-08-19T03:41:53.530 回答
15

惯例是完全避免使用标签。

使用标签来跳出循环的正当理由非常非常少。突破是可以的,但您可以通过稍微修改您的设计来消除突破的需要。在您给出的示例中,您将提取“大量代码”部分并将它们放在具有有意义名称的各个方法中。

for ( ;/*stuff*/; ) 
{
    lotsOfCode();

    if ( !isEnough() )
    {
        moreCode();
    }
}

编辑:看到有问题的实际代码(在这里),我认为使用标签可能是使代码可读的最佳方法。在大多数情况下,使用标签是错误的方法,在这种情况下,我认为这很好。

于 2008-08-19T01:41:14.913 回答
10

Sun 的 Java 代码风格似乎更喜欢以与变量相同的方式命名标签,这意味着首字母小写的驼峰式大小写。

于 2008-08-20T11:19:23.640 回答
2

我见过最多的约定只是驼峰式大小写,就像方法名称一样......

myLabel:

但我也看到带有下划线前缀的标签

_myLabel:

或与实验室...

labSomething:

您可能会从其他答案中感觉到,您将很难找到一个除了“不要使用标签”之外的任何内容的编码标准。那么我想答案是你应该使用任何对你有意义的风格,只要它是一致的。

于 2008-08-19T08:25:47.500 回答
1

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;
   }
}

但是会有这样的例子,无论你在做什么,这种重构都不正确。

于 2008-08-19T10:10:06.900 回答
1

由于标签很少有用,因此似乎没有明确的约定。Java 语言规范有一个带有标签的示例,它们在 non_cap 中。

但由于它们如此罕见,在我看来,最好三思而后行,它们是否真的是正确的工具。

如果它们是正确的工具,请将它们全部设置为大写,以便其他开发人员(或您以后)立即意识到它们是不寻常的。(正如克雷格已经指出的那样)

于 2008-08-20T09:17:20.657 回答
0

传统/最佳实践仍然是根本不使用它们并重构代码,以便使用提取作为方法更具可读性。

于 2008-08-19T03:24:57.107 回答
0

它们有点像 Java 的 goto - 不确定 C# 是否有它们。我从未在实践中使用过它们,我想不出避免它们不会导致代码更具可读性的情况。

但如果你必须 - 我认为所有大写都可以。大多数人不会使用带标签的中断,所以当他们看到代码时,大写字母会跳出来,迫使他们意识到发生了什么。

于 2008-08-19T03:49:26.947 回答
0

我知道,我不应该使用标签。

但只是假设,我有一些代码,可以从标记的中断中获得很多可读性,我如何格式化它们。

莫,你的前提是错误的。问题不应该是“我如何格式化它们?”

您的问题应该是“我的代码在循环中包含大量逻辑 - 如何使其更具可读性?”

该问题的答案是将代码移动到单独的、命名良好的函数中。然后,您根本不需要标记中断。

于 2008-08-19T03:50:42.593 回答