代码改变世界

重构 - 给方法和属性找到更合适的类

2016-03-08 01:03  yoogo  阅读(260)  评论(0编辑  收藏  举报

 


 

问题

一个方法在其他类中调用的频率比所属的类还高 

方法应该属于调用它最多的那个类

为什么重构

1,方法使用的数据或者变量的个数最多来自哪个类,那个类就是方法该待的地方,这就是所谓的类的内聚性;

2,减少类的依赖


 

问题

一个字段在另一个类中使用的频率比当前所属的类还高

移动字段到新的类中

为什么重构


 

问题

说法1:一个类有太多的职责;

说法2:一个类内部的成员还可以分组

把能分组的成员移动到新建的类中

为什么重构

类开始时往往是清晰的,职责单一的,但一天天变大,最终需要重组

收益

单一职责,易于更改

缺点:

带来复杂性,过犹不及,需要权衡


 

问题

一个类做的事情很少,缺乏存在的必要

合并代码到其他类中

为什么重构

类被重构的几乎没啥了,干脆彻底点吧


 

问题

客户通过A 拿到B,然后调用B 的方法

直接在A中添加一个方法调用B 的目标方法,这样客户直接调用A新添加的方法即可,B不再可见

为什么重构

客户仅仅需要B 的一个方法,没必要为这一个调用增加依赖,这样A与B的关系也对客户隐藏,利于关系的变更。

权衡

显然,如果客户需要B 的若干个方法,这个做法就不合适了-因为你需要在A中一一添加委托方法,增加了复杂性。


 

问题

一个类有大量的方法仅仅是委托调用给另外一个类的方法

移除这些委托方法,让客户直接调用目标类的方法

为什么重构

B添加一个方法,就需要A做相应的添加,显然这个很笨


 

问题

库提供的功能有限,不能满足更多的需求,但库又是只读的

在客户端添加新的方法,站在库的肩膀上提供更多的功能,然后这个新方法被很多客户使用

为什么重构

把这种对库的扩展集中到一个地方,而不是所有的客户端重复实现。


 

问题

和上个问题一样,库功能不足,也不能添加

创建一个新的类继承或包装库类,以添加新的功能。先选择继承,如不能(如 final),则包装(wrapper)

为什么重构