LotusLoveNature

日常工作,生活小记

看重构的一些方法记录(一)

1. Introduce Local Extension 引入本地扩展

   用于使用一个class,但是class里面的method明显不够用,如果这个class可以修改,那么就在class中加入想要的方法,如果不能呢,那么有两个方法,一个是subclass(子类),一个是Wrapper(外覆),subclass就是继承original class,然后在构造方法中初始化,往往会引用父类的构造方法,然后再添加自己要的方法。Wrapper就是一个独立的类,里面有original class的引用,在构造方法中考虑对这个original 实例赋值,下面再写自己的方法,就可以直接用这个original引用。注意用subclass的时候一般只是使用original class里面的methor,而不是覆写;在使用Wrapper时并不能什么时候都能隐藏这个类的存在(就是别人可能不知道这个方法时在original class里面新加的或者被你改过),但是遇到像equals方法这类系统方法的时候,覆写它会有歧义,不符合java里面equals的等价原则,所以还是必须更名。

2. Hide Delegate(隐藏委托关系)

   如果碰到person.getDepartment().getManager()这样的方法,这里就是用委托,person委托department class 来获取想要的东西(person里面有department的引用实例)。但是这里就是隐藏这层委托关系,变成person.getManager(),那么就是需要在person里面加入一个简单的委托函数。

3. Remove Middle Man (移除中间人)

  这个和上面的Hide Delegate是相反的,就是在委托函数需要的特别多的时候,那么我们还是让客户端直接调用委托函数,比如person.getDepartment().getManager();

4. Extract Class (抽取类)

  一个class做了两个class的事情,就要拆分为两个类,要注意的是拆分为两个类后,可能需要一个class对另外一个class的link连接关系,尽量不要做双向连接

5. InLine Class(内联类)

  和上面的抽取类是相反的,如果一个class没有做太多有用的事情,就要合并到另外一个类中

6. Move Field (搬移值域)

  用于一个class Source中的field,在Class Target中使用Source的field更多些,那么考虑将Source中field移到Target中,并且在Target中加入set,get方法,在Source中加入对Target对象的引用来访问B的field,即将所有对source field的引用改为对target适当函数的调用。

7. Move Method(搬移函数)

  与上面的的搬移值域雷同,class source中的method在class target中用的更多,那么僵source中的method移到target中,如果method中有用到source中的值,那么可以当做参数传给target,那么source中如何调用target中的这个method呢,那么source中需要有target中的引用对象。而且source中原来被移走的method方法可以保留,里面的内容被移到了target中,source只需要是个纯委托方法delegating method


8. Remove Method with Method Object

  将method放到新建的类中,参数什么的以构造方法传过去,source类中加入对新建类的引用

9. Remove Assignment to Pararments (将参数变为局部变量)

  传入的参数,尽量不要再去修改,比如非Object参数,因为是参数传值,值时不受调用方法改变而变化的。将这种修改入参方法的参数改为局部变量

10. Split Temporary Varms(剖析临时变量)

  除了循环变量和集用变量,有些临时变量如果被赋值多次,但是承担的责任是不同,则应该用不同的临时变量替换。如果只被赋值一次,那么该临时变量用final修饰

11. Introduce Explaining Variable

将复杂表达式放入一个临时变量中

12. Replace Temp With Qurey

将一个临时变量表达式提炼为一个单独的函数,可共用性增强,但是单独的函数中如果存在循环可能存在一定性能问题

13. Inline Temp

如果一个临时变量只被简单赋值一次,那么将该方法中所有对该临时变量的引用 改为 等号右边的表达式。

14. Inline Method

method body 与method name一样很好理解,比如body只有一句简单表达式,那么这个方法可以被删除,在调用该方法的地方直接用表达式替换

15 Extract Method

 将一段代码放入独立的函数中,并且让函数名称解释该函数的用途。如果一段代码需要被加上注释才能让人理解,那么这种情况都可以独立出一个函数来。函数短固然好,但究竟多长取决于函数本体之间的语义距离。

评论
©LotusLoveNature | Powered by LOFTER