本文转载自微信公众号《前端引力》,作者一川。转载本文请联系前端Gravity公众号。重组数据重组数据常用的方式有:splitvariablefieldrenametoqueryinsteadofderivedvariablechangereferenceobjecttovalueobjectchangevalueobjecttoreferenceobject1.splitvariable变量在代码中的用途不同,有的使用会导致临时变量被多次赋值,如:循环语句中的变量、结果集合变量(通过整个函数运行构造的值)。当然也有很多变量只赋值一次,以保存冗长代码的计算结果。如果他们承担多重职责(多次赋值),就意味着他们需要拆分成职责不同的变量。其实就是修改要分解的变量的声明名称及其初始赋值,并尽量将变量声明设置为不可修改(其实就是用const)。以变??量的第二次赋值动作为界,修改此时对该变量的所有引用,使其引用新变量。原代码:letheight=2,width=3;lettemp=4*(height+width);console.log(temp);temp=height*width;console.log(temp);重构代码:constheight=2,width=3;constperimeter=4*(height+width);console.log(perimeter);constarea=height*width;console.log(area);2。字段重命名有助于程序中广泛使用的记录结构和数据结构阅读和理解代码逻辑,其字段的命名尤为重要。数据结构的作用无非是让代码更简洁、更有条理,但其实随着时间的推移,我们对代码的理解也更加透彻,这时候我们会根据它们对一些字段进行重命名功能和业务。让我们看一下如何重命名字段。首先判断当前记录的范围。当范围较小时,可以直接修改该字段的所有代码。当然,如果范围较大,可以先封装记录,重命名对象内部的私有字段,相应调整内部函数访问字段。原代码:classUser{constructor(data){this._name=data.name;this._age=data.age;}getname(){returnthis._name;}setname(newName){this._name=newName;}getage(){returnthis._age;}setage(newAge){this._age=newAge;}}constyichuan=newUser({name:"yichuan",age:18});重构代码:classUser{constructor(data){this._title=data.title;this._age=data.age;}gettitle(){returnthis._title;}settitle(newTitle){this._name=newTitle;}getage(){returnthis._age;}setage(newAge){this._age=newAge;}}是不是很简单,把字段名相应改一下就可以了。3.用查询替换派生变量要知道软件错误的来源当数据是可变的时,数据的修改往往会导致代码各部分的耦合,即在一个地方修改后,会导致意想不到的结果另一个地方的灾难。当然,完全消除可变数据是不现实的,因此应将可变数据的范围缩小到可控范围内。计算可以清楚地表达数据的含义,并且可以最大限度地避免在修改源数据时忘记更新派生变量。有些变量随时都可以很容易地计算出来,如果你能消除这个变量,你就离消除数据可变性又近了一步。如果计算的源数据是不可变的,也可以强制计算结果不可变,这样就不必消除计算的派生变量。因此,可以从源数据生成新数据结构的转换操作保持不变,即使它们已被计算操作取代。看具体例子,原代码如下::getdiscountedTotal(){returnthis._baseTotal-this._discount;}setdiscountedTotal(discount){this._discount=discount;}4.将引用对象变为值对象当将一个对象嵌入到另一个对象中时,内部对象被称为引用对象,也可以称为值对象。当然,两者最明显的区别在于如何更新内部对象的属性:如果把内部对象看成是一个引用对象,更新其属性时可以保留原来的对象,而只更新内部对象的属性。更新内部对象;如果把内部对象当成值对象,可以替换整个内部对象,可以为新对象设置新的属性值。在实际操作中,首先要检查重构目标是否为不可变对象,或者不可变对象是否可以修改,然后逐步去除所有设置函数。提供使用对象字段的基于值的相等函数。原始代码:classProduct{applyDiscount(arg){this._price.amount-=arg;}}重构代码:classProduct{applyDiscount(arg){this._price=newMoney(this._price.amount-arg,this._price.currency)}}5.将值对象更改为引用对象。数据结构中可能有多个记录,这些记录都与同一个逻辑数据结构相关联。多次复制相同的数据可能会带来麻烦,因为这会导致内存使用问题,从而导致性能问题。如果共享数据需要更新,可以将数据的多个副本变成单个引用,数据修改可以反映在变化中。为相关对象创建一个仓库后,确保构造函数可以找到相关对象的正确实例,并修改宿主对象的构造函数以从仓库中获取相关对象。//原代码letcustomer=newCustomer(data);//重构代码letcustomer=customerRespository.get(data.id);小结本文主要介绍如何在代码中重组数据,完善数据结构。参考文章《重构──改善既有代码的设计(第2版)》
