第一步: 从分解大函数开始
1. 什么是大函数?
大函数就是那些业务逻辑特别复杂、程序代码特别多、一提起来就让人头疼不已的超级方法。超级大函数很难让人读懂,更难于维护与变更,毫无疑问是软件退化的重灾区。
2. 如何解决超级大函数问题?
最有效的办法就是分解,按照功能一步一步分解,还原其应有的优化结构。这个过程我们常用的方法叫“抽取方法”。重构是一个探索的过程。
3.抽取方法:
a. 将代码原子化时,为该函数取个易懂的名称。起初我们对这段代码的理解可能不那么深,因此往往选择用结果变量为其命名,随着我们对代码的深入理解,可以运用“重命名方法”根据代码意图重新为其命名。
b. 被抽走的代码一定是功能内聚的,也就是说它们执行的是一个说得清道得明、清楚明确的功能。同时,它一定是只执行一个清晰的功能。
c. 提高代码复用成为了代码优化的一个重要内容,因此,重复代码也是抽取函数的重要标志。
d. 一些块操作的语句,如条件语句、循环语句、try语句,都可能成为抽取函数的标志。最典型的就是if语句,包含在if语句中的常常是一个相对独立的功能。
4. 常见问题
a. 最大的困难,就是如何处理抽取函数与原函数的数据交换,即函数参数的设定。
b. 若需要多个返回值时的处理
c. 抽取方法的命名问题
第二步: 拆分大对象
1. 面对超级大函数我们采取的办法是拆分,以功能为核心将其拆分成一个一个独立的函数。
2. 以职责驱动设计思想为核心,调整我们的程序结构,构建高内聚、低耦合的软件系统。
3. 什么是职责驱动设计?
职责驱动设计就是要求我们设计的所有类和接口都要有自己的职责定义。而每个类和接口内部的所有方法和属性都是围绕着该职责来进行的,是高度相关的。
4. 我们判断功能之间是否相关的一个非常重要的原则,就是它们是否是引起软件变更的同一个原因。
5. 拆分大对象的过程
将原对象中的某些方法移动到其他对象中,这个方法称作“抽取类”。其移动原则就是职责驱动设计。
6. 如何判断一个类中是否有跟自己职责不相关的行为?
a. 分析领域模型:需求分析后期、设计开发初期应当完成的一项模型分析。站在用户的角度,分析业务领域相关的事物、事物的属性、事物拥有的行为以及事物之间的关系。我们对领域模型的分析,是确保我们软件系统的设计能够与真实世界相对应的一种保障。
b. 分析业务变更原因:一个职责就是软件变化的一个原因,这也是软件设计原则SRP,单一职责原则的精髓之所在。在设计时,应当将以上业务抽取出来分配给应该拥有该职责的类。
c. 寻找信息专家
7. 什么是信息专家?
信息专家就是软件系统中拥有某些有用数据的业务对象。
8. 当业务需求在许多地方是相同的时候,容易造成大量重复代码,应该如何处理?
a. 第一步是划分相同业务及不同业务,落实到程序就是相同代码和不同代码。将不同代码保留在原程序中,相同代码抽取成新的函数。
b. 第二步是拆分,将相同业务类拆分后形成抽象类于正常类间的继承关系。该过程称为“抽取父类”。
9. 大对象拆分的原则是面向职责的分析与设计,但实际工作中情况并不总是如此。