已阅读章节:
变量名的力量
组织直线型代码
不常见的控制结构
基本数据类型
变量名的力量
变量命名最重要的是要完全、准确的描述该变量代表的事物
如当前日期:currentDate
或todayDate
,被省略为cd
、current
、date
,不能明确的说明具体要表达什么,因此命名要清晰。
以问题为导向
名字反应的是问题(含义)而不是解决问题的动作,如一条个人成绩的输入
inputLine
远远没有personalScores
明确
变量名长度
最好控制在8~16个字符,不能太短,如i
最好用在循环变量且只有几行代码时,很明显这里的i
是局部变量,他的作用域就是那几行代码
但若代码被复制、移动,i这样的变量容易出错。所以慎用
限定词位置
变量中经常会有总量、最值的概念,请将其放在变量最后边,如ageAverage。
不过中国的思维是修饰词在前,一般会命名为maxLength
。
我认为项目中只要能保持统一即可!
临时变量命名
用temp、x、y等为临时变量命名,表明程序员还没把问题弄清楚
缩写
摘录几项中的缩写原则:
- 使用标准缩写
- 去掉虚词and、the、ing、ed
- 使用名字中的重要单词,不超过3个
- 避免语音缩写,change2Str是什么意思?
- 为省掉一个字符的缩写不推荐,如June写成Jun
- 缩写要保持一致,用Num或No,
不推荐使用No,太有歧义了,也不推荐直接使用Number,容易和数字类型混淆
如果你的项目中缩写只有自己能明白,请给出语义对照表!
避免的名字
- 避免使用含义相近的名字,如
inputValue
和input
- 避免使用语音相近的名字,如
clientRcs
和clientRps
,因为人们对于他们的心理距离太近了。 - 避免使用语音相近但含义不同的词汇,以免降低沟通效率,如
donor
和owner
- 避免完全靠大小写来区分单词,如
day
和DAY
- 避免名字中包含容易混淆的词,如
tableI
和table1
代码只写一次,但可能会被阅读很多次,所以,请为变量起一个几年后自己仍能明白的名字
组织直线型代码
必须明确执行顺序
前提是必须拆分功能,尽量做到(SRP)Single-Responsibilitv Principle
getData();
processData();
printData();
不要在processData中做获取数据的操作
还可将数据作为返回值,彻底避免顺序错乱
let data = getData();
data = processData(data);
printData();
做到代码能自上而下的阅读(很少有人能做到)
不常见的控制结构
根据不同条件直接返回不同结果,没有要执行其他操作
function compare(a, b) {
if (a > b) return 'moreThan';
if (a < b) return 'lessThan';
return 'equal';
}
而如果在返回结果之前需要判断类似非空的动作,可能会导致大量的条件嵌套,可以将条件判断分开执行,如
function _readFile(fileName, filePath) {
if (fs.existsSync(filePath)) { // 这里只是举个例子,可以直接用path + name判断文件是否存在
if (fs.existsSync(`${filePath}/${fileName}`)) {
// if () {
// More code hereeeeeee
}
}
}
}
上面的嵌套太不优雅了,可以在一次判断失败后做点什么,体现下自己的主权,咳咳
function example(a, b, c) {
if (!a) throw new Error('参数a无效');
if (!b) throw new Error('参数b无效');
if (!c) throw new Error('参数c无效');
process(a, b, c); // 真正的处理刚刚开始
}
还可以在if后面做更多的详细的处理,如参数a无效时请检查什么文件等等,
关于递归
好吧,原来用递归计算阶乘是非常愚蠢的行为,(谁编写的教科书?打他)因为栈空间会非常大,所以在使用递归时首先考虑其易理解性及内存耗损,如果循环和递归都能实现,考虑他们的优劣吧
基本数据类型
避免使用magic number
尤其是状态值,如果在代码的多处使用到,就更应该为其命名了
对于可能随着环境变化的常量值,最好将其命名,已好实现单点控制,让软件真正的软起来!
js中的浮点数计算
js中的浮点数计算可能会出错,要小心哦
19.9 * 100
// 1989.9999999999998
布尔变量
麻烦在代码中用变量名清楚的表达这个布尔值到底代表了什么
function fun() {
if (currentIndex < maxIndex || currentIndex < 0) {
// some code here
}
}
上面条件判断很不清晰,如果换成就一目了然了
function fun() {
const readFinish = currentIndex < maxIndex || currentIndex < 0;
if (readFinish) {
// some code here
}
}
不同类型变量之间的比较
代码调整
优化代码性能我们常常挂在嘴边,那如何优化以及何时优化呢?
- 首先应抛开一个普遍的误解:代码行数越少,性能越好,事实证明,用for循环给变量赋值的速度远低于直接给每个变量赋值的速度
- 至少在目前,我认为代码的性能需要边开发边优化,而我大部分时间也是这么做的,然而,有时候写代码时有没有感觉到可能当前正在写的一大坨代码后面可能被全盘删除或者用几行来代替,嗯(⊙o⊙)…,有时候我会有这样的想法,因为被印证过了。所以不要有这种执念,停留在原地容易一叶障目,也许在整体架构都出来时或者写到下一个用到目前模块的地方再来思考有哪些可以优化的地方是个好主意。