前缀变量名称以指示其各自的范围或来源?

时间:2013-06-12 10:06:24

标签: java naming-conventions scope prefix notation

在我一直在工作的公司中,我已经看到很多使用前缀来表示变量的范围或来源,例如m用于类成员,i用于方法实习变量和a(或p)方法参数:

public class User {

    private String mUserName;

    public String setUserName(final String aUserName) {
        final String iUserName = "Mr " + aUserName;
        mUserName = iUserName;
    }

}

你怎么看?是推荐(或者确切地说不是)?我发现它在第一阶段非常难看,但是我使用它越多,我就越发现在使用大方法时它非常方便。

请注意我不是在谈论匈牙利符号,其中前缀表示类型而不是范围。

3 个答案:

答案 0 :(得分:1)

我还曾在具有严格前缀表示法要求的商店工作,但过了一段时间,这变成了一种“气味”,代码已失控,全局变量从各处泄漏,表明代码/评论不佳。 / p>

Java的“这个”。符号是在本地引用字段的首选方式。变量的“m”前缀的使用被“Micro ..”公司推广为品牌噱头(他们甚至说“不要因为我们这样做而使用”)。

我遵循的一般规则是根据用于存储的内容命名变量。变量名只是一个别名。如果它存储用户名,则userName有效。如果是用户名列表,则userNames或userNameList有效。但是,我现在避免在变量名中包含“type”,因为类型经常更改(在实践中不应该是用户名的集合?等等......)

在一天结束时,如果变量名对您有用,可以记住代码在路上发生的事情,那么这可能是一个好主意。可维护性和可读性胜过“感知”效率和简洁语法,特别是因为现代编译器根据宏使用模式重写代码。

我希望这会有所帮助,我很乐意提供有关此处任何声明的更多细节。

PS。我强烈推荐这些类型的问题的Java风格元素。我曾经和作者一起工作,在风格方面他们都是天才!

答案 1 :(得分:0)

注意:您的问题是一个非常基于意见的问题(这些天通常在StackOverflow中不赞成使用),但是我仍然认为这是一个值得讨论的话题。

这就是我的观点,这是什么意思:

我个人认为,在编写和阅读代码时,变量名范围的指示符可能会有所帮助。一些例子:

  • 如果我正在阅读类方法,但没有看到任何“ m_XXX”正在使用,则可以得出结论:“此函数也可能是静态的-它不使用实例数据。”如果名称中包含这些信息,可以通过快速扫描变量来完成。
  • 每当我看到“ g_XXX”(全局)时,我都会开始担心,并会更加注意((特别是写到全局上是一个很大的危险信号,尤其是尤其是)任何涉及的并发/线程。
  • 说到并发性,可变数据的“安全性”有一个非常明确的排序:本地人很好,成员很危险,全局变量很危险。因此,在考虑此类代码时,牢记可变范围很重要。因此,在C / C ++中,我认为为函数静态变量添加前缀也很有用(在该函数调用中,它们本质上是“全局”的)。在这种情况下,更多的是表明寿命而不是范围。
  • 它可以帮助初级开发人员更积极地考虑上述问题。

此约定的流行程度因语言而异。我最经常在C ++和C语言中看到它。 Java有点频繁。在Python,Perl,Bash或其他“脚本”语言中不是很多。我想知道“高性能”代码与这种方案的收益之间是否存在某种关联。不过,也许只是历史的偶然。另外,某些语言的语法已经包含一些此类信息(例如Python的self.xxx)。

我说不要理会任何类似“哦,微软为XYZ发明的东西,请忽略它”或“它看起来笨拙”的说法。只要有用,我就不在乎谁发明了它,或者为什么或它是什么样子(:

旁注:某些IDE可以为您提供范围信息(通过将鼠标悬停,进行特殊突出显示或其他方式),并且我可以理解,使用这种系统的人发现将这些信息放在变量名中是多余的。如果您的整个团队都使用这样的标准环境,那就太好了;也许您不需要命名方案。通常情况下,人与人之间会有一些差异,或者您的代码审查和差异工具可能没有提供类似的功能,因此,在很多情况下,将信息放入文本本身很有用。

在理想的世界中,我们将只有不使用大量变量的小函数,并且这样的命名前缀尝试解决的问题将不存在(或者小到不能保证“破坏”所有代码的问题)这样的方案只是为了改善一些极端情况。 但是我们并不生活在理想的世界中。

小功能很棒,但有时不切实际。您的算法可能具有无法用您的语言简洁表达的固有复杂性,或者您可能还有其他限制(例如性能或可用的开发时间)要求您编写“难看的”代码。由于上述原因,在这种情况下以及其他情况下,命名方案都可以提供帮助。

答案 2 :(得分:0)

具有变量命名约定对团队非常有用,并且IMO必须用于非字符串类型的语言。例如JScript。

在Jscript中,唯一的类型是“ var”,它基本上是在运行时评估的。在Jscript中,用预期包含在其中的数据类型来修饰变量变得更加重要。使用您的团队可以决定的一致前缀,例如s或str,或txt表示字符串,i / j / l / l / m / n表示整数(例如FORTRAN :-),q表示double,obj或o表示非原始数据,等等。除非变量名称清楚地表明了数据类型,否则不要使用没有任何前缀的变量名称。

例如

变量名“答案”是一个不好的名字,因为答案可以是文本或数字,因此它必须是 strAnswer或sAnswer,jAnswer,qAnswer等。

但是

“ messageText”或“ msgTxt”足够好了,因为很明显内容是一些文本。

但是将变量命名为“ dataResponse”或“ context”会造成混淆。

有时在服务器上需要修复或调试某些东西,并且在最坏的情况下,唯一的编辑器是vi或记事本nano / sed,在这种情况下,编辑器没有上下文帮助,制定编码约定确实会有所帮助。

如果遵循约定,则读取代码也更快。就像用前缀先生或女士来确定性别一样。帕特先生或帕特女士...当帕特本身不告诉帕特里克或帕特里夏的性别时...