重构的设计原则

以下取自重构改善代码的既有设计
  1. 重新组织函数
    1. Extract Method 提炼函数
      将需要修改的代码放到一个独立函数中,并让函数名解释该函数的用法。
    2. Inline Method内联函数
      在函数调用点插入函数本体,然后移除该函数。
    3. Inline Temp 内联临时变量
      将所有对该变量的引用动作,替换为对它赋值的那个表达式自身。
    4. Replace Temp with Query 以查询取代临时变量
      将表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可以被其他函数使用。
    5. Introduce Explaining Variable 引入解释性变量
      将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量的名称来解释表达式的用途。
    6. Split Temporary Variable分解临时变量
      针对每次赋值,创造一个独立、对应的临时变量。
    7. Remove Assignments to Parameters移除对参数的赋值
      以一个临时变量取代该参数的位置
    8. Replace Method with Method Object以函数对象取代函数
      将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段,然后就可以在同一个对象中将这个大型函数分解为多个小型函数。
    9. Substitute Algorithm替换算法
      将函数本体替换为另一个算法。
  2. 在对象之间搬移特性
    1. Move Method 搬移函数
      在该函数最常引用的类中建立一个有着类似行为的新函数。或将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。
    2. Move Field 搬移字段
      在目标类中新建一个字段,修改源字段中的所有用户,令它们改用新字段。
    3. Extract Class提炼类
      建立一个新类,将相关的字段和函数从旧类搬移到新类。
    4. Inline Class将类内联化
      将这个类的所有特性搬移到另一个类中,然后移除原类。
    5. Hide Delegate隐藏委托关系
      在服务类上建立客户所需的所有函数,用以隐藏委托关系。
    6. Remove Middle Man移除中间人
      让客户直接调用委托类。
    7. Introduce Foreign Method引入外加函数
      在客户类中建立一个函数,并以第一参数的形式传入到一个服务类实例。
    8. Introduce Local Extension引入本地扩展
      建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或者包装类。
  3. 重新组织数据
    1. Self Encapsulate Field自封装字段
      为这个字段建立取值/设值函数,并且只以这些函数来访问字段。
    2. Replace Data Value with Object以对象取代数据值
      将数据项变成对象。
    3. Change Value to Reference 将值对象改为引用对象
      将这个值对象改为引用对象
    4. Change Reference to Value 将引用对象改为值对象
      将引用对象改为值对象
    5. Replace Array with Object以对象取代数组
      以对象替换数组,对于数组中的每个元素,以一个字段来表示。
    6. Duplicate Observed Data复制“被监视数据”
      将该数据复制到一个领域对象中,建立一个Observer模式,用以同步领域对象和GUI对象内的重复数据。
    7. Change Unidirectional Association to Bidirectional将单向关联改为双向关联
      添加一个反向指针,并使修改函数能够同时更新两条连接。
    8. Change Bidirectional Association to Unidirectional将双向关联改为单项关联
      去除不必要的关联。
    9. Replace Magic Number with Symbolic Constant以字面常量取代魔法数
      创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。
    10. Encapsulate Field封装字段
      将它声明为private,并提供相应的访问函数。
    11. Encapsulate Collection 封装集合
      让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数
    12. Replace Record with Data Class以数据类取代记录
      为该记录创建一个“哑”数据对象。
    13. Replace Type Code with Class以类取代枚举
      以一个新的class替换该枚举类型
    14. Replace Type COde with Subclasses以子类取代枚举
      以一个子类取代这个枚举变量
    15. Replace Type Code with State/Strategy
    16. Replace Subclass with Fields以值域取代子类
      如果你的各个subclasses的唯一差别只在返回常量数据的函数身上,修改这些函数,使它返回superclass中的某个新增值域,然后销毁subclasses
  4. 简化条件表达式
    1. Decompose Conditional分解条件式
      从if 、else 的段落中分别提炼出独立函数
    2. Consolidate Conditional Expression合并表达式
      合并可以合并的条件式,并将这个条件式提炼成为一个独立函数。
    3. Consolidate Duplicate Conditional Fragments 合并重复的条件片段
      将重复的代码搬移到条件式之外。
    4. Remove Control Flag 移除控制标记
      以break语句或者return语句取代控制标记。
    5. Replace Nested Conditional with Guard Clauses以卫语句取代嵌套条件式
      使用卫语句表现所有的特殊情况。
    6. Replace Conditional with Polymorphism以多态取代表达式
      如果有一个条件式,会根据对象类型的不同而选择不同的行为,将这个表达式每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数。
    7. Introduce Null Object引入Null对象
      将null value替换为null object
    8. Introduce Assertion引入断言
      如果某一段代码需要对程序状态做出某种假设。那么请以assertion明确表现这种假设。
  5. 简化函数调用
    1. Rename Method
    2. Add Parameter
    3. Remove Parameter
    4. Separate Query from Modifier将查询函数和修改函数分离
    5. Parameterize Method令函数携带参数
    6. Replace Parameter with Explicit Methods 以明确函数取代参数
    7. Preserve Whole Object保持对象完整。
      如果需要从某个对象中取出若干值,将它们作为某一次函数调用时的参数。那么应该改成传递整个对象。
    8. Replace Parameter with Methods 以函数取代参数
      对象调用某个函数,并将所得结果作为参数,传递给另一个函数。而接受该参数的函数也可以调用前一个函数,那么让参数接受者去除该项参数,并直接调用前一个函数。
    9. Introduce Parameter Object引入参数对象
      某些参数总是很自然的同时出现,那么以一个对象取代这些参数。
    10. Remove Setting Method移除设值函数
      如果对象里的某些成员变量在对象初创时被设值,然后就不再改变,那么去掉该成员变量的设值函数。
    11. Hide Method 隐藏某个函数
    12. Replace Constructor with Factory Method 以工厂函数取代构造函数
      如果你希望在创建对象时不仅仅是对它做简单的构建动作,那么用工厂函数取代构造函数
    13. Encapsulate Downcast 封装向下转型动作。
      将向下转型的动作移到函数中。
    14. Replace Error Code with Exception以异常取代错误码
    15. Replace Exception with Test以测试取代异常
      在调用函数之前先检查
  6. 处理概括关系
    1. Pull Up Field 值域上移
      两个子类有相同的成员变量,那么将成员变量移动到父类中。
    2. Pull Up Method函数上移
    3. Pull Up Constructor Body
    4. Push Down Field
    5. Push Down Method
    6. Extract Subclass 提炼子类
    7. Extract Superclass 提炼父类
    8. Extract Interface提炼接口
    9. Collapse Hierarchy折叠继承体系
    10. Form Template Method 塑造模板函数
    11. Replace Inheritance with Delegation 以委托取代继承
    12. Replace Delegation with Inheritance
  7. 大型重构、重构、复用与现实
    1. Tease Apart Inheritance 梳理并分解继承体系
    2. Convert Procedural Design to Objects将过程化设计转化为对象设计
    3. Separate Domain from PRESENTATION 将领域和表述/显示分离
    4. Extract Hierarchy提炼继承体系
文章目录
  1. 1. 以下取自重构改善代码的既有设计
,