第七章 在对象之间搬移特性
——读书笔记
在对象的设计过程中,要决定把对象放在哪里,可能不会一开始就做对,但是可以运用重构,改变自己原先的设计,这就用到了本章所提到额重构手法。
7.1 Move Method(搬移函数)。
问题:你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者或者被后者调用。
方法:在该函数最常引用的类中建立一个有着类似行为的新函数,将旧函数编程一个单纯的委托函数,或是将旧函数完全移除。
动机:一个类有太多行为,或者与另一个类有太多合作形成高度耦合,为了让系统中的类更简单,干净利落地实现系统交付的任务。
做法:1.检查源类中被函数所使用的一切特性(包括字段和函数),考虑其是否应该被搬移;2.检查源类的子类和超类,看看是否有该函数的其他声明;3.在目标类中声明该函数;4.将原函数的代码复制到目标函数中,调整后者,使其能在新家中正常运行;5.编译目标类;6.决定如何从源函数正确引用目标对象;7.修改源函数,使之成为一个纯委托函数;8.编译测试;9.决定是否删除源函数,或将它当作一个委托函数保留下来;如果要移除源函数,将源类中对源函数的所有调用,替换为对目标函数的调用;10.编译测试。
7.2 Move Field(搬移字段)。
问题:在你的程序中,某个字段被其所驻类之外的另一个类更多地用到。
方法:在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。
动机:对于一个字段,在其所驻类之外的另一个类中有更多的函数使用了它。
做法:1.如果字段的访问级是public,使用Encapsulate Field将它封装起来;2.编译测试;3.在目标类中建立与源字段相同的字段,并同时建立相应的设值/取值函数;4.编译目标类;5.决定如何在源对象中引用目标对象;6.删除源字段;7.将所有对源字段的引用替换为对某个目标函数的调用;8.编译测试。
7.3 Extract Class(提炼类)。
问题:某个类做了应该由两个类做的事情。
方法:建立一个新类,将相关的字段和函数从旧类搬移到新类。
动机:一个类应该是一个清楚的抽象,处理一些明确的责任,实际工作中,类可能不断扩大,加入很多新功能,这样的类往往有大量函数和数据,这样的类往往不易理解,所以需要提炼类,将其中独立的功能提炼出来形成新的类。
做法:1.决定如何分解类所负的责任;2.建立一个新的类,用以表现从旧类中分离出来的责任;3.建立“从旧类访问新类”的连接关系;4.对于你想搬移的每一个字段,运用Move Field搬移之;5.每次搬移后编译测试;6.使用Move Method将必要的函数搬移到新类;7.先搬移较低层函数(被其他函数调用多于调用其他函数),再搬移较高层函数;8;每次搬移后编译测试;9.检查,精简每个类的接口;9.决定是否公开新类,如果你的确需要公开,旧要决定让它成为引用对象还是不可变的值对象。
7.4 Inline Class(将类内联化)。
问题:某个类没有做太多事情。
方法:将这个类的所有特性搬移到另一个类中,然后移除原类。
动机:正好与Extra Class相反,如果一个类不再承担足够责任,不再有单独存在的理由,就需要将这个类塞进另一个类中。
做法:1.在目标类身上声明类的public协议,并将其中所有函数委托至源类;2.修改所有源类引用点,改而引用目标类;3.编译测试;4.运用Move Method和Move Field将源类的特性全部搬移到目标类。
7.5 Hide Delegate(隐藏“委托关系”)。
问题:客户通过一个委托类来调用另一个对象。
方法:在服务类上建立客户所需的所有函数,泳衣隐藏委托关系。
动机:将委托关系隐藏起来,防止委托关系发生变化,客户也得相应变化,从而去除这种依赖。
做法:1.对于每一个委托关系中的函数,在服务对象端建立一个简单的委托函数;2.调整客户,令它只调用服务对象提供的函数;3.每次调整后编译测试;4.如果将来不再有任何客户需要取用受托类,便可移除服务对象中的相关访问函数;5.编译测试。
7.6 Remove Middle Man(移除中间人)。
问题:某个类做了过多的简单委托动作。
方法:让客户直接调用受托类。
动机:在Hide Delegate中,封装受托对象是有好处的,但是也是有代价的:每当客户要使用受托类新特性,就必须在服务端添加一个简单委托函数,随着受托类功能增多,这个过程会让人痛苦,服务类变成了一个“中间人”,此时应该移除中间人,让客户直接调用受托类。
做法:1.建立一个函数,泳衣获得受托对象;2.对于每个委托函数,在服务类中删除该函数,并让需要调用该函数的客户转为调用受托对象;3.处理每个委托函数后,编译测试;
7.7 Introduce Foreign Method(引入外加函数)。
问题:你需要为提供服务的类增加一个函数,但你无法修改这个类。
方法:在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。
动机:使用一个类的时候需要一个新的服务,但是不能修改源码,就得在客户端编码,补足函数所需功能。但是如果为一个服务类建立了大量外加函数,就不该使用这个重构了,应该用Introduce Local Extension。
做法:1.在客户类中建立一个函数用来提供所需功能;2.以服务类实例作为该函数的第一个参数;3.将该函数注释为:“外加函数(foreign method)”,应在服务类实现。
7.8 Introduce Local Extension(引入本地扩展)。
问题:你需要为服务类提供一些额外函数,但你无法修改这个类。
方法:建立一个新类,使它包含这些额外的函数。让这个扩展品成为源类的子类或包装类。
动机:类的作者也无法预见未来,因此常常没能为后来者准备足够有用的函数。如果无法修改源码,需要两个以上外加函数,就需要将这些函数组织在一起,放到一个恰当的地方。
做法:1.建立一个扩展类,将它作为原始类的子类或者包装类;2.在扩展类中加入转型构造函数;3.在扩展类中加入新特性;4.根据需要,将原对象替换为扩展对象;5.将针对原始类定义的所有外加函数搬移到扩展类中。

《重构》第七章--读书笔记相关推荐

  1. 《深入理解计算机系统》第七章读书笔记

    <深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...

  2. 《文明之光》第七章读书笔记

    第七章--一个家族的奇迹--文艺复兴 综述:美第奇家族曾是这个世界上最富有,最具影响力的家族,他们控制着欧洲的金融,与皇室联姻,左右着教皇的任命.虽然这个家族随着它的最后一位成员的去世而终结,可我们现 ...

  3. 《程序员自我修养》第七章读书笔记

    书还是接上回,本篇主要对第七章的相关内容进行总结.第七章主要对动态链接的相关内容进行分析. 7.1 为什么要动态链接 既然要对动态链接进行分析,首先应对动态链接出现的原因进行一个简单的分析.动态链接从 ...

  4. 《构建之法》第4.17章读书笔记

    <构建之法>第4.17章读书笔记 第四章 原文语句: 异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的. 提出问题: 1.什么是DLL?DLL是来解决什么问题的? 网上说法: ...

  5. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

  6. 期权、期货及其他衍生产品 第四章读书笔记 利率

    期权.期货及其他衍生产品 第四章读书笔记 利率 利率的种类 我国的利率体系 中央银行利率 金融机构利率 金融市场利率 利率的度量 连续复利利率和与之等价的每年m次复利利率的关联 零息利率 债券定价 债 ...

  7. Python编程:从入门到实践第六章读书笔记6.3遍历字典

    Python编程:从入门到实践第六章读书笔记6.3遍历字典 #coding:gbk#6.3.1遍历所有的键-值对 user_0 = {'username': 'efermi','first': 'en ...

  8. 深入理解计算机系统-第七章(链接)笔记

    深入理解计算机系统-第七章(链接)笔记 背景 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程 这个文件可被加载(拷贝)到存储器中并执行: 链接可以执行于编译时,也就是源代码翻译成机器码 ...

  9. 《人人都是产品经理》第四章读书笔记及读后感作文2400字

    <人人都是产品经理>第四章读书笔记及读后感作文2400字: 最近一直在忙别的学习,以至于好久没有更新公众号了,也好久没有写读书笔记了.<人人都是产品经理>这本书其实早在一个月前 ...

最新文章

  1. 聚焦联机交易分析一体化,巨杉数据库湖仓一体云产品全线升级
  2. 订单表的分库分表方案设计(大数据)
  3. net项目总结一(1)
  4. kafka和storm集群的环境安装
  5. First Night
  6. 一份针对于新手的多线程实践--进阶篇
  7. 160 - 18 Brad Soblesky.1
  8. 前端学习(3164):react-hello-react之添加todoList
  9. for循环之性能优化
  10. BootStrap table 传递搜索参数
  11. android sdk根目录,Android SDK位置
  12. 信息学奥赛一本通C++版
  13. Choerodon猪齿鱼1.0先行版已发布!
  14. 2021-07-22 wifi入门综述整理
  15. 【hive】hive如何将Jan 1, 2021 12:40:46 PM时间格式转换为指定格式
  16. 计算机操作系统安装及备份系统部分,操作系统安装、备份和还原.ppt
  17. [转载]2007热点技术职位排行及点析
  18. 超详细的ROC曲线绘制教程
  19. 网管教程:网络故障排除参考大全
  20. 已解决:极品飞车9 Most Wanted无故跳出回桌面问题

热门文章

  1. 衡水中学2021年的高考成绩查询,2021年“百强高中”排名公布,第一名一本率99.5%,衡中进前三...
  2. matlab计算连续复利,Code 2-1 单利、离散复利与连续复利的对比
  3. vs2005 sp1 补丁的安装问题
  4. 外设篇:NandFlash和iNand
  5. imvu为什么显示无法连接服务器,IMVU服务器错误怎么办 服务器无法连接解决办法...
  6. 金融机房托管解决方案
  7. [FJOI 2016]bzoj 4408 神秘数 - 线段树
  8. 抱歉出现问题:关闭 windows hello,然后尝试再次运行安装程序
  9. 阿蒙森 斯科特_斯科特的电影版本:3下! 1去。
  10. 计算机英语发展,计算机发展史(英语版)