纯稚的数据类
纯稚的数据类是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外一无长物。
封装public字段;
恰当封装容器类字段;
移除不应修改的字段的设置函数;
提炼调用函数以隐藏取值/设值函数;
被拒绝的遗赠
子类只运用了父类的一部分函数和数据。为子类建立一个兄弟类,将所有用不到的字段/函数下移至兄弟类,保证超类的纯粹
这个纯粹指的就是原子性
重新组织函数
提炼函数
动机 :看到一个过长的函数或者一段需要注释才能让人理解用途的代码,将这段代码放一个独立的函数中;
做法 :
- 创造一个新函数,根据这个函数的意图来命名它;只要新函数的名称能够以更好的方式昭示代码意图,你也应该提炼它。但如果想不到一个更有意义的名称就别动
- 将提炼的代码从原函数复制到新建的目标函数中;
- 将被提炼代码段中需要读取的局部变量,当作参数传递给目标函数;
- 在源函数中,将被提炼代码段替换为目标函数调用。
内联函数
一个函数的本体与名称同样清楚易懂。在函数调用点插入函数本体,然后移除该函数。
动机:
- 一群组织不甚合理的函数。你可以将它们都内联到一个大函数中,再从中提炼出组织合理的小型函数。
- 使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。
做法:
- 检查函数,确定不具备多态;如果子类继承了这个函数,就不要将此函数内联,因为子类无法复写一个根本不存在的函数
- 找出这个函数的所有调用点;
- 将这个函数的所有调用点都替换成函数本体。
抽象的逆向过程。
当抽象不甚合理的时候,也要把抽象的函数解脱出来。
本体与名称同样清楚易懂,这其实就是说代码逻辑很简单,复用性也不强,没有抽象的必要。
内联临时变量
有一个临时变量,只被一个简单的表达是赋值一次,而它妨碍了其他重构手法。将所有对该变量的引用动作,替换为对它赋值的那个表达式自身
如果变量只被赋了一次值,且赋值的表达式较短,或者引用次数较少,那么我们直接用表达式代替临时变量。
例:
原函数:
@Test
public void test01(){
String s = "123";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
System.out.println(bytes);
}
优化后:
@Test
public void test01(){
String s = "123";
System.out.println(s.getBytes(StandardCharsets.UTF_8));
}
一般只有当变量只被引用一次时,这样优化
引入注释性变量
你有一个复杂的表达式。将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。
表达式有可能非常复杂难以理解。这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式。在条件逻辑中,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。另一种情况是:在较长的算法中,可以运用临时变量来解释每一步运算的意义。
@Test
public void test02(){
String systemName = System.getProperty("os.name");
System.out.println(systemName);
}
用变量名来解释表达式
优化:
@Test
public void test02(){
// 系统类型 如:mac os X、windows10
String systemName = System.getProperty("os.name");
System.out.println(systemName);
}