clean-code-javascript

262 阅读2分钟

命名

有意义且为名词

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));
  }
}

使用高阶函数

封装条件式、避免使用否定条件句

这个真的很重要。

isValidisNotValid 都是 OK 的。保证调用的时候不要使用 !!isValid 就不行了。

移除不需要的代码、注释

对象和数据结构

内部使用私有变量,然后使用 getter 和 setter 暴露出去

使用 es6 的类,而不是原型链

使用 method chain

优先组合而不是继承

SOLID

单一职责原则

一个类或者一个函数只应该做一件事。其实把代码尽可能封装的短一些就容易做到了。

开闭原则

对扩展开放,对修改关闭。

里氏替换原则

子类出现的地方都可以替换成父类。

这一条保证子类永远是增强父类的,而不能去修改父亲的一些默认行为。

接口隔离原则

接口的单一职责原则。如果一个类用不了所有的接口,就应该把这些接口拆分成不同的接口,再组合就好了。也就是说一个类不可以有没有实现的接口。

依赖倒置原则

比如说我现在可以在类里面声明一个实例,然后去调用。更好的方式应该是从客户端声明一个实例传入这个类中使用。

最少知道原则

最好的体现就是你该把对一个类的处理封装到自己的类,而不是到其他类中处理。