重构方法学习—对对象进行重构

Move method(搬移方法)

  • 含义:
    • 在该函数最常用引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单独的委托函数,或是将旧函数完全移除
  • 原因
    • 如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务。

Move Field(搬移字段)

  • 含义:
    • 在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段
  • 原因
    • 对于一个字段,在其所驻类之外的另一个类中有更多函数使用了它,就会考虑搬移这个字段。此处的使用可能是通过设值/取值函数间接进行的。

提取类

  • 含义:
    • 建立一个新类,将相关的字段和函数从旧类搬移到新类
  • 案例
    • 对于Thread而言,需要保存一些线程特有的变量,如果很多的话,那么久需要建立一个新类,将相关的属性字段迁移到新类中,那么这个新类就是ThreadLocal对象,额,原来这么设计的,那么如果ThreadLocal对象需要获取Thread中的一些属性,方法就是将Thread的属性的方式注入到ThreadLocal中,同时在Thread中将迁移的属性改成ThreadLocal对象即可。那么实际情况呢???
      • Thread中的属性全部放到了TheadLocal.ThreadLocalMap中,嗯???既然是一个Map,按照我们正常思考,直接在Thread中创建一个Map<String,Object>这样不就可以获取所有的值了,然后在线程中提供一下方法来进行操作,那为何要这么设计呢????见【002—ThreadLocal分析】

Inline Class(将类内联化)

  • 含义
    • 将这个类的所有特性搬移到另一个类中,然后移除原类
  • 原因
    • 如果一个类不在承担足够责任、不再有单独存在的理由(者通常是因为此前的重构动作移走了这个类的责任)我们就会挑选这个一“萎缩类”的最频繁用户(也是个类),将此类塞到最频繁用户的这个类中

Hide Delegate(隐藏委托关系)

  • 含义:
    • 在服务器上建立客户所需的所有函数,用以隐藏委托关系
    • 解释
      • 客户需要知道一个人员的上级是谁,但是原先的逻辑是人员内部包含一个部门的属性,先获取到部门然后,通过部门来获取上级,但是此种就存在一个委托关系,人员委托部门,然后获取上级,而人员中之前只存在部门的属性,那么导致的结果就是,获取上级的办法,person.getDepartment().getManager(),结果就是,客户知道了需要获取上级,就需要知道一个人员所处的部门是什么,缺点在哪里????
        • 如果万一哪天发生了变化,人员不是通过部门获取上级的,那么所有的地方都需要改变
      • 解决方法:就是在人员中提供一个获取上级的函数,隐藏获取上级的一个委托关系,如果现在是通过部门获取上级,那么函数体就是department.getManager(),如果是通过文件获取到上级,那么获取上级的函数体就是file.getManager(),这样无论修改什么方式,获取上级的调用之处都不用知道内部的逻辑是什么,他只关心上级对不对就可以了,不关系内部的关系。牛逼的想法
  • 原因
    • 就是上面的解释,此处再来整理一波,如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。解决方法,在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这层依赖。这样一来,即使将来发生委托关系上的变化,变化也限制在服务对象中,不会涉及客户。操作很溜,赞一个

Introduce Foreign Method(引入外加函数)

  • 含义:
    • 在客户类中建立一个函数,并以第一参数形式传入一个服务类实例
    • 解释
      • 源代码
      Date newStart = new Date(previousEnd.getYear(),previousEnd.getMonth(),previousEnd.getDate()+1)
      
      • 优化后的代码
      Date newStart = nextDay(previousEnd)//外加函数
      private static Date nextDay(Date arg){
          return new Date(arg.getYear(),arg.getMonth(),arg.getDate()+1)
      }
      
      
    • 简单来说,就是多处调用同样的方法,那么就抽出一个方法来实现此逻辑。如果方法太多,就引入本地扩展

Introduce Local Extension(引入本地扩展)

  • 含义:
    • 建立一个新类,使他包含这些额外函数。让这个扩展品成为源类的子类或者包装类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值