代码整洁之道——4、类

一、优先使用ES6语法的类而不是ES5的纯函数

传统的ES5类语法很难拥有类的继承、构造函数和方法的定义。如果你需要使用继承(要注意的是,你可能不需要),那么就用ES2015/ES6的类。但是,在你发现你需要更大更复杂的对象的之前,尽量使用小巧的函数。

Bad:
const Animal = function(age) {
  if (!(this instanceof Animal)) {
    throw new Error(‘Instantiate Animal with `new`‘);
  }

  this.age = age;
};

Animal.prototype.move = function move() {};

const Mammal = function(age, furColor) {
  if (!(this instanceof Mammal)) {
    throw new Error(‘Instantiate Mammal with `new`‘);
  }

  Animal.call(this, age);
  this.furColor = furColor;
};

Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.liveBirth = function liveBirth() {};

const Human = function(age, furColor, languageSpoken) {
  if (!(this instanceof Human)) {
    throw new Error(‘Instantiate Human with `new`‘);
  }

  Mammal.call(this, age, furColor);
  this.languageSpoken = languageSpoken;
};

Human.prototype = Object.create(Mammal.prototype);
Human.prototype.constructor = Human;
Human.prototype.speak = function speak() {};

Good:
//定义一个动物类,有age属性和move方法
class Animal {
  constructor(age) {
    this.age = age;
  }
  move() { /* ... */ }
}
//定义一个哺乳动物类继承动物类,除了animal的属性和方法外还有自己的liveBirth方法
class Mammal extends Animal {
  constructor(age, furColor) {
    super(age);
    this.furColor = furColor;
  }

  liveBirth() { /* ... */ }
}

//定义人类这个类继承哺乳动物,除哺乳动物的属性和方法外,还有自己的languageSpoken属性和speak方法
class Human extends Mammal {
  constructor(age, furColor, languageSpoken) {
    super(age, furColor);
    this.languageSpoken = languageSpoken;
  }

  speak() { /* ... */ }
}

二、使用方法链

这个模式在JS中非常有用,你可以在很多像jquery、lodash等库中看到。它可以让你的代码简洁而富有表现力。正是因为这个原因,所以我说使用方法链,然后看下你的代码可以变得多么简洁。在你的类函数中,在每个函数的最后简单的返回this,你就可以把这个类的方法链在一起。

Bad:
class Car {
  constructor(make, model, color) {
    this.make = make;
    this.model = model;
    this.color = color;
  }

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

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

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

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

const car = new Car(‘Ford‘,‘F-150‘,‘red‘);
car.setColor(‘pink‘);
car.save();

Good:
class Car {
  constructor(make, model, color) {
    this.make = make;
    this.model = model;
    this.color = color;
  }

  setMake(make) {
    this.make = make;
    // 为链式调用返回this
    return this;
  }

  setModel(model) {
    this.model = model;
    // 为链式调用返回this
    return this;
  }

  setColor(color) {
    this.color = color;
    // 为链式调用返回this
    return this;
  }

  save() {
    console.log(this.make, this.model, this.color);
   // 为链式调用返回this
    return this;
  }
}

//链式调用
const car = new Car(‘Ford‘,‘F-150‘,‘red‘)
  .setColor(‘pink‘)
  .save();

三、优先使用组合而不是继承

正如著名的设计模式(Design Patterns )所论述的一样,你应该尽可能的使用组合而不是继承。使用组合和继承的优点都有很多。这则论述的主要观点是:如果你本来想用继承,那么想想组合能不能替代,大部分情况下都是可以的。

你可能会想,什么时候我需要使用继承呢?这取决于你手头的问题,这有个列表说明什么时候使用继承比使用组合好:

1、你的继承代表的“是一个”的关系而不是“有一个”的关系。(人类继承自动物,用户有用户明细Human->Animal vs. User->UserDetails)

2、你可以重用基类的代码。(人类像动物一样拥有move方法)

3、你想要通过改变积累来全局(改变子类继承自基类的方法)(改变动物运动时的热量消耗)

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

  // ...
}

//不好是因为EmployeeTaxData 并不是Employee 的一种类型。而是Employee 有EmployeeTaxData 。
class EmployeeTaxData extends Employee {
  constructor(ssn, salary) {
    super();
    this.ssn = ssn;
    this.salary = salary;
  }

  // ...
}

Good:
class EmployeeTaxData {
  constructor(ssn, salary) {
    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);
  }
  // ...
}
时间: 2024-11-08 10:07:40

代码整洁之道——4、类的相关文章

【《代码整洁之道》精读与演绎】之五 整洁类的书写准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52344732 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写整洁类的一些法则. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上可靠,也为

《代码整洁之道》读后感

众所周知,软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发派还是传统开发派,都不得不承认.<代码整洁之道>提出一种观念:代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好的基础.作为编程领域的佼佼者,这些实践在<代码整洁之道>中体现为一条条规则(或称“启示”),并辅以来自现实项目的正.反两面的范例.只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量.以上便是<代码整洁之道>这本书的内容简介,

《代码整洁之道》精读与演绎】之四 优秀代码的格式准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://blog.csdn.net/poem_qianmo/article/details/52268975 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写代码过程中一些良好的格式规范. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上

&lt;代码整洁之道&gt;、&lt;java与模式&gt;、&lt;head first设计模式&gt;读书笔记集合

一.前言                                                                                       几个月前的看书笔记,内容全部都是摘自书中比较精辟的句子.笔记都是一段一段的句子,故没有文章的篇幅概念,仅供温习之用,更多详细内容请看原书!!! <代码整洁之道>里面有很多前人编写简洁.漂亮代码的经验.当然书中作者的经验并不100%适合每个人,但大部分都是可借鉴的! <java与模式>这本书内容太多了,我

【读书笔记】--代码整洁之道

“相对于任何宏伟景愿,对细节的关注甚至是更为关键的专业性基础.首先,开发者通过小型实践获得可用于大型实践的技能和信用度.其次,宏伟建筑中最细小的部分,比如关不紧的门,有点儿没有铺平的地板,甚至是凌乱的桌面,都会将整个大局的魅力毁灭殆尽.这就是整洁代码之所系”----没有比书中的这段话更能说明这本书的意义了. <代码整洁之道>是第1期书山有路活动选出的读本.相对于记住那些如何写出整洁代码的那些法则,养成保持代码整洁.提高代码质量的习惯和思维更为重要.全书大致分为三个部分,第一部分1-10章都是介

代码整洁之道

命名,多花些时间推敲命名, 有意义的命名非常重要. 接口的命名,不使用"I"开头比较简洁,加上I以后是比较规范,但是比较繁琐以及废话.如果想区别接口和实现,不如在实现类中进行编码,比如添加后缀"Imp",android以及jdk中的大多数接口都没有使用I. 取名字带有简写要慎重, 比如"人事系统"的类, 前面都是"RSXT..",除了让快捷按钮找不到类以外,没有啥意义了,用包吧. 函数,函数要短小,要职责明确,最好功能单一,参

【《代码整洁之道》精读与演绎】之四 优秀代码的书写格式准则

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52268975 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起聊一聊,书写代码过程中一些良好的格式规范. 一.引言 以下引言的内容,有必要伴随这个系列的每一次更新,这次也不例外. <代码整洁之道>这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量

&lt;读书笔记&gt; 代码整洁之道

概述 1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一种,代码质量与整洁成正比的观点,并给出了一系列行之有效的整洁代码操作实践,只要遵循这些规则,就可以编写出整洁的代码,从而提升代码质量. 3.该书介绍的规则均来自于作者多年的实践经验,涵盖从命名到重构的多个编程方面,具有很好的学习和借鉴价值. 4.习艺要有二:知和行.你应当学习有关规则.模式和实践的知识,穷尽应知之事,并

代码整洁之道读后感(三)

注释 注释不能美化糟糕的代码 用代码来阐述你的思路 好的注释是什么? 法律信息 提供信息的注释 对意图的解释 警示:例如 // Don't run unless you have some time  to kill TODO注释 公共API的JavaDoc 坏的注释是什么? 多余的注释 误导性的注释 循轨式注释:所谓每个函数都要有JavaDoc活每个变量都要有注释的规矩简直是愚蠢.这类注释只会让代码混乱不堪. 日志式注释 废话式注释: Default Constructor 信息过多:别再注释

代码整洁之道读后感(一)

什么是整洁代码?         Bjarne Stroustrup  C++语言发明者:         整洁的代码只做好一件事.         破窗理论:窗户破损了的建筑让人觉得似乎无人照管,于是别人也不关心,放任窗户继续破损.最终自己也参加破坏活动,在外墙上涂鸦,任垃圾堆积,一扇破损的窗户开辟了大厦走向倾颓的道路.         Grady  Booch   面向对象分析与设计  一书作者:         整洁的代码简单直接,整洁的代码如同优美的散文.从不隐藏设计者的意图,充满了干净