大话重构读书笔记——实践篇二

第三步:提高代码复用率

经过重构的第一步,我们将令人头疼的大函数分解成了大小适中的一个个小函数,经过重构第二步,我们将无所不能的大对象拆分成了功能内聚的一个个小对象。随后,我们需要考虑的问题就是优化我们的代码了。

1. DRY原则:Don‘t Repeat Yourself.

2. 如何识别相似或相近功能?

  a. 处理同一流程中某个环节而采用的不同方式,如购物付款方式不同,但结果相同,此时,可将付款结果合并成一个类或方法,将不同的付款流程抽象成一个接口下的多个实现类。

  b. 在不同业务中某个功能相似或相近的环节,如填写各类单据时的校验环节,校验数据,校验用户等等。

  c. 本身就相似或相近的功能,将相同代码抽象为父类或公用类,保留不同代码在原程序中。

3. 如何重构,或者说如何提高代码复用?

它需要有相当的面向对象分析与设计理论知识与相当的分析设计经验。不论怎样,重构的第一步是比较代码。

  a. 当重复代码存在于同一对象中时——抽取方法

    当看到同一个类中几个方法均出现了相同的几行代码时,可以将这几行代码抽取成一个单独的方法,再对其进行调用。

  b. 当重复代码存在于不同对象中时——抽取类

    比较直观的方法就是运用“抽取类”将共同的部分抽取到一个工具类中,比如我们常见的对数据库的操作,将公有方法写入SqlHelper类中,以此为其他各类所调用。采用工具类的方法非常实用,被合并的代码即使分散在系统的各个角落,各自功能没有任何联系,都可以采用。当一个需求变更导致分散在各处的代码修改时仅需修改工具类中对应的方法。

  c. 不同对象中复用代码的另一种方法——封装成实体类

    与上述方法比较类似的一种方法就是提取并封装成实体类,实体类内部存在着较强的业务相关性。工具类仅仅表现为一堆方法的集合,实体类体现的是一定的业务逻辑,并在使用时需要实例化。

  d. 当代码所在类具有某种并列关系时——抽取父类

    i. 整理原有代码,抽取函数

    ii. 抽取父类,从多个要重构的类中抽取一个共同的父类

  e. 当出现继承泛滥时——将继承转换为组合

    组合与继承的对应关系:


组 合 关 系


继 承 关 系


局部类


父类


整体类


子类


从整体类到局部类的分解过程


从子类到父类的抽象过程


从局部类到整体类的组合过程


从父类到子类的扩展过程

  f. 当重复代码被割裂成碎片时——继承结合模板模式

    模板模式是GoF设计模式中的一个,如果你为一个算法定义了一系列步骤,并且允许子类来实现其中的一个或多个步骤,你就可以使用这个模式。该方法将把分离得支离破碎的程序过程,分解成数个方法定义在模板模式的父类中,将不同的部分分别在子类中实现。

在我们开发过程中有效地建立起持续集成环境,常常是保证代码质量非常重要的手段之一。

第四步:发现程序可扩展点

我们进行系统重构,其中一个重要的目的就是使系统能够更加轻松地应对系统需求的变更,即提高系统的易变更性。

开放-封闭原则: OCP, Open-Close Principle,当系统需求发生变更时,我们可以对软件功能进行扩展,使其满足新的需求。

1. 如何避免因新需求所做的修改为原有功能引入bug?

最好的办法是在不修改原有代码的基础上实现新的功能,最关键的就是要将原有代码与新代码有效地隔离。

2. 可扩展设计的关键是?

先重构原有代码,使其具有可扩展功能,再添加新程序,使其满足OCP原则。

3. 当新需求到来时如何进行设计?

  a. 在不增加新功能的条件下实现可扩展功能

  b. 运用“抽取接口”去归纳各个不同的类,从而抽取出共同的方法放到接口中

  c. 实现接口的配置与调用

4. 什么是hook?它有什么作用?

hook是一个空函数,调用它就如同什么都没有调用一般。但hook如果被放在了抽象类中,作用就非常大了。如果抽象类的子类要使用它时,则重载这个函数,为其编写各自的代码,完成相应操作,而其他子类如果不使用它,则什么也不用做。

5. 扩展点设计方法:

  a. 开放-封闭原则

  b. 过程的扩展与放置钩子——运用模板模式增加可扩展点

  c. 面向切面的可扩展设计(AOP:Aspect Oriented Programming编程)

第一种设计使用于if-else或者switch这样的条件切换语句,第二种设计适用于拥有相似操作步骤的一系列操作中,第三种适用于在某些操作前后有不确定的前置或后续操作时。

6. 当新需求到来时,我们应当有足够的意识,让这种代码的修改符合OCP原则,这是保证软件质量不会下降的一个非常重要的措施之一。

时间: 2024-10-14 12:40:10

大话重构读书笔记——实践篇二的相关文章

大话重构读书笔记——实践篇一

第一步: 从分解大函数开始 1. 什么是大函数? 大函数就是那些业务逻辑特别复杂.程序代码特别多.一提起来就让人头疼不已的超级方法.超级大函数很难让人读懂,更难于维护与变更,毫无疑问是软件退化的重灾区. 2. 如何解决超级大函数问题? 最有效的办法就是分解,按照功能一步一步分解,还原其应有的优化结构.这个过程我们常用的方法叫“抽取方法”.重构是一个探索的过程. 3.抽取方法: a. 将代码原子化时,为该函数取个易懂的名称.起初我们对这段代码的理解可能不那么深,因此往往选择用结果变量为其命名,随着

大话重构读书笔记——进阶篇二

我们怎样拥抱变化 软件系统应对快速变化的终极利器,是以领域模型为核心建立的软件架构. 软件发展的基本特征就是变更,不论是源于需求的变更还是源于技术的变更. 运用领域模型,通过图形化的分析,可以让我们快速掌握真实世界的规律,进而指导软件的设计与开发.领域模型是联系真实世界与软件世界的枢纽,首先通过对真实世界的分析绘制领域模型,然后照着领域模型设计软件,就可以保证真实世界与软件世界的对应关系. 一般来说,领域模型是基于用户业务领域知识的分析,这些领域知识源于用户对软件系统的业务需求,却超越了业务需求

大话重构读书笔记——进阶篇一

什么时候重构? 重构是一种习惯,一种编程习惯.这种习惯让我们迅速由菜鸟转变为大牛,可以编写出高质量.优秀的程序. 问题的关键就是降低修改成本与风险的方法,而这个方法就是系统重构. 走出重构的第一步对每一个人来说都是一次心灵的考验,甚至许多人总是徘徊于路口踌躇不前,但一旦跨出去了,它将成为你生命的一部分. 没有经过重构的,原生态的代码是没办法复用的,当我们发现代码需要复用时,切忌不要使用过去那种简单粗暴的复制黏贴,合理运用重构方法,加之以仔细.认真.即时的测试,就可以保证既有代码的正确,并使整个系

大话重构读书笔记——保险索下的系统重构

1. 保险索是什么? 保险索就是每次重构后正确的测试方法. 2. 什么是程序代码正确的测试方法? 在不同的场景标准是不一样的.但与其他测试不同,系统重构在测试代码正确性方面有自己独特的方法,那就是不改变软件外部行为. 3. Mock 在测试过程中,对于某些不容易构造或不容易获取的对象,用一个虚拟对象来替代以使测试得以继续的方法 4. 自动化测试不是银弹,不是所有代码都适合自动化测试: a. 与web容器或其他设备驱动相关的代码是不适合自动化测试的,因为我们在测试的时候不希望去启动web容器或其他

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

我编程,我快乐——读书笔记(二)

我编程,我快乐--读书笔记(二) 第二章 在产品上投资 1. 我之所以说自己有天赋,是因为我发现自己在工作中不断学习,并且不断进步. 2. 只有向这件产品中投入心血.汗水.眼泪和资金,才能使它真正具有价值. 3. 要主动问,不要等着别人来告诉你.授人以鱼不如授人以渔. 4. 如果你想要雇佣某人来为你工作,你会希望这个人总是要受那些专家的支配吗?我不愿意.我想要的是一个能够自立的员工. 5. 与客户的互动式非常重要的,清楚地了解客户的要求比似懂非懂然后自己填写细节要好得多. 6. 学习行业是如何运

[.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

<Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内存,我们并不需要去担心内存泄漏,资源分配和指针初始化等问题.不过,它也并非万能,因为非托管资源需要我们自己进行清理,如文件句柄.数据库连接.GDI+ 对象和COM 对象等. 目录 十二.推荐使用成员初始化器而不是赋值语句 十三.正确地初始化静态成员变量 十四.尽量减少重复的初始化逻辑 十五.使用 using

《图解tcp/ip》读书笔记(二)

<图解tcp/ip>读书笔记(二) 本周主要阅读的是本书的第三章--数据链路. 当然了,从某些角度讲,我认为这一章就是计算机网络的最基本的内容之一.整章讲述了数据链路层的作用和相关技术,主要描述了以太网.无线通信.ppp.公共网络以及其他的一些数据链路一些细节性的技术. 由于之前已经学习过相关计算机网络的课程,因此,就不再详细的记录整个阅读内容了,很多让我突破以前思维定式的一些知识,我挑一些列在下面. 其实这些知识花几分钟.几个小时,就可以得到,或者查阅互联网会得到比这本书更新的技术,但是,有

《C#图解教程》读书笔记之二:存储、类型和变量

一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声明: (2)类型是一种模板:模板本身不是数据结构,但它详细说明了由该模板构造的对象的特征: (3)C#提供了16种预定义类型:13种简单类型(数值类型:int,float,double,decimal等:非数值类型:bool,char),3种非简单类型(object,string,dynamic): 所有的预定义类型都直接映射到底层的.NET类型.C#的类型名称其实就是.NET类型的别