5

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

public class User {

    private String mUserName;

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

}

你怎么看待这件事?是否推荐(或完全不推荐)?在第一阶段我发现它非常难看,但是我使用它的次数越多,我发现它在处理大型方法时就越方便。

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

4

3 回答 3

2

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

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

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

归根结底,如果变量名有助于您记住代码在路上做了什么,那么这可能是一个好主意。可维护性和可读性胜过“感知”的效率和简洁的语法,尤其是因为现代编译器正在根据宏使用模式重写您的代码。

我希望这会有所帮助,并且很乐意在此处提供任何索赔的更多细节。

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

于 2013-06-18T02:37:35.663 回答
0

注意:你的问题是一个非常基于意见的问题(这些天在 StackOverflow 上通常不受欢迎),但我仍然认为这是一个值得讨论的话题。

所以这是我的观点,因为它的价值:

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

  • 如果我正在读取一个类方法并且我没有看到任何“m_XXX”被使用,我可以得出结论“这个函数也可能是静态的——它不使用实例数据。” 如果名称具有该信息,则可以通过快速扫描变量来完成此操作。
  • 每当我看到“g_XXX”(全局)时,我都会开始担心,并密切关注(:尤其是写入全局是一个很大的危险信号,尤其在涉及任何并发/线程的情况下。
  • 说到并发,可变数据的“安全性”有一个非常明确的顺序:本地人没问题,成员很危险,全局人非常危险。因此,在考虑此类代码时,记住变量范围很重要。出于这个原因,在 C/C++ 中,我认为函数静态变量的前缀也很有用(它们本质上是跨函数调用的“全局”)。在这种情况下,更多的是生命周期的指示而不是范围。
  • 它可以帮助初级开发者更积极地思考上述问题。

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

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

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

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

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

于 2019-11-07T17:31:05.687 回答
0

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

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

例如

变量名“answer”是一个坏名字,因为 answer 可能是文本或数字,所以它必须是 strAnswer 或 sAnswer 、 jAnswer 、 qAnswer 等。

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

但是将变量命名为“dataResponse”或“context”是令人困惑的。

有时在服务器上需要修复或调试某些东西,而在最坏的情况下,唯一的编辑器是 vi 或记事本 nano / sed,在没有来自编辑器的上下文帮助的情况下,有一个编码约定真的很有帮助。

如果遵循约定,阅读代码也会更快。这就像有一个前缀先生或女士来确定性别。Mr.Pat 或 Ms.Pat... 当 Pat 本身不告诉 Patrick 或 Patricia 的性别时...

于 2019-11-08T07:01:39.713 回答