Dav*_*pik 46 java coding-style
多年来,我一直在使用命名块来限制临时变量的范围.我从未在其他任何地方看到过这种情况,这让我想知道这是不是一个坏主意.特别是因为Eclipse IDE默认将这些标记为警告.
我认为,在我自己的代码中,我已经使用了这个效果.但是,既然好的程序员在看到它时会不信任它,这是非惯用的,我真的有两种方法可以从这里开始:
示例(在更大的方法中):
final Date nextTuesday;
initNextTuesday: {
GregorianCalendar cal = new GregorianCalendar();
... // About 5-10 lines of setting the calendar fields
nextTuesday = cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)
这里我使用GregorianCalendar来初始化日期,我想确保我不会意外地重复使用它.
有些人评论说你实际上不需要命名块.虽然这是真的,但原始块看起来更像是一个bug,因为意图不明确.此外,命名的东西鼓励你思考块的意图.这里的目标是识别代码的不同部分,而不是为每个临时变量赋予自己的范围.
很多人评论说最好直接采用小方法.我同意这应该是你的第一直觉.但是,可能有几个缓解因素:
使用命名范围的优点:
缺点:
不是惯用的:没有看到使用命名块的程序员(即除了我之外的所有人)都认为它有问题,因为他们无法找到对块名称的引用.(就像Eclipse一样.)让事情成为惯用语是一场艰苦的战斗.
它可以作为不良编程习惯的借口,例如:
注意:基于一些深思熟虑的回答,我已经广泛地编辑了这个问题.谢谢!
Jon*_*eet 26
我只是直接重构为更小的方法.如果一个方法是足够大,它需要打破这样的,它真正需要分解成多个方法,如果在所有可能的.
虽然限制范围很好,但这并不是命名块的用途.它是单一的,很少是一件好事.
Sco*_*ham 14
如果这很糟糕,那为什么这是该语言的一个功能!它有一个目的,你找到了它.
我经常编写与您的示例完全相同的代码.当你想要初始化一个变量时,需要做一些计算来计算应该是什么,并且这涉及到几个变量...那么你不希望这些变量在你的整个范围内闲逛函数,然后一个小范围包含初始化工作很棒.
迷你范围是将代码分解为"段落"的简单方法.如果您拆分为方法,那么当这些方法无法从其他任何地方调用时,您可以使代码更难导航,并且具有需要执行的序列式顺序.
它始终是一种平衡,但如果您认为它最容易维护,并且它实际上为未来的代码读者增加了价值,如果它全部内联,那就去吧.
没有严格的规则.有时候我会让同事过度地把所有东西都放在自己的方法或类或文件中,这让我感到有点厌倦,这成了导航的噩梦.某处有一个很好的平衡!
Joh*_*son 10
有时我使用未命名的块来隔离准备一些不可变的东西所需的可变事物.我没有使用标签,而是将块放在不可变变量声明下.
final String example;
{
final StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100; i++)
sb.append(i);
example = sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
当我找到块的其他用途,或者只是认为它在阻碍时,我把它变成了一个方法.
这是我第一次看到其他人使用积木.噢!我以为我是唯一一个.我知道我没有发明它 - 记得在某处读它 - 可能来自我以前的C++世界.
我不使用标签,只是评论我在做什么.
我不同意所有要求你将其提取到方法中的人.我们在这些块中提供的大部分内容都不是真正可重用的块.它在大型初始化中是有意义的并且是的,我使用了块来防止COPY/PASTE错误.
BR,
~A
| 归档时间: |
|
| 查看次数: |
7148 次 |
| 最近记录: |