在对象之间搬移特性
类往往会因为承担过多责任而变得臃肿不堪。
(Move Method)搬移函数
含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表示进行搬迁,在引用类中在创建一个类似功能行为的新函数。
当两个类在函数之间有着复杂的关联或者有太多的合作而形成高度的耦合,这是很致命的,需要我们及时的对这种耦合进行解构,也就是拆分,让其变得松散,形成软件开发中想要的一种模式,“高内聚,低耦合”。
- 检查源类中被源函数所使用的一切特性(字段/函数),考虑它们是否也该被搬移。
- 检查源类的子类或超类,看看是否有该函数的其他声明。
- 在目标类中声明这个函数,将源函数中的代码复制到目标函数中,调整后使其可正常运行。
- 编译目标类,决定如何从源函数正确引用目标对象,修改源函数,使之成为一个纯委托函数,编译测试。
如果源类中要搬移的函数使用了源类中的函数或者别的字段时,有以下几种做法:
- 将这个特性也移到目标类。
- 建立或使用一个从目标类到源类的引用关系。
- 将源对象当作参数进行传递。
- 如果所需的只是个变量,则将其当作参数进行传递。
Move Field(搬移字段)
含义:当某个字段被其余的类多次引用的时候,将其进行迁移。在目标类中新建一个字段,修改源字段的所有用户,令它们改用新字段。
Extract Class(提炼类)
含义:当一个类过于臃肿或者表达的含义过多,做了两个类做的事情时,就需要新建个类,将相关字段和函数从旧类搬移到新类。
一个类应该是一个清楚的抽象,处理一些明确的责任。
Inline Class(将类内联化)
含义:若类中的函数已经表达的意思很清晰或者没有过多的被调用,则可将此类删除掉,将函数直接放到原始类中即可。
Introduce Local Extension(引入本地扩展)
含义:为服务类提供一些额为函数,但却无法修改此类,此时需要新建一个类,使它包含这些额为函数,让这个扩展品成为源类的子类或包装类。
本地扩展是一个独立的类,但也是被扩展类的子类型,它提供源类的一切特性,同时额外添加新特性。在任何使用源类的地方都可以取而代之。
原则:“函数和数据应该被统一封装”,
好策略:因为包装类的用户的确不应该关心包装类的存在,的确应该可以同样的对待包装类和原始类。