JavaScript 变量命名规范总结

╰半夏微凉° 2022-10-11 13:53 336阅读 0赞

计算机科学中只有两个难题:缓存失效和命名。 —— Phil Karlton

任何人都能写出计算机能够理解的代码,只有好程序员才能写出人能够理解的代码。—— Martin Flower

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

好的代码读起来如同在读一段文章:

  1. function startEditing() {
  2. if (user.canEdit(currentDocument)) {
  3. editorControl.setEditMode(true);
  4. setButtonDown(btnStartEditing);
  5. }
  6. }

“牛逼”的代码五花八门,这里来段非常牛逼的大家感受下:

  1. const john = new Lady('lily');
  2. console.log(john.name); // 当看到控制台输出 "rose" 你是什么感受?

再看一个变量名逐步迭代的过程:

  1. // bad
  2. const fruit = ['apple', 'banana'];
  3. // ok
  4. const fruitArr = ['apple', 'banana'];
  5. // good
  6. const fruits = ['apple', 'banana'];
  7. // great
  8. const fruitNames = ['apple', 'banana'];
  9. const fruits = [
  10. { name: 'apple', color: 'red' },
  11. { name: 'banana', color: 'yellow' },
  12. ];

看完以上几个示例,我们就知道自己在变量命名这么一件简单的事情上达到了什么层次。当然,其实这个”小事“并不简单,且很重要。本文从「符合命名规范」和「有意义的命名」两个维度,提出了一些实操建议,欢迎拍砖。

符合规范的命名 Comply with naming conventions

用小驼峰形式命名 Use (lower) camelCase

第一个字母小写,剩下的每个单词的首字母大写。

常量可以采用全大写的形式,但普通的const修饰的变量不应该大写 Capitalize constant values (if you want)

  1. const HOURS_IN_DAY = 24;
  2. const USER_AGE = 30;
  3. // bad 下面这些并不是常量,只是不会被修改的变量
  4. const USER = findUser();
  5. const TODAY = new Date();

另外附带说明下,代码里应该避免使用魔法数字。

两个字母的缩略词都大写,大于两个则改驼峰 Capitalize two-letter acronyms

  1. IO
  2. AppID
  3. // bad
  4. Io
  5. APPID

下划线是有特定意义的,不要乱用 Avoid underscores in your names

  1. this._myPrivateMethod = function () { /* ... */ };
  2. // bad
  3. const _someGlobalVar = 1;

有意义的命名 Be expressive

Most of these conventions are not for you today, but instead, for you and the people reading your code tomorrow.

使用具描述性的名字 Use meaningful names

这一条包含的信息比较宽泛,这里稍微再展开下:

  • 命名要精确表意,不能太宽泛,更不能词不达意
    • 同一个事物可能有多个单词适配,选最合适的
    • 同一个词有多种含义
  • 使用业务术语。应避免从电脑的视角去命名,而是应该从人类认识事物的角度去命名
  • 尽量避免用缩略语
  • 避免使用黑话。我知道你是业内大佬,但我是小菜菜
  • 单词拼拼对。推荐安装「Code Spell Checker」或其他类似插件

    getUserPosts

    // bad 含义过于宽泛,不精确
    getUserData
    getUserInfo

    // bad 不要用单个单词的变量,如果只是很小的范围内使用的临时变量则无大碍
    global.d = new Date()

用词应尽量精简,无法精简长些也无妨,不能为了精简而放弃语义 When in doubt, favor descriptive over concise

  1. findUserByNameOrEmail
  2. setUserLoggedInTrue
  3. // bad 选词应该尽量精简,但必须保证语义的确定性
  4. findUser
  5. getUserFriend
  6. // bad "FromDatabase" 提供了多少附加信息? 这种可以精简掉
  7. getUserFriendFromDatabase

在上下文中保证意义明确 Be meaningful within their context

这一条可以认为是上面两条的结合,命名不应该重复上下文信息

  1. Class Employee {
  2. constructor (name) {
  3. // good
  4. this.name = name;
  5. // bad 因为本身就处在 Employee 这个上下文中,信息冗余
  6. this.employeeName = name;
  7. }
  8. }
  9. // 这里在 name 前加 employee 是有必要的,因为已经脱离了 Employee 这个上下文
  10. const employeeName = new Employee('gavin').name;

保证动词的统一性 Use consistent verbs per concept

常用的动词有get set read create add update reset delete remove等。

  1. getQuestion
  2. getUserPosts
  3. getUsers
  4. // bad 有很多近意动词,选一个一直用,不要变来变去
  5. getQuestion
  6. returnUsers
  7. retrieveUsers

函数或方法名尽量采用动词或判断性词汇 Use verbs for function names

函数名一般由一个 动词 加一个 名词 组成,如 getUser getInfo isArray。

  1. getFullYear() // 取值
  2. toString() // 转换
  3. isArray() // 判断

布尔值的命名 Make booleans that read well in if-then statements

布尔值一般用is can has need等助动词开头,如 isVisible hasLicense canEvaluate shouldAbort。返回布尔值的函数或方法,命名规则相同,如 Array.isArray(arr)。但这样容易出现函数名和变量名冲突的情况,这个时候可以在函数前加check get等区分。

  1. const hasApple = checkHasApple(fruits, 'apple');
  2. // hasApple 是否包含苹果
  3. // checkHasApple 判断是否包含苹果

数值的命名

首选有意义的简短命名,如 width length count,如果没有合适的就采用 numberOfXXX xxxCount 之类的通用命名

  1. width
  2. length
  3. total
  4. maxWidth
  5. numberOfErrors
  6. errorCount

类名用名词 Use nouns for class names

  1. class Car { }
  2. new User()
  3. // bad 类本来就是一类事物的抽象,加动词干啥
  4. class MakeCar { }

字典(Map)的命名

推荐使用 valuesByKey 的方式,如 usersByID。

  1. const usersByID = {
  2. id12345: { name: 'byted', age: 9 },
  3. // ...
  4. };
  5. // bad
  6. values // 提供的信息不够充分
  7. keysToValuesMap // 名字里不要体现类型,类型信息交给 TypeScript 记吧
  8. mapOfKeysToValues
  9. mapFromKeysToValues

参考资料

  • https://medium.freecodecamp.org/javascript-naming-conventions-dos-and-don-ts-99c0e2fdd78a?gi=6fd69ae402f7
  • https://hackernoon.com/the-art-of-naming-variables-52f44de00aad
  • https://wiki.c2.com/?GoodVariableNames

如果觉得这篇文章还不错

点击下面卡片关注我

来个【分享、点赞、在看】三连支持一下吧e1044adbb789e4b8f076bde40911c22d.png

9081ca06c55c74c70fd4c5091f8221e0.png

“分享、点赞、在看” 支持一波

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python 变量命名规范

    引言 > 混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。相反,良好的命名,则可以让我们的代码非常容易读懂,也能向读者正

    相关 变量命名规范

    为了代码清晰易懂,通常变量名采用一些著名的命名规则,主要有Camel标记法,Pastal标记法和匈牙利标记法。 Camel标记法采用首字母小写,接下来的单词都以大写字母开头的