命名
有意义且为名词
Bad:
const yyyymmdstr = moment().format("YYYY/MM/DD");
Good:
const currentDate = moment().format("YYYY/MM/DD");
一致性
Bad:
getUserInfo();
getClientData();
getCustomerRecord();
Good:
getUser()
不使用硬编码、使用可解释的变量
Bad:
setTimeout(blastOff, 86400000);
Good:
// Declare them as capitalized named constants.
const MILLISECONDS_PER_DAY = 60 * 60 * 24 * 1000; //86400000;
setTimeout(blastOff, MILLISECONDS_PER_DAY);
避免使用暗示的变量
这条我有疑问。 因为在 swift 里面建议使用 $0 作为默认变量。而 kotlin 中使用 it 作为默认变量。
避免使用不必要的上下文
Bad:
const car = {
carName: 'xxx',
carBrand: 'xxxx'
}
Good:
const car = {
name: 'xxx',
brand: 'xxx'
}
使用默认参数,而不是短路参数或条件参数
函数
小于等于两个参数
多了建议包装成对象,如果对象较大,考虑抽成另一个类。
一个函数只处理一件事
函数名应该使用动词
不要超过 20 行
不要重复代码
这点的问题就在于要注重函数的行为,而不是函数的实现。
使用 Object.assign 设置默认参数
不要使用 flag 参数
但是其实大部分使用 flag 的场景,就在于这样可以避免非常多的重复代码。如何去解决这个问题?
不要有副作用
不要写入全局函数
Bad:
Array.prototype.diff = function diff(comparisonArray) {
const hash = new Set(comparisonArray);
return this.filter(elem => !hash.has(elem));
};
Good:
class SuperArray extends Array {
diff(comparisonArray) {
const hash = new Set(comparisonArray);
return this.filter(elem => !hash.has(elem));
}
}
使用高阶函数
封装条件式、避免使用否定条件句
这个真的很重要。
isValid、isNotValid 都是 OK 的。保证调用的时候不要使用 !,!isValid 就不行了。
移除不需要的代码、注释
对象和数据结构
内部使用私有变量,然后使用 getter 和 setter 暴露出去
类
使用 es6 的类,而不是原型链
使用 method chain
优先组合而不是继承
SOLID
单一职责原则
一个类或者一个函数只应该做一件事。其实把代码尽可能封装的短一些就容易做到了。
开闭原则
对扩展开放,对修改关闭。
里氏替换原则
子类出现的地方都可以替换成父类。
这一条保证子类永远是增强父类的,而不能去修改父亲的一些默认行为。
接口隔离原则
接口的单一职责原则。如果一个类用不了所有的接口,就应该把这些接口拆分成不同的接口,再组合就好了。也就是说一个类不可以有没有实现的接口。
依赖倒置原则
比如说我现在可以在类里面声明一个实例,然后去调用。更好的方式应该是从客户端声明一个实例传入这个类中使用。
最少知道原则
最好的体现就是你该把对一个类的处理封装到自己的类,而不是到其他类中处理。