2008-08-19 79 views

回答

16

如果你必须使用大写字母,这会引起他们的注意,并将它们错误地解释为“Class”名称。引起他们注意的还有捕捉别人的眼睛,并重构代码并将其删除的额外好处。 ;)

15

约定是完全避免标签。

使用标签打破循环的原因非常非常少。分手是好的,但你可以通过稍微修改你的设计来消除需要中断的需求。在你给出的例子中,你将提取'大量的代码'部分,并将它们放在具有有意义名称的单独方法中。

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

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

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

0

召集/最佳实践仍然不会使用它们,并重构代码,以便使用提取方法更易读。

0

他们是Java的goto - 不知道如果C#有他们。我从来没有在实践中使用过它们,我不能想到避免它们会导致更多可读代码的情况。

但是,如果你有 - 我认为所有大写都可以。大多数人不会使用带标签的休息时间,所以当他们看到代码时,帽子就会跳出来,迫使他们意识到发生了什么。

1

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

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

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

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

该问题的答案是将代码移动到单独的,名字正确的函数中。那么你根本不需要标记休息时间。

1

我最见过的约定是简单的驼峰一样的方法名称...

myLabel: 

,但我也看到有下划线

_myLabel: 

或前缀标签实验室...

labSomething: 

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

33

我不明白这个“不使用标签”规则来自哪里。当进行非平凡的循环逻辑时,中断或继续的测试并不总是整齐地位于周围块的末尾。

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 
} 

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

那么,为什么你们都反对标签?给我一些坚实的理由,并为上述案件提供切实可行的选择。

+10

*四年后更新:*对于像Scala和Clojure这样的功能性语言有一个增长的趋势,其中不使用标签的建议有正当理由是有效的。但对于普通的Java,我上面的答案仍然存在。 – 2012-07-23 12:01:58

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

但会有例子,其中那种重构不与你在做什么逻辑正确坐。

1

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

但是,因为它们非常罕见,所以我认为最好是三思而后行,看他们是否真的是正确的工具。

如果他们是正确的工具,使他们全部上限,以便其他开发人员(或你自己以后)认识到他们是不寻常的东西马上。 (正如克雷格已经指出的那样)

5

Sun的Java代码风格似乎更喜欢命名标签的方式与变量相同,这意味着第一个字母是小写字母。