重构 - 给方法和属性找到更合适的类
2016-03-08 01:03 yoogo 阅读(260) 评论(0) 编辑 收藏 举报
-
Move Method 移动方法
问题
一个方法在其他类中调用的频率比所属的类还高
解
方法应该属于调用它最多的那个类
为什么重构
1,方法使用的数据或者变量的个数最多来自哪个类,那个类就是方法该待的地方,这就是所谓的类的内聚性;
2,减少类的依赖
-
Move Field 移动字段
问题
一个字段在另一个类中使用的频率比当前所属的类还高
解
移动字段到新的类中
为什么重构
问题
说法1:一个类有太多的职责;
说法2:一个类内部的成员还可以分组
解
把能分组的成员移动到新建的类中
为什么重构
类开始时往往是清晰的,职责单一的,但一天天变大,最终需要重组
收益
单一职责,易于更改
缺点:
带来复杂性,过犹不及,需要权衡
-
Inline Class 内联类
问题
一个类做的事情很少,缺乏存在的必要
解
合并代码到其他类中
为什么重构
类被重构的几乎没啥了,干脆彻底点吧
-
Hide Delegate 隐藏委托
问题
客户通过A 拿到B,然后调用B 的方法
解
直接在A中添加一个方法调用B 的目标方法,这样客户直接调用A新添加的方法即可,B不再可见
为什么重构
客户仅仅需要B 的一个方法,没必要为这一个调用增加依赖,这样A与B的关系也对客户隐藏,利于关系的变更。
权衡
显然,如果客户需要B 的若干个方法,这个做法就不合适了-因为你需要在A中一一添加委托方法,增加了复杂性。
-
Remove Middle Man 删除中间人
问题
一个类有大量的方法仅仅是委托调用给另外一个类的方法
解
移除这些委托方法,让客户直接调用目标类的方法
为什么重构
B添加一个方法,就需要A做相应的添加,显然这个很笨
-
Introduce Foreign Method 引入外部方法
问题
库提供的功能有限,不能满足更多的需求,但库又是只读的
解
在客户端添加新的方法,站在库的肩膀上提供更多的功能,然后这个新方法被很多客户使用
为什么重构
把这种对库的扩展集中到一个地方,而不是所有的客户端重复实现。
-
Introduce Local Extension 引入本地扩展
问题
和上个问题一样,库功能不足,也不能添加
解
创建一个新的类继承或包装库类,以添加新的功能。先选择继承,如不能(如 final),则包装(wrapper)
为什么重构