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

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# 是否有它们。我从未在实践中使用过它们,我想不出避免它们不会产生更具可读性的代码的情况。

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

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

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

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

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

这个问题的答案是将代码移动到单独的、命名良好的函数中。那么你根本不需要标记中断。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top