diff --git a/notes/重构.md b/notes/重构.md index 0e697888..4ccbca26 100644 --- a/notes/重构.md +++ b/notes/重构.md @@ -33,7 +33,6 @@ * [21. Refused Bequest(被拒绝的馈赠)](#21-refused-bequest被拒绝的馈赠) * [22. Comments(过多的注释)](#22-comments过多的注释) * [构筑测试体系](#构筑测试体系) -* [重构列表](#重构列表) * [重新组织函数](#重新组织函数) * [1. Extract Method(提炼函数)](#1-extract-method提炼函数) * [2. Inline Method(内联函数)](#2-inline-method内联函数) @@ -270,7 +269,7 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl ## 5. Divergent Change(发散式变化) -一个类受到多种变化的影响; +设计原则:一个类应该只有一个引起改变的原因。也就是说,针对某一外界变化所有相应的修改,都只应该发生在单一类中。 针对某种原因的变化,使用 Extract Class 将它提炼到一个类中。 @@ -278,17 +277,19 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl 一个变化引起多个类修改; -使用 Move Method 和 Move Field 把所有需要修改地代码放到同一个类中。 +使用 Move Method 和 Move Field 把所有需要修改的代码放到同一个类中。 ## 7. Feature Envy(依恋情结) -一个函数对某个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数据。 +一个函数对某个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数据, 使用 Move Method 将它移到该去的地方,如果对多个类都有 Feature Envy,先用 Extract Method 提取出多个函数。 ## 8. Data Clumps(数据泥团) -有些数据经常一起出现,比如两个类具有相同的字段、许多函数有相同的参数。使用 Extract Class 将它们放在一起。 +有些数据经常一起出现,比如两个类具有相同的字段、许多函数有相同的参数,这些绑定在一起出现的数据应该拥有属于它们自己的对象。 + +使用 Extract Class 将它们放在一起。 ## 9. Primitive Obsession(基本类型偏执) @@ -296,6 +297,8 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl ## 10. Switch Statements(switch 惊悚现身) +具体参见第一章的案例。 + ## 11. Parallel Inheritance Hierarchies(平行继承体系) 每当为某个类增加一个子类,必须也为另一个类相应增加一个子类。 @@ -332,19 +335,23 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl ## 18. Alernative Classes with Different Interfaces(异曲同工的类) +两个函数做同一件事,却有着不同的签名。 + +使用 Rename Method 根据它们的用途重新命名。 + ## 19. Incomplete Library Class(不完美的类库) 类库的设计者不可能设计出完美的类库,当我们需要对类库进行一些修改时,可以使用以下两种方法:如果只是修改一两个函数,使用 Introduce Foreign Method;如果要添加一大堆额外行为,使用 Introduce Local Extension。 ## 20. Data Class(幼稚的数据类) -它只拥有一些数据字段。 +它只拥有一些数据字段,以及用于访问这些字段的函数,除此之外一无长物。 找出字段使用的地方,然后把相应的操作移到 Data Class 中。 ## 21. Refused Bequest(被拒绝的馈赠) -子类继承超类的所有函数和数据,但是它只想要一部分。 +子类不想继承超类的所有函数和数据。 为子类新建一个兄弟类,不需要的函数或数据使用 Push Down Method 和 Push Down Field 下推给那个兄弟。 @@ -356,14 +363,14 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl Java 可以使用 Junit 进行单元测试。 -单元测试的对象是类的方法,而功能测以客户的角度保证软件正常运行。 +测试应该能够完全自动化,并能检查测试的结果。Junit 可以做到。 + +小步修改,频繁测试。 + +单元测试的对象是类的方法,而功能测是以客户的角度保证软件正常运行。 应当集中测试可能出错的边界条件。 -# 重构列表 - -小步前进,频繁测试。 - # 重新组织函数 ## 1. Extract Method(提炼函数)