重构十:简化函数调用

236 阅读3分钟

1. Rename Method(函数改名)

  • 做法

    1. 检查函数签名是否被超类或者子类实现过。如果是,则需要针对每份实现分别进行下列步骤
    2. 声明一个新函数,将它命名为你想要的新名称。将旧函数的代码复制到新函数中,并进行适当调整
    3. 编译
    4. 修改旧函数,令他将调用转发给新函数
    5. 编译,测试
    6. 修改所有引用点
    7. 删除旧函数
    8. 编译,测试

2、Add Parameter(添加参数)

  • 为此函数添加一个对象参数,让该对象带劲函数所需信息
  • 如果旧函数是public接口的一部分,你可能无法安全的删除它。这种情况下,请将它保留在原地,并将它标记为deprecated(建议不使用)

3、Remove Parameter(移除参数)

  • 函数体不需要某个参数,将该参数去除
  • 对于多态函数,可能多态函数的另一份实现中用到了这个参数,此时不能去除他。

4、Separate Query from Modifier(将查询函数和修改函数分离)

  • 某个函数机返回对象状态值,又修改对象状态
  • 建立两个不同的函数,其中一个负责查询,另一个负责修改

5、Parameterize Method(令函数携带参数)

  • 相似的函数,仅仅因为几个参数的导致略有不同,则提取函数,减少重复代码
  • 可将少量数值视为参数,找出带有重复性的代码

6、Replace Parameter with Explicit Methods(以明确函数取代参数)

  • 如果某个参数有多种可能的值,而函数内又一条件表达式检查这些参数值,并根据不同参数值做出不同的行为,就应该使用此重构
  • 针对参数的每一种可能值,新建一个明确函数

7、Preserve Whole Object(保持对象完整)

8、Replace Parameter with Methods(以函数取代参数)

  • 让参数接受者去除该项参数,并直接调用前一个函数
  • 如果函数可以通过其他途径获得参数值,那么他就不应该通过参数取得该值

9、Introduce Parameter Object(引入参数对象)

  • 某些参数(一组参数)总是很自然的同时出现,以一个对象取代这些参数
  • 特定的一组参数总是一起被传递,可能隶属于同一个类,也可能隶属不同的类,这样一组参数就是所谓的数据泥团
  • 新建一个类,用以表现你想替换的一组参数。将这个类的字段设为不可变的

10、Remove Setting Method(移除设值函数)

  • 类中的某个字段应该在对象创建时被设值,然后就不再改变,去掉该字段的所有设值函数

11、Hide Method(隐藏函数)

  • 有一个函数,从来没有被其他任何类用到,将这个函数修改为private

12、Replace Constructor with Factory Method(以工厂函数取代构造函数)

  • 将构造函数替换为工厂函数

13、Encapsulate Downcast(封装向下转型)

  • 某个函数返回的对象,需要由函数调用者执行向下转型

14、Replace Error Code with Exception(以异常取代错误码)

15、Replace Exception with Test(以测试取代异常)

try{
    String a = list.get(0);
} catch (Execption e) {
    throw new  RuntimeException("xxx");
}

可以理解为获取list的数据时,可能会出现空指针异常, 这个时候可以先对list进行判断,如下

    if(Collections.isEmpty(list)) {
        return "";
    }
    String a = list.get(0);

这样就可以去掉try.catch块,达到已测试取代异常的效果