简单易懂读《重构:改善既有代码的设计》
用自己语言去精炼作者的思想。尽量把精华和重点整理出来,文章持续更新,可能部分章节会经常改动,由于文章持续优化,不同章节格式和表述方法会略微不同。某些翻译与原书可能不同。
哪些代码需要重构
- Duplicated Code(代码重复):在多个地方出现做相同事的代码。
- Long Method(方法内代码过长):一个函数(方法)里做的事过多过杂,代码很长
- Large Class(臃肿的类):单个类干了太多的事,代码量过多
- Long Parameter List(入参过多):函数中的入参过多
- Divergent Change(类中的多面手):修改和扩展代码时造成同一个类不断的需要被修改
- Shotgun Surgery (牵一发而动全身):牵一发而动全身,由于某种变化造成过多相关类进行修改。
- Feature Envy(移情别恋):函数比起自身所在类的数据,更加依赖于其他某个类的数据。
- Data Clumps(一团糟的数据):多个类中重复出现的字段,或多个函数(方法)中相同的入参。
- Primitive Obesession (零散的数据项):代码中的零散的数据值过多
- Switch Statements (复杂繁冗的switch语句):switch语句过多或过复杂
- Parallel Inheritance Hierarchies(继承中的粘连):每当为一个类增加子类时,必须也为另一个类相应增加子类。
- Lazy Class (多余的类):多余出来的类或者随着程序更迭失去大部分原有意义的类。
- Speculative Generality (被高估的扩展性):高估未来的扩展性,添加过多不必要的类,方法或继承体系
- Temporary Field (临时变量):某个实例变量仅为代码中一小部分功能临时所用而创建
- Message Chains (调用链过长):代码中的调用链过长,造成代码耦合。
- Middle Man (不必要的委托关系):类中的函数存在过度委托给其他对象的情况
- Inappropriate Intimacy (类间关系过于紧密):两个类间总是试图访问对方的过多属性
- Alternative Classes with Different Interfaces (异曲同工的类):做了相同工作,命名却不同的方法。
- Incomplete Library Class (不完美的库类):封装好的类库中功能不能满足实际需求
- Data Class (纯数据的类):POJO(或javaBean)类
- Refused Bequest (逆反的子类):子类不需要父类的某些方法,字段,或不需要实现父类实现的接口。
- Comments (不恰当的注释):比起写注释,有时不如通过重构减少不必要的注释。
如何开展重构
按照如下格式记录,有助于重构工作的开展,以下是重构提纲
- 重构名称
- 概要
- 动机
- 做法
- 范例
重构建议
- 不要试图一蹴而就,重构需要一次又一次的做优化。
- 不要试图省略测试过程,连续或者过多的一次性重构太多代码,容易引起难以排查的代码漏洞或bug。
- 多利用IDE等工具的重构相关功能或插件。
- 和别人一起重构可以收到更好的效果
- 多与领导和同事沟通重构的必要性
重视自测试的价值
养成写单元测试的习惯
推荐重构网站
比起这个博客,推荐大家直接看这个网站,简单明了一看就懂,比我总结的还简单粗暴。
https://www.refactoring.com/catalog/
体会
体会:
- 有收获,希望有时间一定读一下原书,作者对重构讲的很系统和具体。
- 个人觉得本书翻译,想翻译的文艺一些结果搞得读不懂或者读的难受,比如"狎昵",恕本人文化低,我读都读不来,更别说含义了,当时还是用笔画输入法才打出来到搜索引擎查询。
- 句子也感觉翻译有点生硬,有种没有重新根据中文语义来组织句子的感觉。本书以java语言为例,但是翻译计算机名词时却采用了非java通用说法,比如method在java上一般译为方法而不是函数,看起来比较别扭。