《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(一)

来源:互联网 发布:linux重定向到文件 编辑:程序博客网 时间:2024/05/17 06:48

一、Move Method(搬移函数)

你的程序中,有个函数与其所贮类之外的类进行更多交流。

在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数编程一个单纯的委托函数,或是将旧函数完全移除。

动机

“搬移函数”是重构理论的支柱。如果一个类有太多的行为,或如果一个类与另一个类有太多合作而形成的高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务。

做法

1、检查源类中被源函数所使用的一切特性(包括字段和函数),考虑它们是否也该被搬移。

如果某个特性只被你打算搬移的那个函数用到,就应该将它一起搬移。如果另有其他函数使用了这个特性,你可以考虑将使用该特性的所有函数全部一并移除。有时候,搬移一组函数比逐一搬移简单些。

2、检查源类的子类和超类,看看是否有该函数的其他声明。

如果出现其他声明,你或许无法进行搬移,除非目标类也同样表现出多态性。

3、在目标函数中声明这个函数。

你可以为此函数选择一个新名称---对目标类更有意义的名称。

4、将源函数的代码复制到目标函数中。调整后者后,使其能在新家中正常运行。

如果目标函数使用了源类中的特性,你得决定如何从目标函数引用源对象。如果目标类中没有相应的引用机制,就把源对象的引用当做参数,传给新建立的目标函数。

如果源函数包含异常处理,你得判断逻辑上应该由哪个类来处理这一异常。如果应该由源类来负责,就把异常留在原地。

5、编译目标类。

6、决定如何从源函数正确引用目标对象。

可能会有一个现成的字段或函数帮助你取得目标对象。如果没有,就看能否轻松建立一个这样的函数。如果还是不行,就得在源类中新建一个字段来保存目标对象。这可能是一个永久性修改,但你也可以让它是暂时性的,因为后继的其他重构项目可能会把这个新建字段去掉。

7、修改源函数,使之成为一个纯委托函数。

8、编译、测试

9、决定是否删除源函数,或将它当做一个委托函数保留下来。

如果你经常要在源对象中引用目标函数,那么将源函数作为委托函数保留下来会比较简单。

10、如果要移除源函数,请将源类中对源函数的所以调用,替换为对目标函数的调用。

你可以每修改一个引用点就编译并测试一次。也可以通过一次“查找/替换”改掉所有引用点,这通常简单一点。

11、编译测试

二、Move Field(搬移字段)

你的程序中,某个字段被其所贮类植物的另一个类更多的使用。

在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。

动机

在类之间移动状态和行为,是重构过程中必不可少的措施。随着系统发展,你将会发现自己需要的新的类,并需要将现有的工作责任拖到新的类中。在这个星期看似合理而正确的设计决策,到了下个星期可能不再正确。这没问题。如果你从来没有遇到这种情况,那才有问题。

如果我发现,对于一个字段,在其所贮之外的另一个类中有更多函数使用了它,我就会考虑搬移这个字段。上述所谓“使用”可能是通过设值 取值函数间接进行的。我也可能移动该字段的用户(某个函数),这取决于是否需要保持接口不受变化。如果这些函数看上去很适合待在原地,我就选择搬移字段。

使用Extract Method时,我也可能需要搬移字段。此时我回先搬移字段,然后再搬移函数。

做法

1、如果字段的访问级是public,使用Encapsulate Field将它封装起来。

如果你有可能移动那些频繁访问该字段的函数,或如果有许多函数访问某个字段,先适应Self Encapsulate Field也许会有帮助。

2、编译测试

3、在目标类中建立于源字段相同的字段,并同时建立相应的设值 取值函数。

4、编译目标类

5、决定如何在源对象中引用目标对象。

首先看是否有一个现成的字段或函数可以助你得到目标对象。如果没有,就看能否轻易建立这样一个函数。如果还不行,就得在源类中新建一个字段来存放目标对象。这可能是个永久性修改,但你也可以让它是暂时的,因为后续重构可能会把这个新建字段给去掉。

6、删除源字段。

7、将所有源字段的引用替换为对某个目标函数的调用。

如果需要读取该变量,就把对源字段的引用替换为对目标取值函数的调用;如果要对该变量赋值,就把对源字段的引用替换成对设值函数的调用。

如果源字段不是private的,就必须在源类的所有子类中查找源字段的引用点,并进行相应替换。

8、编译、测试。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 碰瓷的手碰我后视镜怎么办 摩托被盗监控录像器没有记录怎么办 车贷逾期车被贷款公司拖走了怎么办 发现邻居家小孩偷了我的钱该怎么办 孕晚期挺着大肚子好累怎么办 古墓丽影崛起东西满了怎么办 塞尔达传说大师剑耐久没了怎么办 冒险岛遇见超能力者全屏挂机怎么办 当危险来临时该怎么办作文400字 生气把孩子手掌内侧打肿了怎么办 驾驶证未满一年扣12分怎么办 在高速上超速百分之10以下怎么办 中兴手机重启死机开不了机怎么办 太胖了太自卑了该怎么办 儿子因为长的胖特别自卑怎么办? 苹果ld叫我检查身份信息怎么办 我家墙让对面给漂水了怎么办 如果你流落到荒岛上你会怎么办 手机迅雷下载版权方不给下载怎么办 白色有彩色花纹的衣服染色了怎么办 载兰花假如下雪和打霜怎么办 皇室战争你的队友离开了对战怎么办 海岛奇兵发现求救信号第三个怎么办 海岛奇兵勋章太多对手太强怎么办 鱼为什么换缸鱼翅黑了怎么办 鱼丸捕鱼大作战换手机了怎么办 2o岁j'j小怎么办 为什么小米5s指纹不能用怎么办 cs录屏软件运行内存太大了怎么办 可是没有他我怎么办啊是什么电视剧 可是没有他我怎么办啊是哪个电视剧 手机太卡了打字打不了了怎么办 梦幻西游的将军令没有电了怎么办 将军令全部的序列号都忘记了怎么办 船员证被公司压着想自己换证怎么办 电子录入系统中无法打开影像怎么办 火车票退票后说银行退款失败怎么办 苹果4s玩游戏闪退怎么办 买了二手房原房主不迁户口怎么办 苹果禁反忘记工id密码了怎么办 玩英雄联盟用腾讯游戏平台卡怎么办