Java编码标准/最佳实践 - 中断/继续标签的命名约定

时间:2008-08-19 01:18:30

标签: java label convention

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

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

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

我想知道标签的常见惯例是什么。全部大写?第一次上限?

10 个答案:

答案 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)

  

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

     

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

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

你的问题应该是'我的代码在循环中有大量的逻辑 - 我如何使它更具可读性?'

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