我如何训练自己给出更好的变量和函数名称(程序中的任何用户定义名称)。
8 回答
实践。
每当您编写或阅读代码(包括其他人的代码)时,请始终考虑它。试着弄清楚你会在他们的代码中做些什么不同的事情,并在可能的情况下与他们讨论(但不要喋喋不休,那会很麻烦)。问他们为什么选择某个名字。
看看你的代码在没有注释的情况下阅读效果如何。如果你需要评论你命名的东西的基本目的,考虑它是否可以有一个更好的名字。
最重要的是积极的心理参与:练习。
想名字似乎是一些人非常不擅长的事情,我不确定治愈方法是什么。当我还是一名从事商业培训的讲师时,我经常会看到这样的情况:
我:好的,现在你需要创建一个整数变量来包含 getchar() 返回的值。
[学员开始打字,我在培训室里转悠。大多数人都做得很好,但一个人像鹿一样坐着,冻住了车头灯]
我:有什么问题?
他:我想不出这个变量的名字!
所以,我会给他们一个名字,但我觉得有这个问题的人在编程方面不会走得太远。或者问题可能是他们走得太远了......
这是一个主观问题。
我努力使我的代码与库(或至少与标准库)保持一致,以便代码具有统一性。我建议:看看标准库函数是如何命名的。寻找模式。了解存在哪些不同的命名约定。看看哪一个最有意义。例如:大多数 Java 代码使用非常大的标识符名称、Camel 大小写等。C 使用简洁/短名称。然后是匈牙利符号——当编辑器不够聪明,无法为您提供类型信息时,这是值得的。现在,您可能不需要它。
几年前, Joel Spolsky 写了一篇关于匈牙利符号的有用文章。他的主要见解是:
让我们尝试提出一个编码约定,以确保如果您犯了这个错误,代码只会看起来是错误的。如果错误的代码至少看起来是错误的,那么它很有可能被正在编写该代码或审查该代码的人发现。
他继续展示了如何以严格的方式命名变量可以改进我们的代码。关键是,避免错误比使我们的代码更“可维护”具有更快和更明显的投资回报率。
阅读一些好的代码并模仿它。这是学习任何东西的普遍方式;只需用适当的词替换“阅读”和“代码”即可。
找到富有表现力的名称的一个好方法是从文本描述您的软件实际功能开始。函数(方法)名称的良好候选者是动词,用于类名词。如果你先做设计,一种方法是文本分析。
(即使您只是一个 1 人团队)与您的同事商定编码标准,以便大家使用相同的命名约定。(例如,对于快速返回的值,通常使用属性,但对于需要时间计算的值,使用 GetXXX 或 CalculateXXX 方法。这种约定让调用者更好地了解他们是否需要缓存结果等)。尝试对等效概念使用相同的名称(例如,不要像微软在 .net 中那样混合使用 Array.Count 和 List.Length!)
试着像其他人写的一样阅读你的代码(即忘记你所知道的一切,只是阅读它)。是否有意义?它是否解释了他们理解它需要知道的一切?(可能不是,因为我们都忘记描述我们“知道”或“显而易见”的东西。回过头来澄清命名和文档,以便其他人可以拿起你的代码文件并轻松理解它)
保持名称简短但具有描述性。写一个完整的句子是没有意义的,但是在大多数 IDE 中都有自动完成功能,除非它是一个非常标准的缩写,否则缩写任何东西也没什么意义。
不要浪费字符告诉某人这个字符串是一个字符串(匈牙利符号的常见解释)。使用描述某事物的作用以及如何使用它的名称。例如,我使用前缀来表示用法(m=member、i=iterator/index、p=pointer、v=volatile、s=static 等)。这是访问变量时的重要信息,因此它是对名称的有用补充。它还允许您将一行代码复制到电子邮件中,并且接收者可以准确理解所有变量的用途 - 静态 volatile 和参数之间的用法差异通常非常重要。
在名称中描述变量的内容或方法的用途,避免使用技术术语,除非您知道代码的所有读者都知道这些术语的含义。使用您能想到的最简单的描述 - 复杂的单词和技术术语听起来很聪明且令人印象深刻,但更容易被误解(例如,在我的脑海中:Collation 或 SortOrder、Serialise 或 Save ——尽管这些都是众所周知的词编程所以不是很好的情况)。
避免使用模糊和近乎无意义的术语,例如“价值”、“类型”。对于基类属性尤其如此,因为您最终会在派生类中得到一个“类型”,并且您不知道它是哪种类型。使用“JoystickType”或“VehicleType”,含义立即清晰得多。
如果您使用带单位的值,请告诉人们名称中的含义(角度度而不是角度)。这个简单的技巧将阻止你的宇宙飞船撞向火星。
对于 Visual Studio 中的 C#、C++、C,尝试使用AtomineerUtils将文档注释添加到方法、类等。此工具从您的名称派生自动文档,因此您的名称越好,文档越好,您需要的工作量就越少把完成的文件关闭。
阅读“代码完成”一书,更具体地说是关于命名的第 11 章。这是清单(从这里开始,需要免费注册):
一般命名注意事项
名称是否完整准确地描述了变量所代表的内容?这个名字是指现实世界的问题而不是编程语言的解决方案吗?这个名字是否足够长,你不必把它弄糊涂?计算值限定符(如果有)是否位于名称的末尾?该名称是否使用 Count 或 Index 而不是 Num?
命名特定类型的数据
循环索引名称是否有意义(如果循环长度超过一两行或嵌套,则不是 i、j 或 k)?是否所有“临时”变量都被重命名为更有意义的东西?是否命名了布尔变量,以便它们为 True 时的含义清晰?枚举类型名称是否包含指示类别的前缀或后缀?例如,Color_ 代表 Color_Red、Color_Green、Color_Blue 等等?命名常量是根据它们所代表的抽象实体而不是它们所引用的数字来命名的吗?
命名约定
约定是否区分本地、类和全局数据?约定是否区分类型名称、命名常量、枚举类型和变量?约定是否以不强制执行它们的语言识别例程的仅输入参数?该约定是否尽可能与该语言的标准约定兼容?名称的格式是否便于阅读?
简称
代码是否使用长名称(除非必须使用短名称)?代码是否避免只保存一个字符的缩写?所有单词的缩写是否一致?名字可发音吗?是否避免使用可能被错误发音的名称?短名称是否记录在翻译表中?
常见的命名问题:您是否避免...
...具有误导性的名称?...具有相似含义的名称?...名称仅相差一两个字符?...听起来相似的名字?...使用数字的名称?...名称故意拼写错误以使其更短?...在英语中通常拼写错误的名称?...与标准库例程名称或预定义变量名称冲突的名称?...完全任意的名字?...难以阅读的字符?