代码重构之道(四)

纯稚的数据类

纯稚的数据类是指:它们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外一无长物。

封装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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值