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

Java 在变量名称前加前缀以指示其各自的范围或来源?,java,naming-conventions,scope,prefix,notation,Java,Naming Conventions,Scope,Prefix,Notation,在我工作过的公司中,我看到很多使用前缀来表示变量的范围或来源,例如类成员的m、方法内部变量的I、方法参数的a(或p): 公共类用户{ 私人弦乐博物馆名称; 公共字符串setUserName(最终字符串aUserName){ 最终字符串iUserName=“Mr”+aUserName; mUserName=iUserName; } } 你觉得怎么样?是否建议(或确切地说不建议)?在第一阶段,我发现它非常难看,但是我使用它越多,在处理大型方法时,我发现它就越方便 请注意,我不是在说匈牙利符号,这里

在我工作过的公司中,我看到很多使用前缀来表示变量的范围或来源,例如类成员的
m
、方法内部变量的
I
、方法参数的
a
(或
p
):

公共类用户{
私人弦乐博物馆名称;
公共字符串setUserName(最终字符串aUserName){
最终字符串iUserName=“Mr”+aUserName;
mUserName=iUserName;
}
}
你觉得怎么样?是否建议(或确切地说不建议)?在第一阶段,我发现它非常难看,但是我使用它越多,在处理大型方法时,我发现它就越方便


请注意,我不是在说匈牙利符号,这里的前缀表示类型而不是范围。

我也在有严格前缀符号要求的商店工作过,但过了一段时间,这变成了一种“气味”代码已经失控,全局变量到处泄漏,这表明代码/审查很差

Java的“this.”表示法是引用字段的首选方式,而不是本地字段。使用“m”前缀作为变量被那个“Micro..”公司作为一种品牌宣传手段推广(他们甚至说“不要使用它,因为我们使用它”)

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

最后,如果变量名有助于您记住代码在执行过程中所做的事情,那么这可能是一个好主意。可维护性和可读性胜过“感知”的效率和简洁的语法,特别是因为现代编译器正在根据宏使用模式重写代码

我希望这能有所帮助,我很乐意提供更多的索赔细节


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

注意:你的问题是一个非常基于意见的问题(现在StackOverflow普遍不赞成),但我仍然认为这是一个值得讨论的话题

因此,以下是我的观点,以说明它的价值:

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

  • 如果我正在阅读一个类方法,但没有看到任何“m_XXX”被使用,我可以得出结论“这个函数也可能是静态的——它不使用实例数据。”如果名称中有这些信息,可以通过快速扫描变量来完成
  • 每当我看到“g_XXX”(全局),我都会开始担心,并更加关注(:尤其是向全局写入是一个巨大的危险信号,尤其是在涉及任何并发/线程的情况下
  • 说到并发性,可变数据的“安全性”有一个非常明确的顺序:局部变量是可以的,成员是危险的,全局变量是非常危险的。因此,在考虑这类代码时,记住变量范围是很重要的。因此,在C/C++中,我认为为函数静态变量指定前缀也很有用(在该函数的调用中,它们本质上是“全局的”)。在这种情况下,更像是生命周期而不是范围的指示
  • 它可以帮助初级开发人员更积极地思考上述问题
<>这个惯例的流行性因语言而不同。我在C++和C中经常看到它。java有点频繁。在Python、Perl、Bash或其他“脚本”语言中,它不太多。我想知道“高性能”之间是否存在某种关联。编码并从这样一个方案中受益。不过,可能只是历史上的偶然事件。此外,一些语言的语法已经包含了其中的一些信息(例如Python的
self.xxx

我说,忽略任何类似“哦,微软为XYZ发明了它,忽略它”或“它看起来很笨重”的论点。我不在乎是谁发明了它,也不在乎它为什么或者它看起来像什么,只要它有用(:

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

在理想情况下,我们将只有不使用大量变量的小函数,而这样的命名前缀试图解决的问题将不存在(或者小到不足以保证使用这样的方案“破坏”所有代码,只是为了改进某些特殊情况)。 但我们并不是生活在一个理想的世界里


小函数很好,但有时并不实用。您的算法可能具有无法用您的语言简洁表达的固有复杂性,或者您可能有其他限制(如性能或可用开发时间),需要您编写“丑陋的”代码。出于上述原因,命名方案在这种情况下以及其他情况下可能会有所帮助。

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

在Jscript中,唯一的类型是“var”,它基本上是在运行时计算的。在Jscript中,用th类型修饰变量变得更加重要