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

什么时候重构?

重构是一种习惯,一种编程习惯。这种习惯让我们迅速由菜鸟转变为大牛,可以编写出高质量、优秀的程序。

问题的关键就是降低修改成本与风险的方法,而这个方法就是系统重构。

走出重构的第一步对每一个人来说都是一次心灵的考验,甚至许多人总是徘徊于路口踌躇不前,但一旦跨出去了,它将成为你生命的一部分。

没有经过重构的,原生态的代码是没办法复用的,当我们发现代码需要复用时,切忌不要使用过去那种简单粗暴的复制黏贴,合理运用重构方法,加之以仔细、认真、即时的测试,就可以保证既有代码的正确,并使整个系统合理地复用起来,以提高系统的可维护性,关键是你有没有这样的意识。

添加新功能前线重构原系统,其目的有两个:

  1. 软件的设计总是与软件的复杂度有关的,原有的设计师在原有需求不复杂的条件下做出的,但随着新功能的加入,软件复杂度在发生着变化,因此必须调整原有的设计。

  2. 为了提高软件的可维护性与易变更性,添加新功能应遵循OCP原则。

系统重构是我们维护处高质量遗留系统的有效工具。

在紧急变更任务中,时间就是金钱,我们要用最省时省力的方法解决问题,这里的差别就是怎样去重构?——做完整的设计, 但只做重构中最紧急的部分。

测试驱动开发

测试驱动开发是极限编程的一个重要组成部分,它的核心思想非常简单,就是先写测试用例再编码。

后测试开发即先进行完备的软件设计,然后进行完备的软件编码,当几乎所有程序都设计开发完成后才开始相应的测试。这样的模式,从设计到测试的时间比较长,造成运行调试与测试的难度大,发现问题后的问题定位及修复的难度大,因而延长了软件开发的周期。

标准的测试驱动开发步骤:

  1. 编写测试程序,此时的测试程序必然无法编译或者无法测试通过

  2. 编写要实现的程序代码,使测试程序得以通过

  3. 在测试程序的保护下重构代码,使其得到优化

  4. 重复以上过程,使开发工作不断进行下去

有了测试程序的保护,我们可以大胆地尝试重构,使系统的代码质量得到提高。

当我们的项目开始进行新一轮开发时,首先对涉及的、需要修改的程序建立测试程序。当原有功能的测试程序建立起来并测试通过以后,我们开始添加新的代码。在添加新的代码前,按照测试驱动开发流程,先在原有测试程序的基础上添加新的测试用例。新的测试用例将体现系统的新功能,但此时的测试程序必然报错或无法测试通过,随后我们开始实现新功能,此时的程序可能不是最优的,只是能够保证测试程序的通过。接着我们开始思考并尝试重构来优化我们的设计。如此往复,直到完成所有开发。

分析既有代码的程序结构,用草图形式绘制出静态类图。在类图中绘制出相关的接口与类,主要的属性和方法,以及它们之间的关系。

全面的升级任务

演进式设计的核心思想是快速反馈:快速设计,快速开发出可运行的程序,快速测试,快速验证。演进式设计最大的问题是缺乏一种长远的规划。每次演进仅仅考虑此次功能的实现,最后设计成什么样子没有一个方向性的规划。

恰如其分的规划,就是对遗留系统目前的状况,面临的风险,可采用的措施进行一次恰如其分的数据收集与分析,有针对性地制定改造范围、执行阶段与打到的目标。

风险驱动设计时以风险的分析与识别作为核心,用最小的代价去完成最急迫的风险,从而达到恰如其分的设计开发的一种软件设计方法。该方法适用于以系统改造为目的的研发项目。

三类风险:

  1. 我们缺乏对该系统相关知识的掌握,程序修改与维护变成一种冒险。

  2. 维护成本越来越高,任何的变更都变得伤筋动骨。

  3. 最后一个,也是最可能促使企业痛下决心进行系统改造的原因,那就是旧技术已经不能满足用户新的需求,我们必须要进行新技术的转型。

识别风险才能让我们更加有效地去规避风险,从而更加有针对性地进行系统改造,避免系统重构工作特别容易出现的”想到哪里就做到哪里“的弊病。

时间: 2024-08-02 08:01:33

大话重构读书笔记——进阶篇一的相关文章

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

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

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

第三步:提高代码复用率 经过重构的第一步,我们将令人头疼的大函数分解成了大小适中的一个个小函数,经过重构第二步,我们将无所不能的大对象拆分成了功能内聚的一个个小对象.随后,我们需要考虑的问题就是优化我们的代码了. 1. DRY原则:Don't Repeat Yourself. 2. 如何识别相似或相近功能? a. 处理同一流程中某个环节而采用的不同方式,如购物付款方式不同,但结果相同,此时,可将付款结果合并成一个类或方法,将不同的付款流程抽象成一个接口下的多个实现类. b. 在不同业务中某个功能

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

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

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

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

《javascript权威指南》读书笔记——第二篇

<javascript权威指南>读书笔记--第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字符集 JavaScript程序是用Unicode字符集编写. Unicode是ASCII和Latin-1的超集,支持几乎所有语言. ES3 要求支持Unicode 2.1及后续版本 ES5 要求支持Unicode 3及后续版本 2.1.1 区分大小写 JavaScript是区分大小写的. HTML 并不区分大

《javascript权威指南》读书笔记——第一篇

<javascript权威指南>读书笔记--第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本书来补充下. 今天是今年的196天,由于我之前承诺过,每天分享读书笔记,只是之前分享的是大众读物,所以随手分享到kindle阅读群里了.但是现在读的是技术类书籍,分享到kindle读书群不太合适,所以还是以博客的形式分享.这样子,一个链接,大家感兴趣了就点开看看,不感兴趣了,就不点开. 其实这篇文章应该是昨天

Vue学习笔记进阶篇——Render函数

本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. <h1> <a name="hello-world" href="#hello-world"> Hello world! </a> </h1>

Python学习笔记进阶篇——总览

Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(多线程与进程池) Python学习笔记——进阶篇[第九周]———线程.进程.协程篇(队列Queue和生产者消费者模型) Python学习笔记——进阶篇[第九周]———协程 Python学习笔记——进阶篇[第九周]———MYSQL操作

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///