注意:你的问题是一个非常基于意见的问题(这些天在 StackOverflow 上通常不受欢迎),但我仍然认为这是一个值得讨论的话题。
所以这是我的观点,因为它的价值:
就个人而言,我认为变量名称中的范围指示符在编写和阅读代码时都会有所帮助。一些例子:
- 如果我正在读取一个类方法并且我没有看到任何“m_XXX”被使用,我可以得出结论“这个函数也可能是静态的——它不使用实例数据。” 如果名称具有该信息,则可以通过快速扫描变量来完成此操作。
- 每当我看到“g_XXX”(全局)时,我都会开始担心,并密切关注(:尤其是写入全局是一个很大的危险信号,尤其是在涉及任何并发/线程的情况下。
- 说到并发,可变数据的“安全性”有一个非常明确的顺序:本地人没问题,成员很危险,全局人非常危险。因此,在考虑此类代码时,记住变量范围很重要。出于这个原因,在 C/C++ 中,我认为函数静态变量的前缀也很有用(它们本质上是跨函数调用的“全局”)。在这种情况下,更多的是生命周期的指示而不是范围。
- 它可以帮助初级开发者更积极地思考上述问题。
该约定的受欢迎程度因语言而异。我经常在 C++ 和 C 中看到它。Java 有点频繁。在 Python、Perl、Bash 或其他“脚本”语言中不是很多。我想知道“高性能”代码和从这种方案中受益之间是否存在某种关联。不过,也许只是历史偶然。此外,某些语言的语法已经包含一些此类信息(例如 Python 的self.xxx
)。
我说忽略“哦,微软为 XYZ 发明了这个,忽略它”或“它看起来很笨重”之类的任何论点。我不在乎是谁发明了它,为什么发明它或它看起来像什么,只要它有用(:
旁注:一些 IDE 可以为您提供范围信息(通过悬停鼠标、进行特殊突出显示或其他方式),我可以理解使用此类系统的人发现将这些信息放在变量名中是多余的。如果您的整个团队都使用这样的标准环境,那就太好了;也许您不需要命名方案。但是通常人们之间会有一些差异,或者您的代码审查和差异工具可能不提供类似的功能,因此仍然经常存在将信息放入文本本身的情况。
在理想的世界中,我们将只有不使用大量变量的小函数,并且这样的命名前缀试图解决的问题将不存在(或者小到不会保证用这样的方案“破坏”你的所有代码只是为了改善一些极端情况)。但我们并不生活在一个理想的世界里。
小功能很棒,但有时这并不实用。您的算法可能具有无法用您的语言简洁表达的固有复杂性,或者您可能有其他限制(例如性能或可用开发时间),需要您编写“丑陋”的代码。由于上述原因,命名方案可以在这种情况和其他情况下有所帮助。