作法(Mechanics)
- 如果field的属性是public,首先使用Encapsulate Field(206)将它封装起来。
- ==》如果你有可能移动那些频繁访问该field的函数,或如果有许多函数访问某个field,先使用Self Encapsulate Field(171)也许会有帮助。
- 编译,测试。
- 在target class中建立与source field相同的field,并同时建立相应的设值/取值(setting/getting)函数。
- 编译target class。
- 决定如何在source object中引用target object。
- ==》一个现成的field或method可以助你得到target
object。如果没有,就看能否轻易建立这样一个函数。如果还不行,就得在source class中新建一个field来存放target
object。这可能是个永久性修改,但你也可以暂不公开它,因为后续重构可能会把这个新建field除掉。
- 删除source field。
- 将所有[对source field的引用]替换为[对target适当函数的调用]。
- ==》如果是[读取]该变量,就把[对source field的引用]替换为[对target取值函数(getter)的调用];如果是[赋值]该变量,就把[对source field的引用]替换成[对设值函数(setter)的调用]。
- ==》如果source field不是private,就必须在source class的所有subclasses中查找source field的引用点,并进行相应替换。
- 编译,测试。
|