zoukankan      html  css  js  c++  java
  • 读书:重构_改善既有代码的设计

    读书:重构_改善既有代码的设计

    • 重构技术就是以微小的步伐修改程序,如果你犯下错误,很容易便可发现它。
    • 作为一个傻瓜都能写出的计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员。
    • 重构的节奏就是:测试、小修改、测试、小修改、测试小修改.....
    • 添加新功能时,就只添加新功能,不要重构,而重构时,不要添加新功能,只改变程序结构。

    一、代码的问题

    • Duplicated Code
      • 一个类中不同函数的的实现代码相同,那么要将这个函数代码抽离出一个单独的函数
      • 不同类中某两个方法代码重复,抽离到父类当中
      • 两个不相干的类中重复代码,对其中一个使用Extract Method 抽出一个独立类,然后在另一个类中使用这个独立类。
    • Long Method
      • 问题:函数过长
      • 解决:分解函数,但是函数名一定要见名知意。最好做到,不用看函数实现就知道函数做了神马。
    • Large Class
      • 问题:类中功能太多,成员变量太多
      • 解决:可以将一些功能抽离到单独的类中,将类似函数抽离出一个函数来。
    • Long Parameter list
      • 问题:参数列表过长
      • 解决:Replace Method with Method ObjectIntroduce Parameter ObjectPreserve Whole Object 将参数列表换成对象,封装起来
    • Divergent Change
      • 问题:一个类受多种变化的影响
      • 解决:Extract Class 针对某一外界变化的所有相应修改,都只应该发生在单一类中,而这个新类中的所有内容都应该反映此变化。
    • Shotgun Surgery
      • 问题:一个类的修改,引起多个类的修改
      • 解决:Move MethodMove Field 把所有需要修改的代码放进同一个类中。 如果没有,就新建一个Inlin Class来解决。
    • Feature Envy
      • 问题:一个类中函数过渡依赖于另一个类的数据。
      • 解决:Extract MethodMove MethodMove Field等方式来解决这些依赖。
    • Data Clumps
      • 数据泥团,数据喜欢扎堆
      • Extract ClassIntroduce Parameter Object等减少字段和参数个数
    • Primitive Obsession
      • 问题:基本类型偏执
      • 解决:- Replace Data Value with ObjectReplace Type Code with Class 即便是很简单的几个数据,也可以封装成对象。
    • Switch Statements
      • 问题:switch语句
      • 解决:尝试用多态替换switch语句
    • Parallel Inheritance Hierarchies
      • 问题:一个继承体系类名称前缀和另一个继承体系的类名称前缀完全相同
      • 解决:让一个继承体系的实例引用 另一个继承体系的实例。然后可以Move MethodMove Field
    • Lazy Class
      • 问题:冗余类
      • 解决: Collapse HierarchyInline Class
    • Speculative Generality
      • 问题:所谓的将来可能用到的某些变量、功能、函数等
      • 解决:Collapse HierarchyInline Class来除掉那些不必要代码。
    • Message Chains
      • 问题:过渡耦合的消息链
      • 解决:Hide Delegate方式
    • Middle Man
      • 问题:中间人,类之间使用过多委托
      • 解决:Remove Middle Man来避免过渡委托
    • Inappropriate Intimacy
      • 问题:亲密关系(两个类之间),
      • 解决: Change Bidirectional Association to Unidirectional Replace Inheritance with Delegation 等方法类分离类
    • Alternative Classes with Different Interface
      • 问题:相似类(功能相同的类或者函数)
      • 解决:Rename Method Move Method Extract Superclass 等方式来去除重复代码
    • Incomplete Library Class
      • 问题:不完美的库类(库的修改)
      • 解决:Introduce Foreign Method Introduce Local Extension来扩展库类
    • Data Class
      • 纯粹的数据类,封装注意事项 Encapsulate Collection
    • Refused Bequest
      • 子类不想拥有父类的函数和数据,那么就新建一个兄弟类来实现。Push Down Field Push Down Method
    • Comments
      • 问题:过多的注释
      • 解决:当你感觉需要添加注释时,请先尝试重构,试着让所有注释变得多余。

    二、测试体系

    • 每天机一个新功能,就添加测试代码
    • 单元测试和功能测试
    • 每当你收到一个bug报告,请先使用单元测试来暴露bug
    • 测试要诀:测试那些你嘴担心出错的部分。

    专用名词

    • Extract Method
    • Pull Up Method
    • Form Template Method
    • Substitute Algorithm
    • Replace Temp with Query 消除临时变量
    • Introduce Parameter Object 精简参数列表
    • Preserve Whole Object 精简参数列表
    • Replace Method with Method Object 继续精简参数列表和临时变量
    • Decompose Conditional 处理条件表达式
    • Extract Subclass
    • Extract Interface
    • Duplicate Observed Data
    • Replace Parameter with Method
    • Inlin Class 内部类
    • Replace Data Value with Object
    • Replace Type Code with Class
    • Replace Type Code with Subclass
    • Replace Type Code with State/Strategy
    • Replace Array with Object
    • Replace Conditional with Polymorphism
    • Replace Parameter with Explicit Methods
    • Introduce Null Object
    • Collapse Hierarchy
    • Remove Parameter
    • Rename Method
    • Hide Delegate
    • Remove Middle Man
    • Replace Delegation with Inheritance
    • Change Bidirectional Association to Unidirectional
    • Replace Inheritance with Delegation
    • Encapsulate Collection
    • Encapsulate Field
    • Push Down Method
    • Push Down Field
    • Introduce Assertion
  • 相关阅读:
    TF-IDF
    3.路径模板两张表设计
    6.订单支付回调接口
    5.创建订单并生成支付链接接口
    5.使用ES代替whoosh全文检索
    4.docker基本使用
    3.ubuntu安装docker
    2.课程全文检索接口
    1.搜索引擎工作原理
    7.视频播放页面接口开发
  • 原文地址:https://www.cnblogs.com/songliquan/p/12784541.html
Copyright © 2011-2022 走看看