代码重构的技巧

一、重构概念

 

对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本

 

1、为何

改进软件设计

使软件更容易理解

帮助找到bug

提高编程速度

 

2、何时

添加功能时

修补错误时

复审代码时

 

3、难点

后台数据库

修改接口

重构还是重写

 

4、性能

原则上只能更优,不能更差

 

二、重构方向

 

1、针对代码

重复的代码

过长的函数

过大的类

过长参数列

发散式变化(某个类实现了多个功能等)

散弹式变化(某个功能实现在了多个类中)

依恋情结(某个类过于依赖另一个类)

数据泥团(类中定义了相近含义的属性,或多个类定义了相同功能的属性)

功能泥团(多个类实现了相似的功能,或多个方法实现了一样的功能)

数据类型选取

避免switch语句

平衡继承体系

过多的注释

 

2、针对测试

自测试代码:每个类都应编写自己的测试方法,更甚之,在添加新功能时,可先编写相应的测试代码,再编写实现代码,直到测试代码能够成功运行为止。

自测框架:如Java的Junit、Python的Testcase等

自定义测试:针对类的功能进行接口测试,如public方法等

 

三、重构方法

 

1、重新组织函数

提炼函数:让每个函数具体的实现某一个细分后的功能,减少函数的冗余

内联函数:如果一个方法不具备复用性或多态性,应将其移到使用他的父函数体内作为内联函数

以查询取代临时变量:提高复用性

引入解释性变量:表达式如果过于复杂,应将其放入一个名字能够解释其用途的变量中

分解临时变量:针对不同用途的临时变量赋予不同的名称,避免重复使用同一个临时变量

移除对参数的赋值:需要操作函数参数时,以一个临时变量代替

以对象函数代替全局函数:

替换算法:以更清晰的算法替换当前算法

逻辑分层:应将处理用户数据和业务逻辑的代码分隔开实现

 

2、在对象之间迁移属性

迁移函数:将函数迁移至使用它最频繁的类之中,将其他类对其的定义改为代理实现

迁移属性:将属性迁移至使用它最频繁的类之中

提炼类:将一个实现多个功能的类分割为多个只实现一种功能的类

将类内联化:当一个类不会被复用或其他失去独立存在的原因时,将该类作为内联类放于使用他的类之中

封装的更彻底:如果一个类中可以获取到另一个类的引用,应进一步封装避免此情况

隐藏中间层:当一个类与另一个类的交互太过频繁,应避免在这两个类中使用中间层

本地扩展:如果对一个无法修改源码的类有扩展需要,应引入本地扩展

 

3、重新组织数据

自我封装性:为关键类属性封装读取、写入方法,只使用这些方法来访问属性而不是直接调用

将数据变为对象:当一个数据不再是简单地数据类型能够满足时,应考虑以对象取代之

引用对象与值对象转换:根据属性的可变性来选择如果处理

以对象取代数组:如果用数组来存储不同功能的属性,应使用对象来代替

复制监视数据:当需要用到另一个模块的数据时,应复制它并有相应的同步机制

关联引用:当两个类互相有引用,应建立双向关联,使得一个类引用另一个类的指针有一个反向指针;反之若只有一个方向的引用,应避免使用双向关联

取代魔法数:应避免使用任何的魔法数

封装属性:若需要提供一个public属性,应将其置为private,并提供一个方法来获取它

封装集合属性:尽量不允许直接操作集合属性,应提供一个集合属性的访问方法,并提供该集合的移动、添加、删除等方法

取代类型码:使用子类、枚举、多态等手段来避免使用类型码

 

4、简化条件表达式

分解条件表达式:分解太多判断出现在一个表达式中的情况

合并条件表达式:若最终行为一致的多个条件应放在一个表达式中

合并重复的条件判断:应避免不同的条件分支执行了相同的代码的情况

移除控制标记:应使用continue、break、return等方法来避免使用控制标记

多态取代条件表达式:如果一个条件表达式通过类型去选择分支,应使用多态来替代之

引入Null:要确保对Null情况的判断

引入断言:引入断言来确保某些条件逻辑的正确性

 

5、简化函数

函数改名:函数名应能体现函数用途

增删参数:通过增删参数使得函数能够更准确的表达其实现的功能,避免冗余的参数

分割函数功能:将查询、修改、增删等功能的方法分割成不同的函数

保持参数对象的完整性:如果参数需要用到一个对象的多个属性,应直接将该对象作为参数进行传递

引入参数对象:如果一组参数被多个函数频繁使用,应为这些参数建立一个参数对象,直接传递该对象

函数私有化:如果一个函数从来不被其他类引用,应将其定义为私有函数

使用工厂函数:如希望初始化为多种实例类型,应使用工厂函数替代构造函数

封装向下转型:

用异常取代错误码:

用测试取代异常:如果只是某个选择的分支,不应轻易的使用异常

 

6、处理继承

属性上移:各子类均存在的相同属性,应上移至父类中

函数上移:各子类均存在的相同函数,应上移至父类中(包括构造函数)

函数下移:父类中的函数只在部分子类中使用,应将其移动至子类中(包括构造函数)

属性下移:父类中的属性只在部分子类中使用,应将其移动至子类中

提炼父类:如果多个类重复使用了某些属性或方法,应提炼出他们的父类来

提炼接口:

折叠展开继承关系:如果某个子类没有存在的必要,应将功能提炼到父类并删除子类,反之亦然

朔造模板函数:类似的函数执行内容,但序列不同,应在父类中创造模板函数

委托与继承转换:如果子类只使用父类一部分接口,应使用委托来替代继承,反之亦然

 

7、大型重构

梳理并分解继承体系:

面向过程转化为面向对象:

将逻辑与界面分离:

提炼继承体系:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值