JavaScript对象重构

admin5个月前笔记50

image.png

用常量来表示数字

如果我们有很多重复的值且表示一样的含义,但没有明确地说明,那么我们应该将它们转换为常量,以便每个人都知道它们的含义,并且如果需要更改,我们只需更改一个地方就行了。

例如我们可能会这样写代码:

const getWeight = (mass) => mass * 9.81 
const potentialEnergy = (mass, height) => mass * height * 9.81

对于含义相同的数学我可以用常量表示:

const GRAVITATIONAL_CONSTANT = 9.81; 
const getWeight = (mass) => mass * GRAVITATIONAL_CONSTANT 
const potentialEnergy = (mass, height) => mass * height * GRAVITATIONAL_CONSTANT

现在我们知道9.81实际上意味着GRAVITATIONAL_CONSTANT,我们不必重复自己。

上面我们用常量 GRAVITATIONAL_CONSTANT 表示 9.81 ,这样别人一看就知道它表示是万有引力常数常量。

封装字段

我们可以将getter和setter添加到类的字段中,这样就不心直接对类的字段进行操作。

例如我们可能会这样写代码:

class Person { 
  constructor(name) { 
    this.name = name; 
  } 
}

如果要控制如何设置值,可以这样重构:

class Person { 
  constructor(name) { 
    this._name = name 
  } 
 
  get name() { 
    return this._name 
  } 
 
  set name() { 
    this._name = name 
  } 
}

这样,我们就可以控制如何设置值,因为我们可以在setter中放入代码来设置名称。我们还可以控制谁能获得名称,因为它是在getter中返回的。

用数组类代替字段

我们可以将字段替换为其自己的数据类,这样在记录数据中会有更强灵活性。

例如我们可能会这样写代码:

class Person { 
  constructor(name, bloodGroup) { 
    this.name = name; 
    this.bloodGroup = bloodGroup; 
  } 
} 
const person = new Person('joe', 'a')

如果我们想扩充 bloodGroup (血型)的种类,我们可以把 bloodGroup 重构成一个类。

class BloodGroup { 
  constructor(name) { 
    this.bloodGroup = name; 
  } 
} 
class Person { 
  constructor(name, bloodGroup) { 
    this.name = name; 
    this.bloodGroup = bloodGroup; 
  } 
} 
const bloodGroup = new BloodGroup('a'); 
const person = new Person('joe', bloodGroup)

这样,我们就可以在bloodGroup字段中存储更多种类的数据。

用状态/策略替换类型代码

有时,我们可以根据对象的类型创建子类,而不是在类中使用类型字段。这样,我们就可以在它们自己的子类中拥有两个类不共享的更多成员。

例如我们可能会这样写代码:

class Animal { 
  constructor (type) { 
    this.type = type 
  } 
} 
 
const cat = new Animal('cat') 
const dog = new Animal('dog')

我们可以根据 type 类型来重构对应的类:

class Animal { 
  //... 
} 
class Cat extends Animal { 
  //... 
} 
class Dog extends Animal { 
  //... 
} 
const cat = new Cat(); 
const dog = new Dog();

在上面的示例中,我们单独编写一个Animal类,而另外添加Cat和Dog类,它们是Animal类的子类。

这样我们可以 Cat 和 Dog 类中共享的属性保存在各自的类的,把共享的放在 Animal 类中。

分解条件表达式

我们可以将长的条件表达式分解为更小的条件表达式。

例如我们可能会这样写代码:

let ieIEMac = navigator.userAgent.toLowerCase().includes("mac") && navigator.userAgent.toLowerCase().includes("ie")

我们可以这样重构它:

let userAgent = navigator.userAgent.toLowerCase(); 
let isMac = userAgent.includes("mac"); 
let isIE = userAgent.toLowerCase().includes("ie"); 
let isMacisMacIE = isMac && isIE;

我们将冗长又难懂的条件表达式分解多个短小表达式,这样会大大滴增加阅读性。

总结

如果我们有很多重复的值且表示一样的含义,但没有明确地说明,那么我们应该将它们转换为常量,以便每个人都知道它们的含义,并且如果需要更改,我们只需更改一个地方就行了。

为了更好控制类的属性,我们可以为它添加getter和setter方法。

如果我们有type字段,则可以用它们自己的子类替换它们。

最后,我们可以将长条件表达式分解为较小的条件表达式,以便于阅读和理解。


相关文章

教你如何破解 Centos 7 的 root 密码

教你如何破解 Centos 7 的 root 密码

1.开机启动,选择内核,按e键2.进入下图界面,修改ro为rw init=/sysroot/bin/sh3.按ctrl+x,会进入到一个shell界面,需要切换一下根,将/sysroot作为根输入:...

工作中用Redis最多的10种场景

工作中用Redis最多的10种场景

前言Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景,希...

深入的理解UDP编程

深入的理解UDP编程

什么是UDP?UDP是User Datagram Protocol(用户数据报协议)的缩写,它是一个简单的协议,简单到UDP规范RFC0768只有区区3页。UDP是工作在IP层之上的传输层协议,UDP...

地表最强-端口详解

查看端口在windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令:依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口。在命令提示符状态下键入“ne...

Nginx防盗链、Nginx访问控制、Nginx解析php相关配置、Nginx代理

Nginx防盗链、Nginx访问控制、Nginx解析php相关配置、Nginx代理

目录一、Nginx防盗链二、Nginx访问控制三、Nginx解析php相关配置四、Nginx代理一、Nginx防盗链配置Nginx防盗链和配置过期时间、不记录日志都用到location,所以可以把两部...

求职必会算法手把手教你二分法查找

求职必会算法手把手教你二分法查找

1、二分法查找的背景当数组或者集合中存放的元素数量非常多的时候,想要跟踪具体某个元素的位置或者是否存在,常规方式是循环每一个元素直到找到要查找的元素为止。这样的查找方式效率非常低下,这个时候需要使用二...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。