重构-改善既有代码的设计

完整文章请查看:http://note.youdao.com/noteshare?id=6d5bfa721c405a94f63bf6cef4e6c099&sub=6CE34094A6EC42FFA11C7C33DF565B82

电子书下载地址:https://download.csdn.net/download/qq_28713413/10873077

重构与性能

不赞成为了提高设计的纯洁性而忽视性能,把希望寄托于更快的硬件身上也绝非正道。

虽然重构可能使软件运行更慢,但它也使软件的性能优化更容易。除了对性能有严格要求的实时系统,其他任何情况下“编写快速软件”的秘密就是:首先写出可调的软件,然后调整它以求获得足够速度。

代码的坏味道

  1. 重复代码;
  2. 过长的函数;
  3. 过大的类;
  4. 过长的参数列;
  5. 发散式变化:image
  6. 霰弹式修改:如果需要修改的代码散布四处,不但很难找到它们,也很容易忘记某个重要的修改;
  7. 依恋情结:解决原则:将总是一起变化的东西放在一起。数据和引用这些数据的行为总是一起变化的。
  8. 数据泥团;
  9. 基本类型偏执;image
  10. switch惊悚现身:image
  11. 平行继承体系:image
  12. 冗赘类:你所创建的每个类,都得有人去理解它、维护它,这些工作都是要花钱的。如果一个类的所得不值其身价,它就应该消失。
  13. 夸夸其谈未来性:image
  14. 令人迷惑的暂时字段:image
  15. 过度耦合的消息链:image
  16. 中间人:image
  17. 狎昵关系:两个类不要太过于亲密;
  18. 异曲同工的类:两个类做同样的事情,有着不同的签名;
  19. 不完美的库类:
  20. 纯稚的数据类:image
  21. 过多的注释;

构筑测试体系

自测试代码

每个类都应该有一个测试函数,并以它来测试自己这个类。

确保所有测试都自动化,让它们检查自己的测试结果。

一套测试就是一个强大的bug侦测器,能够大大缩减查找bug所需时间。

单元测试和功能测试。

考虑可能出错的边界条件,把测试火力集中在那儿。

重构列表

重构的纪录格式
  1. 名称;建造一个重构词汇表,名称很重要。
  2. 简短概要:简单介绍重构手法的适用情景,以及它所做的事情。
  3. 动机:为什么需要这个重构?什么情况下不该使用这个重构。
  4. 做法:简明扼要介绍如何进行此重构。
  5. 范例:简单例子说明重构手法如何运作。

重新组织函数

  1. 提炼函数;
  2. 内联函数;
  3. 内联临时变量;
  4. 以查询取代临时变量;
  5. 引入解释性变量;
  6. 分解临时变量;
  7. 以函数对象取代函数;
  8. 替换算法;

对象之间的搬移特性

  1. 搬移函数;
  2. 搬移字段;
  3. 提炼类;
  4. 将类内联化;
  5. 隐藏委托关系;
  6. 移除中间人;
  7. 引入外加函数;
  8. 引入本地扩展;

重新组织数据

简化条件表达式

  1. 分解条件表达式:image
  2. 合并条件表达式:image
  3. 合并重复的条件片段:image
  4. 移除控制标记:在一系列布尔表达式中,某个变量带有“控制标记”的作用,以break语句或return语句取代控制标记。
  5. 以卫语句取代嵌套条件表达式:image
  6. 以多态取代条件表达式:image

简化函数调用

  1. 函数改名:给函数起个号名称,准确表达它的用途。
  2. 添加参数:某个函数需要从调用端得到更多信息;为此函数添加一个对象参数,让该对象带进函数所需要的信息。
  3. 移除参数;
  4. 将查询函数和修改函数分离;
  5. 另函数携带参数:建立单一函数,以参数表达那些不同的值;
  6. 以明确函数取代参数:针对该参数的每一个可能值,建立一个独立函数;
  7. 保持对象完整:image
  8. 以函数取代参数:image
  9. 引入参数对象:image
  10. 移除设值函数:image
  11. 隐藏函数:image
  12. 以工厂函数取代构造函数:image
  13. 以异常取代错误码:image
  14. 以测试取代异常:image

大型重构

对于一个长时间、大负荷运转的系统来说,将业务逻辑和用户界面隔离开来是至关重要的。

  1. 梳理并分解继承体系:建立两个继承体系,并通过委托关系让其中一个可以调用另一个;
  2. 将过程化设计转化成对象设计:你手上有一些传统过程化风格的代码;将数据纪录变成对象,将大块的行为分成小块,并将行为移入相关对象中。image
  3. 将领域和表述/显示分离:某些GUI类之中包含了领域逻辑;将领域逻辑分离出来,为它们建立独立的领域类;
  4. 提炼继承体系:建立继承体系,以一个子类表示一种特殊情况;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值