通用角度:
重构、Redesign、Remake
问题/需求一直都在,从没有改变,只是新需求在不断增加。immutable demand.
变的是解决问题、需求的方式。从而产生出各种各样的方法论、产品。
如何重构
忘掉之前的路径。以当前条件构建一条从原始状态到达目标状态的路径。
技术角度:
定义
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
动机
- 使新代码的增加更容易
- 改善既有代码的设计
- 更透彻地理解现有代码
重构的代价:C(X)=V*e^(X-X0)
注:C(X)为重构代价。V为重构的代码量。X为当前工程进度(0<X<1)。X0为一个基准自定义(0<X0<1),暂定为0.4。
意味着当工程进度X超过了X0,重构都会付出比预计更大的代价。
工程早期应该随时重构。
重构需要经验。
重构之前,代码必须能够在大部分情况下正常运作。否则,重构不如重写代码。
折中办法:将大的软件重构为封装良好的小型组件,然后逐一对组件做重构或重建。
重构基于可靠的测试环境。测试保证了重构的安全性。
测试驱动开发与持续重构能够导向优秀的设计。
重构的要点:
目的:低耦合,高内聚。
消除隐患:如移除对参数的赋值。分解临时变量。
提炼:提炼的对象可以是代码块、函数、类,更高层抽象等等。去除重复,简化复杂逻辑,提高复用率。
合并:将不适合分开来的,或者意图不清的相关代码,先合并起来。然后再采取其他方法重构。
置换:将长代码置换成短函数/变量。
释义:为长代码赋予变量,通过名称解释意图。
重构方法列表
- Add parameter(添加参数)
- Change bidirectional association to unidirectional(将双向关联改为单项)
- Change reference to value (将引用对象改为实值对象)
- Change unidirectional assocation to bidirectional(将单项关联改为双向)
- Change value to reference (将实值对象改为引用对象)
- Collapse hierachy(折叠继承体系)
- Consolidate conditional expression(合并条件式)
- Consolidate duplicate conditional fragments(合并重复的条件判断)
- Convert procedural design to objects(将过程化设计转化为对象设计)
- Decompose conditional (分解条件式)
- Duplicate observed data(复制”被监视数据”)
- Encapsulate collection (封装群集)
- Encapsulate downcast(封装”向下转型”动作)
- Encapsulate field(封装值域)
- Extract class(提炼类)
- Extract hierarchy (提炼继承体系)
- Extract interface(提炼接口)
- Extract method(提炼函数)
- Extract subclass(提炼子类)
- Extract superclass(提炼超类)
- Form template method(塑造模板函数)
- Hide delegate(隐藏委托关系)
- Hide method(隐藏函数)
- Inline class (将类内联化)
- Inline method(将函数内联化)
- Inline Temp(将临时变量内联化)
- Introduce assertion(引入断言)28. Introduce explaining ariable(引入解释性变量)
- Introduce foreign method(引入外加函数)
- Introduce local extension(引入本地扩展)
- Introduce null object(引入Null对象)
- Introduce prrameter object(引入参数对象)
- Move field (搬移值域)
- Move method(搬移函数)
- Parameterize method(令函数携带参数)
- Preserve whole object(保持对象完整)
- Pull up constructor body(构造函数本体上移)
- Pull up field(值域上拉)
- Pull up method(函数上拉)
- Pull down field(值域下降)
- Pull down method(函数下移)
- Remove assignments to parameters(移除函数的赋值动作)
- Remove control flag(移除控制标记)
- Remove middleman(移除中间人)
- Remove parameter(移除参数)
- Remove setting method(移除设置函数)
- Rename method(重新命名函数)
- Replace array with object(以对象取代数组)
- Replace conditionalwith polymorphism(以多态取代条件式)
- Replace constructor with factory method(以工厂方法取代构造函数)
- Replace data value with object(以对象取代数据值)
- Replace delegation with inheritance(以继承取代委托)
- Replace error code with exception(以异常取代错误码)
- Replace exception with test(以测试取代异常)
- Replace inheritance with delegation(以委托取代继承)
- Replace magic number with symbolic constant(以字面常量代替魔法数字)57. Replace method with method object(以函数对象取代函数)
- Replace nested conditional with guard clauses(以卫语句取代条件式)
- Replace parameter with method(以函数取代参数)
- Replace parameter with explicit methods(以明确函数取代参数)
- Replace record with data class(以数据类取代记录)
- Replace subclass with field(以值域取代子类)
- Replace temp with query(以查询取代临时变量)
- Replace type code with class(以类取代型别码)
- Replace type code with state/strategy(以state/strategy取代性别码)
- Replace type code with subclass(以子类取代型别码)
- Self encapsulate field(自封装值域)
- Separate domain from presentation (将领域和表述/显示分开)
- Separate query with modifier (将查询函数和修改函数分离)
- Split tempory variable(剖解临时变量)
- Substitue algorithm(替换你的算法)
- Tease appart inheritance(梳理并分解继