曾用名:以数据类取代记录(Replace Record with Data Class)
//重构前
organization = {name: "Acme Gooseberries", country: "GB"};
//重构后
class Organization{
constructor(data){
this.name = data.name;
this._country = data.country;
}
get name(){return this._name;}
set name(arg){this._name = arg;}
get country(){return this._country;}
set country(arg){this._country = arg;}
}
做法:
1、对持有记录的变量使用【封装变量】,将其封装到一个函数中。
记得为这个函数取一个容易搜索的名字
2、创建一个类,将记录包装起来,并将记录变量的值替换为该类的一个实例,然后在类上定义一个访问函数,用于返回原始的记录,修改封装变量的函数,令其使用这个访问函数。
3、测试
4、新建一个函数,让它返回该类的对象,而非那条原始的记录。
5、对于该记录的每处使用点,将原先返回记录的函数调用替换为那个返回实例对象的函数调用。使用对象上的访问函数来获取数据的字段,如果该字段的访问函数还不存在,那就创建一个,每次更改之后运行测试。
如果该记录比较复杂,例如是个嵌套解构,那么先重点关注客户端对数据的更新操作,对于读取操作可以考虑返回一个数据副本或只读的数据代理。
6、移除类对原始记录的访问函数,那个容易搜索的返回原始数据的函数也要一并删除。
7、测试
8、如果记录中的字段本身也是复杂结构,考虑对其再次应用【封装记录】或【封装集合】手法 。