重构-读书笔记二
重构第七章主要说的是在对象之间搬移特性
先说自己的感受,这个是在面向对象设计期间非常重要而且不好把握的地方,具体的责任应该放在哪里,是对象设计的关键,也是难点。
我们可以简单的使用Move Method和Move Field,虽然这两个重构方法很简单,但这个是针对对象搬移特性方法的基础,是明确责任的开始。
Move Method
Move Method的关键是判断此函数和那个对象的交流比较多,那么此函数就应该被搬移到这个对象中。具体的做法:
1、关注此函数中引导源类中的所有特性(成员变量和方法),考虑是否要一并迁移
2、决定从源函数如何引用目标对象
3、决定是否删除源函数,或是建立一个委托的函数(建立委托函数的好处是减少调用对象的依赖关系暴露,并且在后续的新需求改造中不会产生目标对象暴露给用户而是重构更加困难)
4、迁移的函数如果引用源类的特性,可以直接作为参数传入,如果多个特性那么可以直接传入源对象。
Move Field
做法,简单说就是,在目标类中新建一个字段,修改原字段的所有用户,令它们改用新的字段。
切记缩小属性的访问级别。
Extract Class
建立一个新类,将相关的属性和函数从源类迁移到新的类中,这里的关键是如何分解源类,在确定后,可以使用Move method 和 move field重构方法来一步一步实施。
Hide Delegate(隐藏委托关系)
做法:对于每一个委托关系中的函数,在服务对象端建立一个简单的委托函数。
比如:书中的范例
Person 类中有一个 Department成员变量,标示用户所属部门的相关信息。此时我们如果要获取员工所属组织单元的leader,现在有两种方式。
第一种:
new Person().getDeparment().getManager();
第二种(隐藏委托关系)
new Person().getManager();
getManager() {
department.getManager();
}
两种关系看似没有什么区别,但是当department变化时就会引起巨大的差别。
假设这样,我们以前的组织架构方式面向的大资源池的方式(面向组件),开发部,测试部,设计部门等,为了更快的响应市场变化,按片区来划分bg。
此时这种变化势必会对department的形式和组织方式以及其他的一些规则引起变化。
此时可能department这个对象都不在了,或是pg的领导也不叫manager了,那么调用者此时根据获取到的department对象势必会是多余并不可靠的。
而通过隐藏委托关系,暴露方法,变化尽在person类中发生,我们就降低了影响范围。