从个人的编码历程总结一些经验。如有收获,还请关注——猩猩伸手.jpg
命名规范
变量命名
我们应该根据变量存储的数据或信息来命名变量,而不是它们应该触发的内容。这是因为触发的操作可以随时更改。
-
• 布尔值:is开头或者has
-
• 对象:Obj结尾
-
• 数组:array或者list
-
• 字符串:Str结尾或desc结尾
-
• 数字:count结尾或者length结尾
-
• 变量缩写:单词是六个字符以上且缩写是通用的
-
• 如果想严苛要求:可以有一个项目常用词汇表,之前发现有些人的缩写方式会不一样。
函数/类 命名
类名
应采用名词且具有通用意味,不必加上Manager等带有身份、动作的词汇。那应该是实例的变量名。
函数名
-
• 对于完成某件事的函数使用动词:如filter()
-
• 对于返回布尔值的:如isEmpty()
-
• 对于单纯得到属性的:getCount 或者count都可以
不要因为节省声明变量而无脑复用
一个变量只做一件事,因为会发生阅读问题和数据不明确。
function ninjaFunction(elem) {
// 基于变量 elem 进行工作的 20 行代码
elem = clone(elem);
// 又来 20 行代码,现在使用的是 clone 后的 elem 变量。
}
避免变量名过度简洁或者不适宜的缩写
例如dynamicValidateForm,缩写成dvf,可阅读性差。
部分复用的常量适当提取
可以设定输入输出的结构,将常量作为固定结构输入,从而使得输出也是预期的。
下划线:仅在常量使用(私有变量)
不过看具体的项目要求,有些eslint会配置成不允许用下划线。
函数体/方法体
边路处理
如果边路处理有必要存在(往往是因为区分不同状态),做相应处理。
在写下if的时候,需要考虑else时的数据状态,否则就会导致bug。
将错误情况前置
-
• 剩下代码皆是正常流程
-
• 减少阅读困难,两个连续的块会增加阅读量
function deal(num){
if(isEmpty(num)) return;
// do something
}
错误提示
无意义的错误提示不如不做。
不必循环获取的不需要存在于循环块中
常量、初始化步骤等只需要一次值的,提取到循环块外。
这种常用于for/while循环中,就不举例了。
传值和传引用
这个问题相当于函数式编程:是否应该编写一些纯函数,让执行过程变得可靠且可控。
这是为了避免在传递值的过程中被动修改了值属性,减少在繁杂处理数据的流程中排查哪一步出现问题的时间。
function deal(originData){
let data=add(originData);
data=reduceByArray(data);
//...等等一系列操作
// 然后return后发现数据异常,开始一步步排查
return data
}
复用功能相同的方法
哪怕是状态重置这种初始化的简单语句,也应当提取。
因为提取函数的一个优点在于,函数名编写得当的时候,阅读代码相当于看文档。
关于函数参数个数问题
当函数参数过多的时候,可适当利用引用结构(将其变成选项)
function test({need=true}){}
注释
函数注释
需要描述:函数作用、函数参数
vscode中的可利用Document This插件
代码注释
注释应该是注释Why,而不是How和What
在code和commit中,code可以看出what和How,而在commit中也会体现How,所以这时候注释就应该是Why——为什么需要这一段代码?
-
• 废弃代码的注释应该删除
-
• 不必用注释来解释明显的语句
-
• 别在注释里面说需求
-
• TODO型注释记得在完成后删除
----END
推荐阅读
看完一篇文章就该休息了,别看了,推荐个毛啊。该走走动动,放松眼睛和拉伸身体。工作虽重要,但生活才是人生的重点