对我来说,命名变量类似于给婴儿一个名字。它可以告诉我们一些关于他们是谁或他们将成为什么。我对挑选合适的人的想法过于思考。这不仅仅是变量。还有功能,参数,类,软件包,源文件和目录。许多程序员已经认识到命名事物的困难,但很少使用明确的准则。首先,我们将解决使用指南的好处,然后我们将介绍一些从Clean Code借来的命名指南。坚实的基础将帮助我们入门。
使名字有意义的好处
找到某个变量或功能的唯一名称,我们中有多少人被停止并感到惊讶?一位著名工程师曾经说过:
计算机科学中只有两种困难:缓存无效和命名事物
但是,正确命名的东西为什么如此重要?
当您有这样的想法时,您知道斗争是否意味着什么?这实际上是做什么的?我们很少有人知道有意名称的价值。它的重量会延续到未来。它可能对您和您的团队产生负面影响。如果没有,相反的效果将在以下领域改善:
- 一致性
熟悉您的代码会产生信心。命名指南鼓励了这一期望。这在团队环境中尤其有效。即使作为一般指南,我们也想使用标准。否则,我们将互相挑选的命名能力,并在《代码审查》或《开发过程中途》中进行讨论。
- 可读性
当您了解某些东西时,您可以减轻认知负担。没有人喜欢让他们的头变得扭曲。通过清晰,您有效地传达了代码的目的,队友将感谢您。
当我发现自己被卡住并盯着一个名字时,我被赋予了一项任务,可以在现有代码库上进行一些返工。我不了解那里,直到我更深入地研究了代码的实施。为什么首先没有自我解释?
- 生产力
没有事先的准则或命名的思想会使您无法完成项目或任务。
您重读代码实现,以找出正在发生的事情。超过要求的时间还要多。事实证明,从长远来看,未能花时间正确命名您的软件。
不要低估良好标题或名称的影响。拥有好名称会增加代码集成并消除误解,从而改善其他领域,例如代码可维护性和代码重复使用!
命名指南(和最佳实践)的入门套件
要建模命名指南,我们需要知道如何设计名称。这需要编程方面的经验,尤其是一个团队。
幸运的是,已经很少有很棒的模型,我们可以得到一些曝光以建立我们的基础。
命名准则应在代码库中共享和使用。他们是关于使用什么而不使用的协议。
这是我的外卖,带有干净的代码和其他文章,提供了一些出色的观点。
使用意图浏览名称
考虑可变,功能或类的大问题。回答以下问题:为什么它存在,以及如何使用。
当您找到真正的目的时,再次更改名称
当我们选择姓名并编写代码时,我们没有完成。回顾一下,看看昨天的代码今天是否有意义。随着新的信息和功能即将到来,考试中的代码的目的可能会改变。
避免虚假信息和非信息
信息在命名方面具有一致性,并且经常使用现有知识来帮助其命名。我们不想始终拿出词典,也不想在我们的浏览器中查找术语。 虚假信息没有直接回答代码要做的事情。因此,它缺乏意义和透明度。同时,非信息 do 具有含义或线索。
- 缩写可能是虚幻的。
一般而言缩写是不建议的。
例如c
可以代表“碳”,“摄氏”或“ Century”
与现有编程概念交织在一起的名称令人困惑。
例如。 str
可以表示“强度”,也可以用编程术语“字符串”。它的项目范围会有所不同,但是当您制作RPG游戏时,您可能会有这种冲突。
但是,我会为被循环的列表例外。
例如。 cards
是一个数组,我只期待一个项目。
cards.map((c) => c);
c
可以被重写为卡,但已经暗示。
- 零
0
,lowercaseo
,大写O
和小写L是真正可怕的变量名称。
很难判断数量零,字母“ O”,大写和小写之间的差异。小写字母“ L”和数字1
是一样的。更重要的是!
,例如
let a = l;
if ( O == l ) {
a = O1;
} else {
l = 01;
}
- 数字系列命名是非信息的。
他们也可以用象形文字写。
,例如
Array.prototype.swap = function (x1, x2) {
var b = this[x1];
this[x1] = this[x2];
this[x2] = b;
return this;
}
x1
可能是source
,而x2
可能是target
。
做出有意义的区别
当遇到经常给出非常通用的名称的类似概念时,您可能会很想在其他任何地方都使用它稍微调整的版本。但是您可以(这只是懒惰的命名)。
当您遇到以下内容时,进行进一步的区别:
- 以“ s”结尾
例如。 apple
的复数只是一个字母与apples
不同。有了未经训练的眼睛,程序员可能会错过这个边缘细节。可以通过使它们成为集体名词来解决它们。想想basketOfApples
或bunchOfApples
。
- 噪音单词相同的含义,不同的拼写
甚至不将相同的术语用于两个不同的目的。
例如。 totalOfCash
和amountOfIncome
有什么区别?他们俩的意思是同一件事。找出特异性和分化。
使用明显的名称
当您进入技术领域时,编程是一项社交活动,您会感到惊讶。因此,如果您可以发音要引用的变量,那么您将无法进行讨论而不会听起来很愚蠢!
使用可搜索的名称
当名称变得更加唯一时,代码编辑器中的搜索栏可以缩小结果。当要重构代码库时,这是必不可少的。
在这里,我们如何使名称更加搜索:
使用更长的名称
单个字母的名称导致最大歧义。较长的名称充当更好的标识符,并提供足够的上下文。
有一个例外:单字母名称在简短方法中的局部变量中还可以。请参阅中的示例避免虚假信息和非信息缩写可以是虚假信息,其中绘制了阵列以及已经暗示的项目。
。在原始值上使用恒定命名约定
例如max_passenger_on_board告诉您的数字9。
班级名称
这是一些经典指南,用于协助命名为对象语言中存在的类别。
- 名词或名词短语名称
通过使用名词,您可以理解new
关键字的初始化。
,例如
const apple = new Fruit("sweet", "crunchy");
使用附加的动词或动词不太有意义。例如new createFruit()
,new Swim()
。
思考具体的单词,具有单一明确含义的东西。
- 向不同状态开放
避免在调用更改状态的方法时与状态不一致的类名称。
使名称较少具体。
例如。 new FelineDomesticAnimal
与不能或不能成为的东西过于封闭(它说只允许猫)。像new Animal
这样的东西允许更多的多样性。
覆盖所有预期值。不将手段写成结局。避免矛盾。写这个字段。使用适用于状态可以保留的值的名称。
例如。使用方法start
和end
的类可能具有像Race
这样的名称,而不是FinalRace
。 “最终”表明它与方法end
相同。
使其具有包容性。
方法名称
方法名称应该是动词或动词短语名称。
例如。 saveDocument
,playMusic
或delete
。
对于辅助,突变器和谓词,JavaBeans Naming Convention表示应以其价值命名,并以get
和set
的前缀为前缀。因此,仅将其用于现场访问。
,例如
const grade = student.grade();
teacher.setGrade(80);
对于具有副作用的方法,请勿使用get
,is
或has
前缀。
使用解决方案域名
不要害怕使用计算机科学术语,算法名称,模式名称,数学术语等。阅读您的代码的人是程序员。
,如果没有程序员,请使用问题域名。与问题域概念有关的代码应具有从中得出的名称。即使我们可能不知道这意味着什么,我们至少可以询问域专家的含义。它节省了编写自己的名称城堡并来回引用给定的蓝图域名的麻烦。
添加有意义的上下文
名称本身可能是有意义的,但是当它们不是时,您需要将它们放在读者的上下文中。将它们包装在命名良好的类,功能或名称空间中。如果失败,请前缀名称添加必要的上下文。
总结说
清晰是国王。我们为人类编写代码,而不仅仅是满足计算机的编译器。我们想浏览我们的代码,并尽快生产。我们不想花一个小时来解密代码名称。我不怪别人,这很难命名。一项既定的命名指南有助于提高我们在决定名称方面分享的困难,我们都可以同意并感到轻松理解。一旦成为经验丰富的开发人员,您就可以自定义或改进标准!
参考
-
罗伯特·塞西尔·马丁(Robert Cecil Martin)。美国马萨诸塞州斯托顿市的Clean Code: A Handbook of Agile Software Craftsmanship。
-
乔拉斯。 Meaningful Names — A Dimension of writing Clean Code。 2017(文章)
-
Peter Hilton和Felienne Hermans。 Naming guidelines for professional programmers22017(文章)