浅谈JavaScript 代码整洁之道(12)

使用方法链

在这里我的意见与《代码整洁之道》的观点不同。有人认为方法链不整洁,而且违反了得墨忒耳定律。也许他们是对的,但这个模式在 JavaScript 中非常有用,你可以很多库中看到,比如 jQuery 和 Lodash。它让代码变得既简洁又有表现力。在类中,只需要在每个函数结束前返回 this,就实现了链式调用的类方法。

不好:

class Car {
 constructor() {
  this.make = 'Honda';
  this.model = 'Accord';
  this.color = 'white';
 }

 setMake(make) {
  this.name = name;
 }

 setModel(model) {
  this.model = model;
 }

 setColor(color) {
  this.color = color;
 }

 save() {
  console.log(this.make, this.model, this.color);
 }
}

let car = new Car();
car.setColor('pink');
car.setMake('Ford');
car.setModel('F-150')
car.save();

好:

class Car {
 constructor() {
  this.make = 'Honda';
  this.model = 'Accord';
  this.color = 'white';
 }

 setMake(make) {
  this.name = name;
  // NOTE: 返回 this 以实现链式调用
  return this;
 }

 setModel(model) {
  this.model = model;
  // NOTE: 返回 this 以实现链式调用
  return this;
 }

 setColor(color) {
  this.color = color;
  // NOTE: 返回 this 以实现链式调用
  return this;
 }

 save() {
  console.log(this.make, this.model, this.color);
 }
}

let car = new Car()
 .setColor('pink')
 .setMake('Ford')
 .setModel('F-150')
 .save();

多用组合,少用继承

大家都知道 GoF 的设计模式,其中提到应该多用组合而不是继承。对于继承和组合,都有大量的理由在支撑,但这个准则的要点在于,你的想法本能地会想到继承,但这时候不防多思考一下用组合是否能更好的处理问题——某些时候,的确能。

你可能会考虑:“我什么时候该用继承?”这取决于你遇到的问题。这里有一个不错的清单说明了什么时候用继承比用组合更合适:

  1. 你的继承是一个“is-a”关系,而不是“has-a”关系(Animal->Human 对比 User->UserDetails)。
  2. 可以从基础复用代码 (人可以像所有动物一样移动)。
  3. 你想通过修改基础来实现对所有子类的全局性更改。(改变动物移动时的热量消耗)。

不好:

class Employee {
 constructor(name, email) {
  this.name = name;
  this.email = email;
 }

 // ...
}

// 这样不好,因为 Employees "拥有" 税务数据。EmployeeTaxData 不是属于 Employee 的一个类型
class EmployeeTaxData extends Employee {
 constructor(ssn, salary) {
  super();
  this.ssn = ssn;
  this.salary = salary;
 }

 // ...
}

好:

class Employee {
 constructor(name, email) {
  this.name = name;
  this.email = email;

 }

 setTaxData(ssn, salary) {
  this.taxData = new EmployeeTaxData(ssn, salary);
 }
 // ...
}

class EmployeeTaxData {
 constructor(ssn, salary) {
  this.ssn = ssn;
  this.salary = salary;
 }

 // ...
}
      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/417.html