【问题标题】:java variable namesjava变量名
【发布时间】:2011-06-20 13:30:29
【问题描述】:

你能给出一些充分的理由让类名作为任何变量名的一部分吗?我们曾经有这个政策,我觉得这很有用。一些团队成员想要撤销决定。

我目前的论点:

  • 你可以直接知道你在说什么:

    for(学生学生:学生){ ... }

很容易理解(相对于 Student sStudent any

  • 它有助于自我注释代码
  • 我们的 ide 对此提供直接支持
  • 您可以直接查看您使用的是苹果而不是梨(或熊 ;-))

在细微差别很重要的地方减少混乱:

criteriaBuilder.equal(nameExpression, name);

我能看到的唯一反对意见是它使代码更长(我认为这不是现代 IDE 的问题)。

是否有针对此类建议的公共规定?有人使用相同的规则吗?有什么选择吗?

【问题讨论】:

  • 您应该命名变量,以便清楚它们包含/表示什么。类型通常并不重要。你会不会例如写String string = "Eric"?
  • 不太清楚你在这里问的是什么:是写“Student student”而不是“Student s”或“Student var”吗?
  • @DJClayworth,是的,他想说把 tpye 放在变量名称前面,例如:“Student studentJack = ....”
  • Student studentJohn; 之类的操作似乎很好。我同意它可以更容易地在后面的代码中区分变量。
  • @ymajoros - 你不会找到证明一种方法比另一种更好的证据。与大多数风格指南一样,您会权衡双方并作为组织做出选择。当 IDE 不那么强大并且在重构之前,匈牙利表示法更受欢迎。我觉得随着行业和工具的成熟,它被搁置了。你仍然会在某些地方看到它,但自 1995 年以来,我只在我的一个项目中使用过它,那是因为我扩展的现有代码库使用了它。

标签: java coding-style naming-conventions


【解决方案1】:

对我来说这听起来像Hungarian Notation

原则上这听起来是个好主意,但老实说我不确定是否有充分的理由:

  • 自我注释/记录代码 - 这应该是可能的,无需在变量名称中添加类型;
  • IDE 还应支持查看变量的类型,而无需将其放在变量名中(例如 Eclipse 可以做到这一点)
  • 我不知道这真的是一个优势。

您没有提到的匈牙利表示法的一个问题是,如果您重构代码,您还必须更改所有变量名称。 The Daily WTF 上有很多例子,其中变量被命名为“strSOMETHING”或“intSOMETHING”,即使类型被定义为其他东西。

一般来说,IMO 使用匈牙利表示法的理由很脆弱,一般我不建议将其作为政策。

(如果这不是你所说的,我很抱歉!)

【讨论】:

  • 这听起来确实像匈牙利符号。当使用像 JavaScript 这样松散类型的语言时,我可以看到匈牙利表示法的值,但是当你期望一个整数但接收一个对象时,这可能会导致混淆,就像你得到的例子一样。
  • 当您期望整数时,我看不到示例在哪里有对象。
  • 我什至同意一些变量(计数器)。但是,根据我的经验,我认为这应该是对象的严格约定。 “学生”可能会保持这种状态。
  • 顺便说一句,大多数IDE都可以显示变量类型,但是如果你不观察这样的东西,这乍一看并不明显。
  • 一篇非常好的博客文章,介绍了匈牙利符号的实际用途:joelonsoftware.com/articles/Wrong.html
【解决方案2】:

关于这个问题的圣经是 Steve McConnel 的书,Code Complete,这是关于此类软件构建实践的最全面的书。他有一整章关于变量命名及其重要性。

关键是要让名称完整描述变量的作用,以便阅读它的人易于理解。如果它实现了这一点,那么这是一个很好的做法。

Student student 看起来像是一个易于理解的策略,但它有一个直接的缺点 - 它不包含有关变量的额外信息。你已经知道它是一个学生。如果您对对象有任何其他了解,则将其添加到变量名称中——studentUnderReview、graduatingStudent 等。“student”只有在您完全不知道其他内容时才应使用,例如该变量用于迭代所有学生。现在在一个长方法中,仅通过查看名称来了解类型很有用,但如果变量的范围很短,那么它是否有用都是微不足道的。有一些研究(参见 McConnel)表明,对于范围很短的变量,例如 for 循环索引,短名称更好。

一旦你有两个变量,这个系统就会崩溃。如果默认调用一个变量“student”,那么很容易调用两个变量“student1”和“student2”,这确实是一种不好的做法(有关详细信息,请参阅 McConnel)。您需要命名描述对象的名称 - goodStudent 和 badStudent; studentBeingSaved 和 studentBeingRead。

【讨论】:

  • 我一定会看看这本书。如果我有两个 Student 变量,我通常以您建议的样式命名它们。我的问题是关于这个主题的一个很好的参考,所以你的回答肯定很有趣。
  • 在 Code Complete 中稍微涉及的一个重要主题是在变量名中使用单位。我认为必须将单位放入变量中,例如 timeoutMilliseconds 而不是 timeout 并将内容类型(不是变量类型的一部分)作为 cmetsHtml 而不仅仅是 cmets。
  • 这是一个很好的观点,但如果您使用的是一组一致的单位,则无需将单位放在名称中。在 cmets 中就足够了。
  • @DJClayworth 问题是您可能从超时为秒开始,然后将其更改为毫秒以获得更高的分辨率,结果变得一团糟。如果重命名变量,请确保没有使用旧单位引用变量。
  • 这就是为什么我说“如果你使用的是一组一致的单位”。如果您切换到没有一致的单位集,那么是的,您可能需要重命名一些变量。
【解决方案3】:

策略应该是使用描述性变量名。一个字母的变量名不好,但完全基于类名的变量名也是如此。您的主要论点实际上是描述性变量名称。

至于其他:

  • 它有助于自我注释代码 - 不,它复制了变量声明中的信息
  • 我们的 ide 对此提供了直接支持 - 只有在替代方案没有任何好处的情况下,这才是一个论据
  • 您可以直接看到您使用的是苹果而不是梨(或熊 ;-)) - 这是类型系统的工作

当然,如果你的类名是描述性的,那么有时使用同名的变量是有意义的——当变量描述一个没有任何独特特征的类实例时。如您的示例:

for (Student student: students) { ... }

如果您要遍历所有学生,这很好。但是如果你有一个非泛型实例Student,变量名应该描述学生在这部分程序中的特定角色(例如candidategraduate)。

【讨论】:

  • 我同意某些部分,直到候选人/研究生示例。对我来说,candidateStudent 是更合适的选择。
  • 我同意迈克尔的意见。 “Student CandidateStudent”在“Student Candidate”之上没有添加任何信息。
  • @DJClayworth 它确实提供了“候选人”没有提供的视觉类型信息。在我们的大型代码存储库中,这非常重要。你不能总是检查类型。
  • @ymajoros:如果变量在远离它们定义的地方使用,你就有了设计问题,与代码大小无关,类型信息不是这个问题的最大部分。如果将光标悬停在变量上,任何值得使用的 Java IDE 都会向您显示变量的类型。有一个非常广泛的共识,即重复声明类型的“视觉类型信息”不是一件好事(请参阅整个匈牙利符号辩论)。
  • 它不需要使用远离定义难以阅读。在任何重要的算法中,将 Student 变量命名为“graduate”可以让读者记住一些东西。相比之下,明确地将其命名为“graduateStudent”会让一切变得清晰。
【解决方案4】:

通常,您的变量名称应该有助于开发人员快速了解它们实际代表的内容。 Student student 如果定义的关系表达了​​任何与学生的关系,比如Student[] students(或者更好的一些学生集合)对于Professor 等类来说是可以的。

String string 通常是个坏主意,因为它没有说明该变量的使用。更好的名称是String nameString description 或类似名称。在某些情况下,重要的是你正在处理一个字符串——比如通用字符串实用程序——你可以调用变量string,但如果你有两个或更多,你应该使用更好的名称(例如sourcetarget 等,取决于类/方法)。

恕我直言,添加前缀/后缀可能是一个好主意,如果他们告诉你一些关于它的基本名称不会的变量的信息,例如在 Web 环境中,您可能会处理用户输入的字符串以及转义字符串(例如,为了防止代码注入),因此您可以使用前缀/后缀来区分用户输入版本和转义对应版本。

【讨论】:

  • 我同意 String string 不是一个好主意(在大多数情况下;可能在 string 实用程序方法中)。但是当变量名包含某些东西的字符串表示时,我总是以 Str 结尾(在 OOP 中,它应该与它所代表的东西非常不同)。
  • @ymajoros 如果你有一个不是字符串的字符串表示,你可以这样做,但是如果你有一个普通的字符串对象,你就不会称之为nameStr,例如,你会吗?
  • 如果它很明显,我不会。如果需要,我会:String publishingDateStr(格式化日期)与 Date publishingDate
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多