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

重构-改善既有代码的设计 pdf 阅读详情

随着项目的进展,我们会发现已经完成的代码结构不再象我们预想的那么清晰合理,这大多是由于需求的变更造成的。此时我们需要改善目前的代码,有两种方法,一种是重写,另一种是重构。重写的好处是明显的,结构必然更合理,但是问题在于浪费时间。重构是一个折中的方法,时间始终,调整后结构也变得更合理。一般情况下,当我们对已有代码修改超过三次时就需要重构。

重构的基本原则是步步为营,每次进行一小步,然后测试,周而复始。另一个原则是抵制诱惑,不要改变代码的外在表现,不要试图修正代码中的Bug。下面是具体的重构名录:

 

重新组织你的函数
Extract Method:将太长的函数从逻辑上分成几个小函数
Inline Method:将几个没有实质性工作的小函数合并
Inline Temp:将仅赋值一次的变量去掉,用到它的地方统统用所赋的值代替
Replace Temp with Query:和上类似,当所赋值为一个复杂的表达式时用一个函数实现此表达式,用到的地方用函数代替
Introduce Explaining Variable:当某一表达式(特别是复杂的逻辑表达式)时,将其拆成几部分分别赋给几个命名规范的变量
Split Temporary Variable:将复用的变量用几个变量表示,使得其更易理解
Remove Assignments to Parameters:当对函数的传入参数赋值时,用另一个临时变量代替,避免语义混淆
Remove Method with Method Object:当某个复杂函数由于内部参数太多以至于很难Extract Method时,可以用一个类封装他,使用类的内部成员代替这些参数
Substitute Algorithm:将函数采用的算法换成另一个算法,同时保持函数原型不变

在对象之间搬移特性
Move Method:当某个类成员函数和另一个类耦合过紧时可以考虑将其移动到另一个类中
Move Field:当某个类成员变量被另一个类大量使用时,可以考虑将其移动到另一个类中
Extract Class:当一个类完成了多个不相关的功能时,可以考虑将其分解成几个类
Inline Class:当一个类没有完成什么实质性工作时,可以考虑将其合并到其他类中
Hide Delegate:当外部需要通过一个类获取另一个类的指针,然后再调用另一个类中某个方法时,委托关系就过于复杂,可以考虑在这个类中这节定义一个完成另一个类中此函数功能的函数。
Remove Middle Man:和上述情况完全相反,当为了隐藏代理而使得这个类过于庞杂时,就需要恢复原样
Introduce Foreign Method:当你需要为某个无法修改的类添加函数时,可以考虑在其使用类中添加
Introduce Local Extension:和上述情况类似,但是采用另外一个解决方案——增加一个子类,在子类中增加此函数

重新组织数据
Self Encapsulate Field:将变量的访问与设置封装,仅使用封装后的函数访问变量
Replace Data Value with Object:当为变量定义了很多的行为后,需要考虑将他们连同行为封装到一个对象中去
Change Value to Reference:当类的实例对象可以共享时,类似于享元模式,需要考虑将值对象改成引用对象。可以用一个hash表保存已创建的实例,仅在表中没有的实例才创建,同时添加到hash表中
Change Reference to Value:和上述相反,某些情况下使用引用对象会使得内存区域错综复杂,特别对于分布式系统和并发系统。此时对于小巧而不变的对象可以考虑将其改成值对象
Replace Array with Object:当有一个数组,其元素代表不同的东西时,可以考虑将其转变成一个对象
Duplicate Observed Data:当某些逻辑数据保存在界面类中时,而逻辑类中的函数又要访问它们,此时可以考虑将其赋值到逻辑类中,使用Observer模式保存其内容的同步
Change Unidirectional Association to Bidirectional:两个类之间只有一条单向关联,当你发现有需求要求反向操作时,就可以两条反向关联
Change bidirectional Association to Unidirectional:两个类之间有双向关联,但如今某个类不再需要另一个类的特性时,可以将这条关联删除
Replace Magic Number with Symbolic Constant:用符号常量取代魔法数。魔法数指那些有特殊意义的常量数值,如PI,e,等等
Encapsulate Field:对于类中的公有数据成员,将其改成私有的,然后提供相应的访问函数
Encapsulate Collection:对于返回结合(array,list,stack等)的函数,将其改写成返回常引用的函数和增加、删除结合成员的函数
Replace Record with Data Class:将记录封装成哑数据类
Replace Type Code with Class:将枚举型数据封装成数据类,类的实例只有有限个,每个代表一个枚举常量
Replace Type Code with Subclass:当某个不可变的枚举数据影响到类时,可以考虑用子类代替这个枚举数据
Replace Type Code with State/Strategy:当某个枚举数据影响到类,并且无法子类化时,可以使用状态模式或者策略模式对其封装
Replace Subclass with Fields:当子类之间的唯一差别仅在返回常量数据时,可以在父类中增加一个值域,然后将子类删除

简化条件表达式
Decompose Conditional:将某个复杂的条件语句分解,if条件、then部分和else部分各自单独封装成一个函数
Consolidate Conditional Expression:当一系列条件测试命中后执行的代码都相同时,将这些条件合并,然后封装到一个独立的函数中去
Consolidate Duplicate Conditional Fragments:当条件表达式的不同分支中存在相同代码时,可以将它们分离出来,搬移到条件表达式外部
Remove Control Flag:当代码中出现大量的用户控制流程的标记变量时,可以尝试使用continue、break或者return来取代这些标记
Replace Nested Conditional with Guard Clauses:当某个条件语句过于复杂时,可以用卫语句去实现。卫语句就是当某个条件满足时直接退出函数或者抛出异常
Replace Conditional with Polymorphism:对于类似switch语句的条件表达式,可以使用多态去实现
Introduce Null Object:对于需要大量判断对象是否为空的情形,可以引入空对象表示空应用,这样就免去了判断为空情形
Introduce Assertion:引入断言,可以帮助测试

简化函数调用
Rename Method:当函数命名不规范时,大胆的将其重新命名
Add Parameter:当某个函数需要从调用端获取更多信息时,可以增加一个参数
Remove Parameter:当函数的某个参数不再使用时,可以将其移除
Separate Query from Modifier:当某个函数即返回对象状态又修改对象状态时,可以考虑将它们分割成两个函数,一个负责查询,一个负责修改
Parameterize Method:若干个函数做类似的工作,仅因为使用了不同的值。可以建立单一函数,以参数表达不同的值
Replace Parameter with Explicit Methods:和上述相反,当某个函数内的行为完全取决于参数值而采取不同的反应,可以将他们拆离开来,建立多个独立函数
Preserve Whole Object:当你的函数有多个参数取自同一个对象时,将这些参数用对象取代作为参数传给函数
Replace Parameter with Methods:当外部将某个函数的结果作为参数传递给另一个函数时,可以将另一个函数的这个参数去除,然后再另一个函数内部调用某个函数
Introduce Parameter Object:某些参数总是很自然的同时出现时,可以用一个对象取代他们
Remove Setting Method:当类的某个数据成员仅在对象创建之初赋值时,去掉该值域的所有设值函数
Hide Method:对于类中没有被外界使用到的函数,将其修改为private
Replace Constructor with Factory Method:当你在创建对象的而同时想完成除创建外的其他工作时,用工厂函数取代构造函数
Encapsulate Downcast:当你需要Downcast时,将其封装到一个函数中统一管理,Downcast极有可能出错
Replace Error Code with Exception:当某个函数返回一个特定的错误码时,用异常代替它
Replace Exception with Test:当调用者可以预先检测出调用函数锁发生的异常时,先检查,然后再调用函数,不用再try/catch了

处理概括关系
Pull Up Field:当每个子类都拥有相同数据成员时,将这个成员移至父类中
Pull Up Method:当每个子类都拥有相同函数成员时,将这个成员移至父类中
Pull Up Constructor Body:当每个子类的构造函数中都包含很多相同代码时,可以将这些代码移到父类的构造函数中
Push Down Method:当父类中某些代码仅与某个子类相关时,可以将这个函数移到这个子类中
Push Down Field:当父类中的某个数据成员仅与某个子类相关时,可以将这个成员移至子类中
Extract Subclass:当类中的某些特性仅被某些实例使用时,可以考虑建立一个子类,将这些特性移至子类中
Extract Superclass:当多个类中有相似特性时,可以建立一个公共父类,将这些特性移至父类中去,然后这些类从此父类派生
Extract Interface:当若干客户使用class接口中的同一子集或者另个class的接口有相同部分时,将这些相同子集提炼到同一个接口中
Collapse Hierarchy:当子类和父类之间差别很小时,可以考虑将他们合并
Form Template Method:当若干子类的某个函数所作操作仅有少许不同,可以在父类中用Template Method抽象一个函数实现相同部分,不同部分用多态在子类中实现
Replace Inheritance with Delegation:当某个子类仅使用使用父类中很少的功能时,可以在子类中保存父类的一个指针,将所需的功能委托给父类完成,然后断开两个类之间的继承关系
Replace Delegation with Inheritance:当你为了一个类能使用另一个类的功能而编写了大量的委托函数时,可以考虑让这个类从另一个类派生,从而取消委托

大型重构
Tease Apart inheritance:当某个继承链同时承担两项责任时,可以采用桥接模式建立两个继承体系,并通过委托关系让其中一个可以调用另一个
Convert Procedural Design to Objects;对于已有的过程化代码,可以将数据记录转化为对象,将行为分开并移到对象之中
Separate Domain from Presentation:当UI类中包含了大量的逻辑代码时,建议将这些代码分离出来,封装到独立的类中
Extract Hierarchy:当你的某个类做了太多工作,并且一部分是以大量条件式完成时,可以建立一个继承体系,以一个子类表示一种特殊情况

《重构 改善既有代码的设计》读书笔记及心得体会 《重构 改善既有代码的设计》读书笔记及心得体会第一章 重构 第一个案例 重构的第一步,为即将修改的代码建立一组可靠的测试环境。 过程和方法对于项目的结果只有次要的影响,首要的影响是人 没有可靠的测试环境就不要进行代码的重构,那么问题来了: - 什么是可靠的测试环境? 在第四章给出回答 重构时,每次修改的幅度要小,这样便于进行测试发现错误。 这是本书中贯穿始终的 阅读详情

相关推荐

小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理

ww

weixin_46297571的博客 1480

C++多态----虚函数初级剖析

多态说白了就是多种形态,在C++中不少的函数都可以实现多种形态,例如函数重载,运算符重载等等,这种重载一般都是在编译阶段时就已经确定了形态,这种多态,我们一般称之为静态多态,那么既然静态多态是在编译阶段就已经确定好了形态,那么动态多态,自然也就是在运行时才确定形态

a19767939的博客 411

超声波测距的15度魔法:HC-SR04测量角度特性在机器人避障中的实战技巧

本文深入探讨了HC-SR04超声波测距模块在机器人避障中的15度测量角度特性及其应用技巧。通过分析15度角的工程意义、多模块阵列设计、狭小空间优化方案及温度补偿技术,帮助开发者提升机器人环境感知能力。文章特别强调了HC-SR04模块在低成本避障方案中的核心优势与实战优化策略。

weixin_29172963的博客 430

c++学习笔记五

4.6.5 继承同名成员处理方式 问题:当子类与父类出现同名成员,如何通过子类对象,访问到父类中同名函数? 》访问子类同名成员 直接访问即可 》访问父类同名成员 需要加作用域 》当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数 示例: #include <iostream> using namespace std; //继承中同名成员处理 class...

chxchxkkk的博客 295

2017–2024年中国10米/20米分辨率水稻种植分布数据集

摘要:本数据集提供2017-2024年中国23个省级行政区的水稻种植分布数据,包含单季稻和双季稻分类(GeoTIFF格式,WGS84坐标系)。5个省份分辨率为20米,其余为10米,基于Sentinel卫星数据和TWDTW方法生成。数据公开共享(7.99GB),使用需注明来源并引用相关文献(DOI:10.12199/nesdc.ecodb.rs.2025.012)。涉及学科包括遥感、生态学和地理学,研究成果需发送至国家生态科学数据中心备案。

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 1383

STM32家电安全开发实战:手把手教你用X-CUBE-CLASSB通过IEC60730 Class B认证

本文详细解析了如何使用STM32的X-CUBE-CLASSB软件包通过IEC60730 Class B认证,涵盖认证核心要求、软件包架构、工程集成配置及调试技巧。针对家电安全开发,提供了从单元测试到压力测试的全流程方案,帮助开发者快速实现符合国际安全标准的嵌入式控制系统。

pink的博客 705

多态

多态多态多态 52.类和对象-多态-多态的基本语法 53.类和对象-多态-多态的原理剖析 54.类和对象-多态-案例1-计算器类 55.类和对象-多态-纯虚函数和抽象类 56.类和对象-多态-案例2-制作饮品 57.类和对象-多态-虚析构和纯虚析构 58.类和对象-多态-案例3-电脑组装需求分析 59.类和对象-多态-案例3-电脑组装具体实现 52.类和对象-多态-多态的基本语法 53.类和对象-多态-多态的原理剖析 54.类和对象-多态-案例1-计算器类 55.类和对象-多态-纯虚函数和抽象类 56.

Major_S的博客 493

Shopee动态参数x-sap-Ri与x-sap-Sec逆向解析实战

现代电商前端反爬普遍采用动态参数校验机制,其核心是将设备指纹、DOM状态与时间上下文耦合生成不可复用的请求凭证。x-sap-Ri本质是渲染上下文唯一标识,依赖真实浏览器环境中的DOM树结构、Canvas像素指纹及毫秒级时间扰动;x-sap-Sec则是基于该标识与服务端同步密钥生成的HMAC-SHA256签名,具备强时效性与密钥轮换特性。这类机制显著提升了自动化采集门槛,广泛应用于Shopee商品详情页等高价值数据接口。本文聚焦于从Chrome DevTools调试出发,系统还原参数生成逻辑,覆盖DOM一致性

weixin_30603633的博客 896

重构:改善既有代码的设计(第二版)笔记总结

重构,第一个示例 为何,以及如何提炼一个函数 如何处理过长的函数 A First Set of Refactorings Split Phase Encapsulate Variable let defaultOwner = { firstName: "Martin", lastName: "Fowler" }; // after encapsulate variable let defaultOwnerData = { firstName: "Martin", lastName: "Fowler"

小菜的博客 800

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1457

模型检测--工具KeYmaera

论文:KeYmaera: A Hybrid Theorem Prover for Hybrid Systems 作者:Andre Platzer and JanKeYmaera摘要1 介绍2用于混合系统的KeYmaera验证工具3混合系统,混合自动机和混合程序 摘要 KeYmaera是一种用于混合系统的混合验证工具,它结合了演绎,实数代数和计算机代数证明者技术。它是自然的自动和交互式定理证明器 混合系统的规范和验证逻辑。 KeYmaera支持差分动态逻辑,它是用于混合程序的实值一阶动态逻辑,是混合自动机的程

ziigea的博客 1077

《重构 - 改善既有代码的设计》总结

1 重构,第一个示例 重构前,先检查自己是否有一套可靠的测试集。这些测试必须有自我验证能力。TDD 重构技术就是以微小的步伐修改程序。如果犯下错误,很容易便可发现它。 傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。 编程时,需要遵循营地法则:保证你离开时,代码库一定比来的时候更健康。 好代码验证的标准是人们是否能轻而易举的修改它。 2 重构的原则 2.1 ...

极客神殿 1321

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 300

[重构] 改善既有代码的设计

在做微服务拆分相关的课题,会涉及到模块化重构和代码重构相关的东西,重构的速度和质量很大程度上取决于代码原本质量的好坏,所以看了一下这本书,有些知识点我也不知道,所以摘抄了其中比较重要的部分规则。 文章目录重构——改善既有代码的设计序前言第1章 重构,第一个案例第2章 重构原则第3章 代码的坏味道第4章 构筑测试体系第5章 重构列表第6章 重新组织函数第7章 在对象之间搬移特性第8章 重新组织数据第...

Blanchedingding的博客 689

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

最近在读《重构,改善既有代码的设计》这本书,整理了些书中对于一些代码优化的笔记,暂时先更这些吧。 1,重复代码(Duplicated Code): 1,同一个类的两个函数含有相同的表达式 方法:1 提炼函数(Extract Method) 1,无局部变量 2,有局部变量 2, 1> 两个互为兄弟的子类内含有相同的表达...

努力让自己更优秀的博客 1087

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《重构 改善既有代码的设计》之重构列表

1 简介 春节期间,自己也没有阅读其他的书籍,一方面是因为家里没有空调,读书写字时很冷,另外一方面就是灯光不亮,看书时很累眼睛,最后就是在家里总是无聊,心很浮躁,静不下来学习,所以也没有看其他的书籍。 在阅读完《重构 改善既有代码的设计》自己陆续写了一些博客,当然,很多时候只是一种整理,也可以说是一种变相的温故而知新吧。 读完本书时,有一些重构手法给我留下了很深刻的印象,诸如在重新组织函数节的Ex...

不当初 1162

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《重构 改善既有代码的设计》中文高清完整版pdf下载

《重构 改善既有代码的设计》中文高清完整版pdf下载 【下载地址】重构改善既有代码的设计中文高清完整版pdf下载 《重构 改善既有代码的设计》是一本经典之作,深入浅出地讲解了如何通过重构优化既有代码。本书不仅揭示了重构的核心原理,还提供了70多个经过验证的重构案例,帮助读者掌握实用的代码变换技巧。通过逐步重构的方式,开发...

gitblog_06788的博客 1386

重构-改善既有代码的设计 读书心得(一)

目录《重构-改善既有代码的设计》第一章第二章第三章 代码的坏味道第六章 重新组织函数 《重构-改善既有代码的设计》 这本书有些“年纪”了,按理说it界的书都是读新不读旧。但它有点特别,其中的关于重构和面向对象的思想我觉得放到现在也是不过时的。好多时候我们考察一个程序员,都是看他懂多少东西,知道多少概念,做过什么项目,但其实一个程序员最关键的素质是要写出好的代码。好的代码不是一天炼成,往往都要经过大...

yes1983的专栏 1804

读《重构:改善既有代码的设计》的思考

重构不是一个一蹴而就的事,需要长期的实践和经验才能够完成得很好。我们重构强调的是 使代码变得更好,拥有代码洁癖。

简单猿 2662

重构_改善既有代码的设计_第二版(Java代码示例)

前言 最近在读《重构_改善既有代码的设计(第2版)》这本书,一本非常经典,并且非常容易读懂的书,强力推荐刚入职场或未入职场的同学去读,书中的代码示例是用JavaScript来编写的,该文只是将书中的代码示例翻译成Java版本,并不会复制书中过多的内容,其中一些做法并不完全相同,加了自己的风格或者是说一些浅显的理解,非常欢迎各位批评和指正。 第一个示例 示例需求: 设想有一个戏剧演出团,演员们经常要...

a5f4s6f4a65f4a6sf的博客 6025

《重构 改善既有代码的设计》之代码的坏味道

1 简介 知道“如何”不代表知道”何时”。决定何时重构、何时停止和知道重构机制如何运转一样重要。 从我们的经验来看,没有任何量度规矩比得上一个见识广博者的直觉。我们智慧告诉你一些迹象,它会指出“这里有一个可以用重构解决的问题”。你必须培养出自己的判断力,学会判断一个类内有多少实例变量算是太大,一个函数内有多少代码才算太长。 2 坏味道列表 2.1 重复代码Duplicated Code 如果你在...

不当初 1561

【免费下载】 重构改善既有代码的设计第2版 PDF 下载

重构改善既有代码的设计第2版 PDF 下载 【下载地址】重构改善既有代码的设计第2版PDF下载 - **文件名**: 重构改善既有代码的设计第2版.pdf- **文件类型**: PDF- **文件大小**: [文件大小]- **适用人群**: 软件开发人员、架构师、项目经理等 ...

gitblog_06697的博客 1580

图书推荐4:《重构:改善既有代码的设计》

如果你是一名软件开发人员,那么《重构:改善既有代码的设计》这本书绝对值得你学习和研究。首先,重构是一项非常重要的技能,它可以使得代码更加清晰、易读、可维护和高效。而在实践中,很多开发者往往只关注代码的功能性,而忽略了代码的质量和可维护性,从而导致后期的维护、升级和扩展变得异常困难。

madifu的博客 1037

《重构,改善既有代码设计》精读

人们只为了短期目的而修改代码时,往往没有完全理解整体的架构设计(在大项目中常有这种情况,比如在不同的地方,使用完全相同的语句做着同样的事情),代码就会失去自己的结构,代码结构的流失具有累积效应,越难看出代码所代表的设计意图,就越难保护其设计。并且自己编写的代码往往带有自己的风格和“坏习惯”,代码风格并不是一种错误,但在一个团队中,不同代码风格的混杂会带来阅读与合作的困难,而对于“坏习惯”而言,比如极其复杂的条件判断语句等,自己难以意识到该做法的不妥,需要群众的意见加以改正。

m0_60534883的博客 224

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

重构,绝对是写程序过程中最重要的事之一。在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了。更何况,我们很少有机会从头到尾完成一个项目,基本上都是接手别人的代码,即使这个项目是从头参与的,也有可能接手其他组员的代码。我们都有过这样的经验,看到别人的代码时感觉就像屎一样,有一种强烈的想重写的冲动,但一定要压制住这种冲动

AngelDevil的专栏 852
上一篇: 重构
下一篇: CppUnit使用指南
Matrix_Designer
博客等级 码龄16年 58粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值