详解一些适用于Node.js的命名约定

时间:2021-05-25

序言

There are only two hard things in Computer Science: cache invalidation and naming things.
-- Phil Karlton

我乔鲁诺·乔巴拿有一个梦想,便是要成为程序员巨星。但如果你看过我写的代码,便知道我还远远够不上“巨星”二字。我的代码中有许多不一致的命名:

  • 常量的命名时而是全大写的(如WAIT_CONFIRM),时而是全小写的;
  • 某个项目大部分命名用的是camel case(如TaskController),但由于数据库中的列名用了snake case(如context_id),导致项目中与数据库列有关的代码混用了camel case和snake case(如restricted_hours[new Date(timestamp * 1000).getHours()] = 1;);
  • 同样是构造复杂对象的函数,它们的前缀可能会是build、create、make,甚至compute中的任何一个;
  • 明明是一个数组,却用了单数的order作为变量名。
  • 之所以如此混乱,正是因为我没有遵循一套一致的命名规则。每当我在一个项目中蹦出一些新想法时,便会跃跃欲试——不,我真的就用上了。我不曾整理过自己的命名规则(天哪我已经写了三年的JavaScript了),以至于无从判断“新想法”是否真的新——也许它是一个已经被我抛弃的规则。

    为了不再深陷不一致命名的泥潭,我定下了本篇的命名规则,期望它们为以后的我指点迷津。

    变量名

    通用规则

    • 变量名使用camel case的命名风格。例如,使用namingConvention,而不是naming_convention;
    • 在尽量遵循规则的基础上随机应变。

    变量名的单复数规则

    • 如果一个变量存储的值的类型为数组(即该变量作为Array.isArray方法的参数时结果为真),那么变量的名称就使用复数形式。例如,使用fruits = []而不是fruit = []。
    • 如果一个变量存储的值的类型为集合(即Set这个类型),那么变量的名称应当使用单词unique为前缀。例如,使用uniqueUserIds而不是userIdSet。

    布尔变量的命名规则

    如果一个变量的值的类型为boolean,那么变量的名称应当以下列单词为前缀:

    • is。当变量表达一个二元状态的时候,例如isFull、isEmpty。在is后面的应当是一个形容词;
    • has。当变量表达历史上是否发生过某个事件的时候,例如hasPaid、hasArrived。在has后面的应当是一个动词,并且采用过去分词;
    • can。当变量表达某种权限的时候,例如canWrite、canExecute。在can后面的应当是一个动词,并且采用现在分词。

    数值变量的命名规则

    • 如果变量中存储的是一系列数字中的最大值,那么变量的名称应当以max为前缀,例如maxScore。如果是最小值,则是以min为前缀,例如minScore;
    • 如果变量中存储的是一系列数字的和,那么变量的名称应当以total为前缀,例如totalIncome;
    • 如果变量中存储的是数组的长度,那么变量的名称可以用numberOf为前缀,例如numberOfUsers。

    字符串变量的命名规则

    • 如果表达的是人名、品牌名、公司名、数据库中的表名,那么变量的名称可以用单词name结尾,例如customerName、brandName、companyName;
    • 如果表达的是按键或按钮上刻着的文字、纸质表格或电子表单上输入框左侧的简短说明,那么变量的名称可以用单词label结尾,例如buttonLabel;
    • 不允许使用单词content

    函数名

    • 函数的名称应当由动词和名词组成,例如readFile、writeFile;
    • 如果函数的功能是将参数转换为另一种形式的输出(比如进制转换、币种转换),那么函数的名称应当以单词to为前缀,例如toDollar、toHexadecimal;
    • 如果函数的功能是检验参数并返回一个布尔值,那么函数的名称应当以单词check为前缀,例如checkIsDirectory、checkIsExecutable;
    • 如果函数的功能是“计数”,那么函数的名称应当以单词count为前缀,并且其中被计数的对象应当为复数形式,例如countPaidOrders。

    构造型函数的命名规则

    • 如果表达的是从无到有地创造一个对象,那么函数名可以用create作为前缀,例如createObject;
    • 如果表达的是将一些输入原封不动地放在一起(可能输入之间添加了其它东西)创造出一个对象,那么函数名可以用make作为前缀,例如makeFloor。进一步地,如果函数不改变输入的相对顺序,那么函数名可以用concat,例如concatString;
    • 如果函数会将根据输入创造出具有不止一个层级的对象,那么函数名可以用build作为前缀,例如buildBinarySearchTree。

    修改型函数的命名规则

    • 如果函数负责更新数据库中的记录,那么函数名应当以单词update为前缀;
    • 如果函数修改的是一些可枚举的状态,那么函数名应当以单词change为前缀。

    类名

    • 类的名称应当采用capital case的命名风格,例如DatabaseConnection;
    • 类的名称应当以一个名词结尾;
    • 如果类的存在是为了使用某种设计模式,那么类名应当可以反映在设计模式中所处的位置,例如在State模式中,代表具体状态的类的名称可以是InitialState、UnpaidState。

    参考资料

    The art of naming variables
    Google JavaScript Style Guide
    Letter case

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章