重构.改善既有代码的设计11处理概括关系更优雅的继承

aoyihuashao aoyihuashao     2023-03-09     149

关键词:

11、处理概括关系【更优雅的继承】

 

Pull Up Field(值域上移)

两个subclasses 拥有相同的值域。将此一值域移至superclass。

 

Pull Up Method(函数上移)

有些函数,在各个subclass 中产生完全相同的结果。将该函数移至superclass。

 

Pull Up Constructor Body(构造函数本体上移)

你在各个subclass 中拥有一些构造函数,它们的本体(代码)几乎完全一致。 
在superclass 中新建一个构造函数,并在subclass 构造函数中调用它。

 

Push Down Method(函数下移)

superclass 中的某个函数只与部分(而非全部)subclasses 有关。 
将这个函数移到相关

 

Push Down Field(值域下移)

superclass 中的某个值域只被部分(而非全部)subclasses 用到。 
将这个值域移到需要它的那些subclasses 去。

 

Extract Subclass(提炼子类)

class 中的某些特性(features)只被某些(而非全部)实体(instances)用到。 
新建一个subclass ,将上面所说的那一部分特性移到subclass 中。

 

Extract Superclass(提炼超类)

两个classes 有相似特性(similar features)。 
为这两个classes 建立一个superclass ,将相同特性移至superclass 。

 

Extract Interface(提炼接口)

若干客户使用class 接口中的同一子集;或者,两个classes 的接口有部分相同。 
将相同的子集提炼到一个独立接口中。

 

Collapse Hierarchy(折叠继承关系)

superclass 和subclass 之间无太大区别。 
将它们合为一体。

 

Form Template Method(塑造模板函数)

你有一些subclasses ,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。 
将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至superclass 。

 

Replace Inheritance with Delegation(以委托取代继承)

某个subclass 只使用superclass 接口中的一部分,或是根本不需要继承而来的数据。 
在subclass 中新建一个值域用以保存superclass ;调整subclass 函数,令它改而委托superclass ;然后去掉两者之间的继承关系。

 

Replace Delegation with Inheritance(以继承取代委托)

如果你发现自己需要使用「受托 class」中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),本重构可以帮助你轻松回头使用「继承」。

 

原作者的总结

有一批重构手法专门用来处理「概括关系」(generalization ;译注:这里指的是class 继承」这档事),其中主要是将函数(methods)上下移动于继承体系之中。 Pull Up Field 和 Pull Up Method 都用于将class 特性向继承体系的上端移动,Push Down Method 和 Push Down Field 则将class 特性向继承体系的下端移动。构造函数比较难以向上拉动,因此专门有一个Pull Up Constructor Body 处理它。我们不会将构造函数往下推,因为 Replace Constructor with Factory Method 通常更管用。

如果有若干函数大体上相同,只在细节上有所差异,可以使用Form Template Method 将它们的共同点和不同点分开。

除了在继承体系中移动class 特性之外,你还可以建立新class ,改变整个继承体系。 Extract Subclass、Extract Superclass 和 Extract Interface 都是这样的重构手法,它们在继承体系的不同位置构造出新元素。如果你想在型别系统(type system)中标示(mark)一小部分函数, Extract Interface 特别有用。如果你发现继承体系中的某些classes 没有存在必要,可以使用 Collapse Hierarchy 将它们移除。

有时候你会发现继承并非最佳选择,你真正需要的其实是委托(delegation),那么, Replace Inheritance with Delegation 可以帮助你把继承改为委托。有时候你又会想要做反向修改,此时就可使用Replace Delegation with Inheritance。

 

我的总结

1、实事求是的继承: 
1.1、按需把函数或成员变量放在子类或父类。 
1.2、按需添加或合并子类。 
2、高级应用 
2.1、模板模式 
2.2、委托模式 
2.2、选择使用模板模式还是采用委托模式。条件是使用次数多少,多的用模板,少的用委托。

 

 

重构.改善既有代码的设计8重新组织数据(更优雅的面向对象)(代码片段)

重新组织数据SelfEncapsulateField(自封装值域)自封装值域就是getterandsetter,这就没啥好说的了。ReplaceDataValuewithObject(以对象取代数据值)比如:不用字符串表示电话号码,而用一个电话号码的类表示。好处:更容易扩展,比如... 查看详情

重构改善既有代码设计--重构手法14:hidedelegate(隐藏委托关系)

客户通过一个委托类来调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。动机:封装即使不是对象的最关机特性,也是最关机特性之一。“封装”意味着每个对象都应该少了解系统的其他部分。... 查看详情

《重构-改善既有代码的设计》笔记

函数如果函数过长或者内部需要添加注释,就把它提炼出来以成一个命名良好的函数。函数名来替代注释。提炼函数的难点在于对局部变量的处理。函数粒度越小被复用的机会越大。函数名称和函数内容的语义距离要贴近。 查看详情

实践提高《重构改善既有代码的设计第2版》pdf中文+pdf英文+对比分析

重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码。编程爱好者都知道,MartinFowler的《重构:改善既有代码的设计》已经成为全球有经验的程序员手中的利器,既可用来改善既有代码的设计、提升软件的可... 查看详情

重构·改善既有代码的设计.04之重构手法(下)完结(代码片段)

1.前言本文是代码重构系列的最后一篇啦。前面三篇《重构·改善既有代码的设计.01之入门基础》、《重构·改善既有代码的设计.02之代码的“坏味道”》、《重构·改善既有代码的设计.03之重构手法(上)》介绍了基础入... 查看详情

重构:改善既有代码的设计读书笔记——开篇

 【重构:改善既有代码的设计】读书笔记总目录 1、重构原则2、代码的坏味道【1】3、代码的坏味道【2】4、代码的坏味道【3】5、代码的坏味道【4】6、重构手法之ExtrctMethod(提炼函数)、InlineMethod(内联函数)、InlineTe... 查看详情

重构改善既有代码设计--重构手法18:selfencapsulatefield(自封装字段)

你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设值函数(getting/settingmethods),并且只以这些函数来访问值域。 privateint_low,_high;booleanincludes(intarg){returnarg>=_low&&arg<=_high... 查看详情

《重构——改善既有代码的设计》pdf下载

《重构——改善既有代码的设计》【PDF】下载链接:https://u253469.ctfile.com/fs/253469-231196358   编辑推荐   重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是《重构:改善既... 查看详情

《重构——改善既有代码的设计》pdf下载

《重构——改善既有代码的设计》【PDF】下载链接:https://u253469.ctfile.com/fs/253469-231196358   编辑推荐   重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是《重构:改善既... 查看详情

重构改善既有代码设计--重构手法09:substitutealgorithm(替换算法)

你想要把某个算法替换为另一个更清晰地算法。将函数本体替换为另一个算法。stringFoundPerson(string[]people){for(inti=0;i<people.Length;i++){if(people[i].Equals("don")){return"don";}if(people[i].Equals("john")){return"john";}if(people[i] 查看详情

重构改善既有代码设计--重构手法15:removemiddleman(移除中间人)

某个类做了过多的简单委托动作。让客户直接调用受托类。动机:在HideDelegate(隐藏委托关系)的“动机”中,谈到了“封装委托对象”的好处。但是这层封装也是要付出代价的,它的代价是:每当客户要使用受托... 查看详情

重构-改善既有代码的设计

什么是重构?重构(名词):对软件内部的一种调整,日的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构(动词):使用一系列的重构手法,在不改变软件可观察行为的前提下,调整其结构。什... 查看详情

重构-----改善既有代码的设计

1重构原则1.1定义: 1).调整软件内部结构,目的是在不改变软件软件可查行为前提下,提高其可理解性,降低其修改成本。 2).使用一系列重构准则,在不改变软件可查行为前提下,调整其结构1.2何时重构  1).三次... 查看详情

重构改善既有代码的设计--第6章--重新组织函数

第6章重新组织函数6.1ExtractMethodLongmethods,因为包含太多信息和逻辑,不容易处理和修改。所以需要进行ExtractMethod。(1)场景当一个函数过长,或者一段代码需要注释才能看懂,就可以考虑将其放入独立函数中。(2)优点每个... 查看详情

重构改善代码的既有设计

最近在学习重构改善代码的即有设计,虽然在平时的工作学习中有尝试进行重构,但没有清晰的思路往往就是随性而为,以个人的编码风格为准,我们往往知道这样会更好,但是面对编程风格的挑战时,我们往往拿不出准确专业... 查看详情

读书笔记读《重构改善既有代码的设计》有感

一、书籍介绍  书名:《重构改善既有代码的设计》  作者:[美]MartunFowler  译者:熊节  出版社:人民邮电出版社二、背景  深知自己的代码水平,但自己又有一点代码洁癖,看不惯的代码,自己重构... 查看详情

重构.改善既有代码的设计14总结&读后感

...,虽然大多数观点已经被认为是理所当然的事情了。 重构的定义重构分几种: 1、狭义的代码重构   就是本书讲的,在不改变软件可观察行为的前提下,改变其内部结构。这就是完全不改变程序的功能,只是... 查看详情

《重构-改善既有代码的设计》读书笔记

重构,第一个案例1.1起点如果发现现有的代码结构使你无法很方便地添加新特性,那就先重构,使特性的添加比较容易进行后,再添加特性;1.2重构的第一步为即将修改的代码建立可靠的测试环境–是人就会犯错,所以需要可靠的测试;... 查看详情