拆分声明和分配 = 良好实践? [关闭]

Posted

技术标签:

【中文标题】拆分声明和分配 = 良好实践? [关闭]【英文标题】:Splitting Declaration and Assignment = Good Practice? [closed] 【发布时间】:2013-04-03 22:47:52 【问题描述】:

作为 NetBeans 的***用户,当我引入新变量时,我不断收到有关拆分变量声明和分配的建议。作为一个超级快速的例子,让我们来看看这个 Java 行:

String someInput = JOptionPane.showInputDialog(null, "- Enter something: "); 

对比:

String someInput;
someInput = JOptionPane.showInputDialog(null, "- Enter something: "); 

NetBeans 似乎更喜欢后者(不过我不知道其他 IDE)。虽然它显然是双向的,但如果有的话,这会被认为是“好的做法”吗?还是纯粹是个人喜好问题?

(显然,将两者分开意味着您可以将额外的一行合并为一个,但这不是重点。)

【问题讨论】:

让我感到困惑的是,有人会更喜欢后者而不是前者。 嗯,也许您在 NetBeans 中发生了一些有趣的代码风格的事情! 第一个选项是初始化对象的“经济”方式。 (我认为)第二个更简洁一些,因为它允许对赋值中的变量声明进行分组。我觉得从纯审美的角度来看,第二种更可取,但第一种在简洁性方面更可取 我建议你做你认为最简单和最清晰的事情。对我来说这是第一种情况。 很确定 netbeans 通常只在突出显示该行时才提供此功能,这并不是真正的“问题”。它是一个可选的快捷方式,就像 'invert if statement' 'warning' 一样。 【参考方案1】:

这是在 7.0 和 7.3 之间添加到 NetBeans 的一个选项。如果您不喜欢这个提示,可以通过取消选中来更改它: 工具 > 选项 > 编辑器 > 提示 > 建议 > 拆分声明

【讨论】:

对于 IntelliJ IDEA,它位于文件 - 设置 - 编辑器 - 意图 - Java - 声明 - 拆分声明。【参考方案2】:

Netbeans 建议这样做,因为它可以加快编码速度,例如考虑这个分配

final String myString = "somevalue"

然后你决定这个值实际上取决于一些boolean

final String myString;
if(something) 
    myString = "somevalue"
 else 
    myString = "someothervalue"

要将一个转换为另一个,您可以使用代码提示到溢出的声明和赋值以及if...else 模板以非常少的步骤生成代码。

一般来说,如果您是无条件分配,则没有理由拆分声明和分配。

【讨论】:

我不认为将声明与赋值分开来抢占使用这种情况(if/else、try/catch 等)是值得的,当您认为它需要重写变量名。 “让我们让所有代码变得更长,并且不必要地变得更复杂,这样我们就可以将已经很快完成的任务缩短到可以忽略不计的时间,以防万一有一天它是必要的。”是的。没有。 @AlexanderMomchliov 代码不同。一种是直接赋值,一种是条件赋值。我真的不明白你的评论是否适合。 我的意思是 NetBeans 的推理是愚蠢的。他们不鼓励直接初始化,而是更喜欢这种毫无意义的 2 行方法,因为有可能有一天它更容易使赋值有条件。 @AlexanderMomchliov 他们没有。你的评论是完全错误的。对不起。【参考方案3】:

Code Complete 受到大多数编程社区的好评,在其第 241 页中建议,作为防御性编程问题,您可以在声明每个变量时对其进行初始化(您的第一个选项)或将其初始化为接近它的位置第一次使用(您的第二个选项)。

尽管如此,本书建议第二个选项更好,因为如果您使用第一个选项,您的变量可能在其声明和使用之间发生了变化。

在您的情况下,第二种情况下的声明和使用之间的区别是单行。因此,本书的关注点不适用。尽管如此,它的担忧是合理的,这可能是 Netbeans 设计人员包含此技巧的原因(即使他们过度使用了它)。

【讨论】:

您似乎误用了书中的建议。您引用的页面声明“某些语言,包括 Visual Basic,不支持在声明变量时初始化变量”,但 Java 不是这些语言之一,因此这不适用。这本书继续说“理想情况下,声明定义每个变量接近它第一次使用的位置......在支持它的语言中,例如C ++和Java,变量应该被声明和定义接近首次使用它们的地方。”对于 Java,这不是一个非此即彼的命题。【参考方案4】:

一种可以追溯到早期静态类型编程的常见模式是在需要限定范围的块的顶部声明您需要的所有变量,然后随后分配给这些值。

话虽如此,只要您能够在一年的时间内将代码的意图清楚地传达给与您一起工作的人或您自己,这并不重要。

让我们改变对程序构建的传统态度:而不是想象我们的 主要任务是指示计算机做什么,让我们 而是专注于向人类解释什么 我们想要一台电脑来做。 ——唐纳德·克努斯

【讨论】:

+1 不错的报价,谢谢! +1 declare; declare; declare; assign; assign; assign; 可能是 NetBeans 试图强制的风格,而不是 declare; assign; declare; assign; declare; assign; 非常好的报价,谢谢!【参考方案5】:

我认为这没什么大不了的。选择你喜欢的风格,并始终坚持下去(如果你在一个团队中,如果每个人都以相似的方式布置他们的代码,这会很有帮助)。

我个人更喜欢在声明时初始化我的变量。因此,我更喜欢前者而不是后者。

【讨论】:

【参考方案6】:

如果您只是要将它们放在连续的行中,则没有理由拆分声明和赋值。如果赋值是有条件的,或者如果它需要进入一个单独的代码块(如 try/catch,或者如果赋值进入构造函数等),我只会拆分它们。

【讨论】:

是的,这可以解决问题。坚持对你有意义的东西比坚持 IDE 更好!

以上是关于拆分声明和分配 = 良好实践? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

拆分和分配字符

idea如何提取变量(拆分变量赋值和声明)

React拆分组件的最佳实践?

rbac04权限分配任务拆分

大文件拆分问题的java实践(附源码)

如何使用友元函数和继承拆分定义和声明