java - 命名 block 限制变量范围 : good idea?

标签 java coding-style

多年来,我一直使用命名 block 来限制临时变量的范围。我从未在其他任何地方看到过这样做,这让我怀疑这是否是一个坏主意。特别是因为 Eclipse IDE 默认将这些标记为警告。

我认为,在我自己的代码中,我已经使用它取得了很好的效果。但是由于它是不习惯的,以至于优秀的程序员在看到它时会不信任它,所以我真的有两条路可以走:

  1. 避免这样做,或者
  2. 推广它,希望它会成为一个成语。

示例(在更大的方法中):

final Date nextTuesday;
initNextTuesday: {
    GregorianCalendar cal = new GregorianCalendar();
    ... // About 5-10 lines of setting the calendar fields
    nextTuesday = cal.getTime();
}

这里我使用 GregorianCalendar 只是为了初始化一个日期,并且我想确保我不会意外重用它。

有些人评论说您实际上不需要命名 block 。虽然这是真的,但原始 block 看起来更像是一个错误,因为意图尚不清楚。此外,命名某些东西会鼓励您考虑 block 的意图。此处的目标是识别不同的代码部分,而不是为每个临时变量赋予其自己的范围。

许多人评论说最好直接使用小方法。我同意这应该是你的第一直觉。但是,可能有几个缓解因素:

  • 即使考虑一个命名 block ,代码也应该是简短的一次性代码,永远不会在其他地方调用。
  • 命名 block 是一种组织超大方法的快速方法,无需创建带有十几个参数的一次性方法。当一个类在不断变化时尤其如此,并且输入可能会因版本而异。
  • 创建新方法会鼓励其重复使用,如果用例不完善,这可能是不明智的做法。命名 block 更容易(至少在心理上)被丢弃。
  • 特别是对于单元测试,您可能需要为一次性断言定义十几个不同的对象,它们的不同之处足以让您(还)无法找到一种方法将它们整合到少数方法中,你也想不出用一英里长的名字来区分它们的方法。

使用命名作用域的优点:

  1. 不能意外重用临时变量
  2. 有限范围为垃圾收集器和 JIT 编译器提供了有关程序员意图的更多信息
  3. block 名称提供了对代码块的注释,我发现它比开放式注释更具可读性
  4. 更容易将代码从大方法重构为小方法,反之亦然,因为命名 block 比非结构化代码更容易分离。

缺点:

不是惯用的:没有见过命名 block 的这种用法的程序员(即除了我之外的所有人)认为这是错误的,因为他们找不到对 block 名称的引用。 (就像 Eclipse 所做的那样。)让某些东西变得惯用是一场艰苦的战斗。

可以作为不良编程习惯的借口,比如:

  • 制作庞大的单一方法,其中几个小方法会更清晰。
  • 缩进层太深,难以阅读。

注意:我根据一些深思熟虑的回答对这个问题进行了广泛的编辑。谢谢!

最佳答案

我会直接重构为更小的方法。如果一个方法足够大以至于需要像这样分解,那么如果完全可能的话,它确实需要分解成多个方法。

虽然限制范围很好,但这并不是命名 block 的真正用途。这是单调的,这很少是一件好事。

关于java - 命名 block 限制变量范围 : good idea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/205458/

相关文章:

perl - 在 Perl 中优雅地解析刚性数据

java - 静态初始化数组?

Java RCP - 无法将文本动态设置为 SWT 标签控件

java - 我应该为以下功能编写哪些单元测试用例?另外,如何提供示例 JSONobject 作为函数中的参数?

java - 在 Tomcat 上通过 eclipse 运行项目时出现 404

java - 如何使用 JPA 检查记录是否存在

c++ - 期望引入类型(枚举类)的成员函数的缩写参数

c# - if else系列如何清理

java - 在 Java 中,公共(public)构造函数似乎总是一种糟糕的编码习惯

Java正则表达式查找字符串之外的变量名