汕头网站制作怎么做,大连金州,浏览器官网入口,用js来做网站1、拆分变量#xff08;Split Variable#xff09; 有些变量用于保存一段冗长代码的运算结果#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任#xff0c;它就应该被…1、拆分变量Split Variable 有些变量用于保存一段冗长代码的运算结果以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任它就应该被替换分解为多个变量每个变量只承担一个责任。同一个变量承担两件不同的事情会令代码阅读者糊涂。 有两种情况除外
循环变量loop variable会随循环的每次运行而改变例如forlet i0; i10; i语句中的 i结果收集变量collecting variable负责将“通过整个函数的运算”而构成的某个值收集起来。
2、字段改名Rename Field 将字段改为易于理解的名字不要出现类似 int a等。 3、以查询取代派生变量Replace Derived Variable with Query 可变数据是软件中最大的错误源头之一。对数据的修改常常导致代码的各个部分以丑陋的形式互相耦合在一处修改数据却在另一处造成难以发现的破坏。很多时候完全去掉可变数据并不现实但我还是强烈建议尽量把可变数据的作用域限制在最小范围。 例如
get discountedTotal() {return this._discountedTotal;}
set discount(aNumber) {const old this._discount;this._discount aNumber;this._discountedTotal old - aNumber;
} 改为
get discountedTotal() {return this._baseTotal - this._discount;}
set discount(aNumber) {this._discount aNumber;}
4、将引用对象改为值对象Change Reference to Value 在把一个对象或数据结构嵌入另一个对象时位于内部的这个对象可以被视为引用对象也可以被视为值对象。两者最明显的差异在于如何更新内部对象的属性如果将内部对象视为引用对象在更新其属性时我会保留原对象不动更新内部对象的属性如果将其视为值对象我就会替换整个内部对象新换上的对象会有我想要的属性值。 如果把一个字段视为值对象我可以把内部对象的类也变成值对象[mf-vo]。值对象通常更容易理解主要因为它们是不可变的。一般说来不可变的数据结构处理起来更容易。我可以放心地把不可变的数据值传给程序的其他部分而不必担心对象中包装的数据被偷偷修改。我可以在程序各处复制值对象而不必操心维护内存链接。值对象在分布式系统和并发系统中尤为有用。 何时不应该使用本重构手法如果我想在几个对象之间共享一个对象以便几个对象都能看见对共享对象的修改那么这个共享的对象就应该是引用。这便是5中的情况了。 4的例子
class Product {applyDiscount(arg) {this._price.amount - arg;}
} 改为
class Product {applyDiscount(arg) {this._price new Money(this._price.amount - arg, this._price.currency);}
}
5、将值对象改为引用对象Change Value to Reference 一个数据结构中可能包含多个记录而这些记录都关联到同一个逻辑数据结构。例如我可能会读取一系列订单数据其中有多条订单属于同一个顾客。遇到这样的共享关系时既可以把顾客信息作为值对象来看待也可以将其视为引用对象。如果将其视为值对象那么每份订单数据中都会复制顾客的数据而如果将其视为引用对象对于一个顾客就只有一份数据结构会有多个订单与之关联。 如果顾客数据永远不修改那么两种处理方式都合理。把同一份数据复制多次可能会造成一点困扰但这种情况也很常见不会造成太大问题。过多的数据复制有可能会造成内存占用的问题但就跟所有性能问题一样这种情况并不常见。 如果共享的数据需要更新将其复制多份的做法就会遇到巨大的困难。此时我必须找到所有的副本更新所有对象。只要漏掉一个副本没有更新就会遭遇麻烦的数据不一致。这种情况下可以考虑将多份数据副本变成单一的引用这样对顾客数据的修改就会立即反映在该顾客的所有订单中。