重构学习(一)

主宰稳场 提交于 2020-02-29 05:29:55

重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下。提高其可理解性,降低维护成本。

重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整期结构

 

重构的优点:

  • 改进软件设计
  • 使软件更容易理解
  • 帮助找到bug
  • 提高编程速度

 

重构应该随时随地进行,事不过三,三则重构:

  • 添加功能时重构
  • 修补错误时重构
  • 复审代码时重构

 

重构的难题:

  1. 数据库:经常会遇到数据库与应用紧耦合,非面向对象型数据库可以添加分隔层,如使用Hibernate之类的ORM框架;面向对象型数据库
  2. 修改接口:对于已发布接口修改是,应保留老接口,是老接口调用新接口,尽量减少发布接口

 

一个项目开始时候应该考虑好各个模块的灵活性,但实现这种灵活性往往会需要花更多时间,并增加代码的复杂度,同时并不是所有模块的灵活性都有用,所以在时间有限时考虑好通过重构将代码变得灵活的难度,如果不难可以先做非灵活实现,当有需要时在重构。

 

重构和性能:

    重构是代码更易于维护理解的同时,往往会牺牲性能。如果在一个性能要求极高的系统中,应该以性能为优先;对于大多数程序进行分析,会发现它吧大半时间都耗费在一小半代码上,一视同仁的性能优化,90%的努力都是收效甚微的,所以这时可以考虑,这90%的代码用重构获得代码的可读性优先。

    

代码的坏味道

  • Duplicated Code(重复代码):Extract Method抽出重复代码,放在合适的地方
  • Long Methods(过长函数):分解函数,遵循原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途命名,可能用到Extract Method;
    • 如果有大量的临时变量,可以用Inline Temp和Replace  Temp With Query;
    • 用过参数过长,可以用Introduce Parameter Object和Preserve Whole Object;
    • 当临时变量的使用使你无法采用Extract Method可以使用Replace Method with Method Object;
    • 当条件语句过长,循环逻辑难以理解,也应该考虑提出单独的函数,可以用Decompose Conditional
  • Large Class(过大的类):想利用单个类做太多的事情,内部往往就会出现太多实例变量;
    • 可以使用Extract Class将几个变量一起提炼到新类中
    • 如果提出的类适合作为一个子类,可以使用Extract Subclass

 

重构手法:

  1. Extract Method(提炼方法):将一段代码放进一个独立函数,函数名以用途命名
  2. Inline Method(内联函数):当某个方法只有一行,而且很好理解时,可以提出方法体直接使用
  3. Inline Temp(内联临时变量):将对临时变量的应用,替换成复制给临时变量的表达式
  4. Replace Temp With Query(以查询取代临时变量):降临时变量提出称为一个方法返回值
  5. Introduce Parameter Object(引入参数对象):以一个对象取代大量参数
  6. Preserve Whole Object(保持对象完整):当参数都是某对象的属性时,改为传递对象本身
  7. Replace Method with Method Object(以函数对象取代函数):将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。然后可以在同一个对象内将大型函数分解成多个小型函数
  8. Decompose Conditional(分解条件表达式):从if-then-else中分别提出独立的函数
  9. Extract Class(提炼类):建立一个新类,将相关的字段和函数从旧类搬移到新类
  10. Extract Subclass(提炼子类):建立一个子类,将相关的字段和函数从父类搬移到子类
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!