【重构学习】10 继承关系的重构

1、字段上移

修改点:两个子类拥有相同的字段

做法:将该字段移至父类

2、函数上移

修改点:有些函数,在各个子类中产生完全相同的效果

做法:将该函数移至父类

有一种特殊情况也需要这么做:子类函数覆盖了父类的,但是仍然做着相同的工作

在此重构中你可能会遇到一种情况,就是你提炼的函数调用了子类有而父类没有的函数,那么在父类中给此父类没有的函数,建立一个虚函数即可。

3、构造函数本体上移

修改点:你在各个子类中拥有一些构造函数,它们的本体几乎完全一致

做法:在父类中新建一个构造函数,并在子类构造函数中调用它。

4、函数下移

修改点:父类中的某个函数只与部分(而非全部)子类有关

做法:将这个函数移到相关的那些子类去。

5、字段下移

修改点:父类中某个字段只被部分(而非全部)子类用到

做法:讲这个字段下移到相关的子类去。

6、提炼子类

修改点:类中的某些特性只被某些(而非全部)实例用到

做法:新建一个类,将上面所说的那一部分特性移至子类

7、提炼父类

修改点:两个类有相似特性

做法:为这两个类建立一个父类,将相同特性移至超类

8、提炼接口

修改点:若干客户使用类接口中的同一子集,或者两个类的接口有部分相同

做法:将相同子集提炼到一个独立接口

意思很简单,就是将一个类里的一些业务相关的函数,或者是两个类中部分相同的函数,提取为Interface(这里不用接口用个英文的原因是在前面的文章中接口一词可能更多的可以理解为一个类的公共函数)

9、折叠继承体系

修改点:父类和子类无太大区别

做法:将它们合为一体

10、塑造模版函数

修改点:你有一些子类,其中相应的某些函数以相同顺序执行类似的操作,但各个操作的细节上有所不同

做法:将这些操作分别放进独立函数中,并保持它们具有相同的签名,于是原函数也就变得相同了,然后将原函数上移至父类

意思很简单,就是说你看见有些函数的具体操作不同,但是几个函数的组合操作顺序是一样的,那么就把它们的操作顺序提炼成函数放进父类。

11、以委托取代继承

修改点:某个子类只使用父类接口的一部分,或是根本不需要继承来的数据

做法:在子类中新建一个字段用以保存父类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系

动机:随着需求的变化,一开始的继承关系可能在慢慢变化后,你就发现父类中的许多操作并不适用于子类

Troy:这个时候你当然可以去把这些不适用子类的方法去搞到另一个子类里,但是如果做不到,那么就将父类对象作为子类的一个对象吧,去掉继承关系,这在设计模式里面貌似可以叫组合模式

12、以继承取代委托(看吧看吧,总是有相反的两个重构操作出现)

修改点:你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数

做法:让委托类继承受托类

两条告诫:

1.如果你并没有使用受托类的所有函数。那么你可能不需要使用此方法,你可以去去除中间人,用客户端直接调用受托类,也可以把委托类和受托类之间提炼出一个超类,当然也可以提取接口

2.受托对象被不止一个其他对象共享,而且受托对象是可变的。那么这种情况下你也不应该用此重构,因为这样就无法共享数据了,数据共享是委托关系承担的一种责任,你无法把它转化为继承关系。如果受托对象不可变你才能这么做。

时间: 2024-11-03 22:47:55

【重构学习】10 继承关系的重构的相关文章

【重构学习】05 函数的重构

<重构>这本书的代码都是java,我准备用C#来一遍. 而今天我的主要任务是写一大段垃圾代码出来,然后重构(仅限于函数的,不涉及到其它方面的重构). 程序界面: 功能介绍: 侠客名字自己取,然后点击按钮随机角色的属性, 根骨,经脉,柔韧,悟性等四项属性值都是随机而来. 其他的都是由这四个属性计算而来: 根骨:影响气血,基础外攻和基础内攻 经脉:影响内力和基础内攻 柔韧:影响身法和基础闪避 按钮功能的垃圾代码如下: /// <summary> /// 产生侠客 /// </su

【重构学习】07 数据的重构

这里的数据指的大概就是字段(貌似这章有些东西也是过时了,因为现在的.NET已经发展了很久了,包括Java也是) 1.自封装字段(其实就是属性啦,过时了) 修改点:直接访问字段,但是与字段间的耦合关系逐渐变得笨拙 做法:为这个字段建立一个取值/设值函数,并且只以这些函数来访问数据 好吧,现在明白属性是怎么来的了吗,就是因为这个原因,所以有的人会干脆和你说,你不要写公共字段,直接写公共属性. 因为公共字段能做的公共属性都能做,不能做的公共属性也能做. public string 我叫公共属性 { g

【重构学习】09 函数调用的重构

之前写了个函数的重构,这里写的是函数的调用的重构,不同哦,是为了写出让别人好调用的函数(或接口). 1.函数改名 修改点:函数的名称未能提示函数的用途. 做法:修改函数的名称 如果你想给函数写上一句什么注释,那么你就把这个注释想办法作为名称写上好了. Martin原话: 你可能无法第一次就取一个好名字,这个时候你就会想,就这么将就着吧,毕竟这只是一个名称. 当心,这是恶魔的召唤,是通向混乱之路,千万不要被它诱惑. (我就无数次被诱惑,然后取了很多渣名,因为想一个好名字真是太难了,除非我把函数名写

Java学习之继承关系内存分配

假设有C继承B,B继承A; 继承会继承除private修饰的成员变量,方法.但不会继承构造器. 所以调用被继承下来的方法时,不需要指明主调者,但是调用构造器时,就需要指明主调者,那就是super.如果继承中出现了函数的覆盖,那么默认主调者就是本对象(实例方法)或本类(类方法),如果想要调用被覆盖的方法,就得使用super(实例方法)或父类名(类方法). 当创建并初始化C的对象时,会优先调用B的构造器,然后发现B还有A这个父类,会优先调用A构造器,然后发现A有Object这个父类,会优先调用Obj

C#重构学习2

转帖重构学习 重构?代码坏味道?看到这两个疑问,也许就知道本期的话题是关于“重构”的,重构无处不在,重构可大可小,重构随时随地.让重构时刻记在脑海,使自己的代码变的优美.就让这本“重构艺术”手册带你走进重构的世界,亲密接触重构,如欣赏艺术般,体会重构的魅力. 文章下载地址:http://files.cnblogs.com/xia520pi/C_Sharp_Refactoring.rar 文章的目录: 1.代码重构 1.1.版权声明 1.2.内容详情 2.项目重构方案设计 2.1.版权声明 2.2

我10年的Android重构之旅:框架篇

在我这几年的学习和成长中,慢慢的意识到搭建一个优秀的 Android 开发框架是一件非常困难以及痛苦的事情,它不仅需要满足不断增长的业务需求,还要保证框架自身的整洁与扩展性,这让事情变得非常有挑战,但我们必须这样做,因为健壮的 Android 开发框架是一款优秀APP的基础.在我们开发的初期往往并不需要什么框架,因为 Android Framework 良好的容错性帮助我们避免了很多问题,甚至你不需要深入的学习就可以写出一个较为完善的 APP,几个简单Material Design 风格界面加上

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

[原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【重构学习】 04 重构与设计模式

好吧,<重构>这本书的第五章,主要是对即将要写到的一些具体重构手法的写作结构的一种描述,并没有什么重要的东西. 仿佛是为了庆祝元旦的放假,特意给我准备的章节,为了让我完成今天的任务而特意水了一章. 好吧,还是有一句重要的话:设计模式为重构提供了目标,而重构是到达之路. 以下是我的废话,大神莫笑: 如果你不明白设计模式是什么?不要紧,就算你不明白也不要紧. 因为很多人学了设计模式都会忘掉,有的时候是因为他们不用,所以忘了.有的时候是因为用的多了,所以忘了. 如果是后者那就是无招胜有招的境界,如果