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++中,我认为为函数静态变量指定前缀也很有用(在该函数的调用中,它们本质上是“全局的”)。在这种情况下,更像是生命周期而不是范围的指示
- 它可以帮助初级开发人员更积极地思考上述问题
self.xxx
)
我说,忽略任何类似“哦,微软为XYZ发明了它,忽略它”或“它看起来很笨重”的论点。我不在乎是谁发明了它,也不在乎它为什么或者它看起来像什么,只要它有用(:
旁注:一些IDE可以为您提供范围信息(通过鼠标悬停、进行特殊高亮显示或其他方式),我可以理解,使用这种系统的人会发现将这些信息放在变量名中是多余的。如果你的整个团队都使用这样的标准环境,那就太好了;也许你不需要命名方案。但通常人与人之间会有一些差异,或者你的代码审查和差异工具没有提供类似的功能,所以在很多情况下,将信息放在文本中是很有用的
在理想情况下,我们将只有不使用大量变量的小函数,而这样的命名前缀试图解决的问题将不存在(或者小到不足以保证使用这样的方案“破坏”所有代码,只是为了改进某些特殊情况)。
但我们并不是生活在一个理想的世界里
小函数很好,但有时并不实用。您的算法可能具有无法用您的语言简洁表达的固有复杂性,或者您可能有其他限制(如性能或可用开发时间),需要您编写“丑陋的”代码。出于上述原因,命名方案在这种情况下以及其他情况下可能会有所帮助。具有变量命名约定对团队非常有用,IMO必须用于非字符串类型的语言,例如JScript 在Jscript中,唯一的类型是“var”,它基本上是在运行时计算的。在Jscript中,用th类型修饰变量变得更加重要