有时,标签打破或继续可以使代码更具可读性。Java编码标准/最佳实践 - 打破/继续标签的命名约定
OUTERLOOP: for (;/*stuff*/;) {
//...lots of code
if (isEnough()) break OUTERLOOP;
//...more code
}
我想知道标签的常见约定是什么。全部大写?第一帽?
有时,标签打破或继续可以使代码更具可读性。Java编码标准/最佳实践 - 打破/继续标签的命名约定
OUTERLOOP: for (;/*stuff*/;) {
//...lots of code
if (isEnough()) break OUTERLOOP;
//...more code
}
我想知道标签的常见约定是什么。全部大写?第一帽?
如果你必须使用大写字母,这会引起他们的注意,并将它们错误地解释为“Class”名称。引起他们注意的还有捕捉别人的眼睛,并重构代码并将其删除的额外好处。 ;)
约定是完全避免标签。
使用标签打破循环的原因非常非常少。分手是好的,但你可以通过稍微修改你的设计来消除需要中断的需求。在你给出的例子中,你将提取'大量的代码'部分,并将它们放在具有有意义名称的单独方法中。
for (;/*stuff*/;)
{
lotsOfCode();
if (!isEnough())
{
moreCode();
}
}
编辑:见过有问题(over here)实际的代码,我认为标签的使用可能使代码可读性的最佳方式。在大多数情况下,使用标签是错误的方法,在这种情况下,我认为它很好。
召集/最佳实践仍然不会使用它们,并重构代码,以便使用提取方法更易读。
他们是Java的goto - 不知道如果C#有他们。我从来没有在实践中使用过它们,我不能想到避免它们会导致更多可读代码的情况。
但是,如果你有 - 我认为所有大写都可以。大多数人不会使用带标签的休息时间,所以当他们看到代码时,帽子就会跳出来,迫使他们意识到发生了什么。
我知道,我不应该使用标签。
但假设,我有一些代码,可以从标记中断的可读性中获得很多,我如何格式化它们。
莫,你的前提是错误的。 这个问题不应该是'我如何格式化它们?'
你的问题应该是'我的代码里面有大量的逻辑逻辑 - 我如何使它更具可读性?
该问题的答案是将代码移动到单独的,名字正确的函数中。那么你根本不需要标记休息时间。
我最见过的约定是简单的驼峰一样的方法名称...
myLabel:
,但我也看到有下划线
_myLabel:
或前缀标签实验室...
labSomething:
虽然从其他答案中你可能会感觉到,你会很难推动找到一个除“不使用标签”之外的任何其他标准的编码标准。我猜想的答案是你应该使用任何风格对你有意义,只要它是一致的。
我不明白这个“不使用标签”规则来自哪里。当进行非平凡的循环逻辑时,中断或继续的测试并不总是整齐地位于周围块的末尾。
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
}
当然这是一个有点漂亮,但它仍然在绕过一个多余的布尔值。如果内部循环修改局部变量,将其重构为方法并不总是正确的解决方案。
那么,为什么你们都反对标签?给我一些坚实的理由,并为上述案件提供切实可行的选择。
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;
}
}
但会有例子,其中那种重构不与你在做什么逻辑正确坐。
由于标签很少有用,因此看起来没有明确的约定。 Java语言规范有一个带有标签的例子,它们在non_cap中。
但是,因为它们非常罕见,所以我认为最好是三思而后行,看他们是否真的是正确的工具。
如果他们是正确的工具,使他们全部上限,以便其他开发人员(或你自己以后)认识到他们是不寻常的东西马上。 (正如克雷格已经指出的那样)
Sun的Java代码风格似乎更喜欢命名标签的方式与变量相同,这意味着第一个字母是小写字母。
*四年后更新:*对于像Scala和Clojure这样的功能性语言有一个增长的趋势,其中不使用标签的建议有正当理由是有效的。但对于普通的Java,我上面的答案仍然存在。 – 2012-07-23 12:01:58