读书笔记《代码大全》3
特定的重构
·Data-Level Refactorings 数据级的重构
1. 用具名常量代替神秘数值
2. 使变量的名字更为清晰且传递更多信息
3. 将表达式内联化
把一个中间变量换成给他赋值的那个表达式本身。
4. 用函数来代替表达式 (这样一来,表达式就不会在代码中重复出现了。)
5. 引入中间变量
6. 用多个单一用途变量代替某个多用途变量
7. 在局部用途中使用局部变量而不是参数
如果一个被用来做输入的子程序参数在其内部又被用作局部变量,那么请直接创建一个局部
变量来替代它。
8. 将基础数据类型转化为类。
9. 将一组类型码(type codes)转化为类或枚举类型。
10. 将一组类型码转换为一个基类及其相应的派生类。
例如对OutputType基类,就可以创建Screen,Printer和File这样的派生类。
11. 将数组转换为对象
如果你正在使用一个数组,其中不同的元素具有不同的类型,那么就应该用一个对象来替代
它。将数组中的各个元素转化为该类的各个成员。
12. 把群集(collection)封装起来
如果一个类返回一个群集,到处散布的多个群集实例将会带来同步问题。请让你的类型返回
一个只读群集,并且提供相应的为群集添加和删除元素的子程序。
13. 用数据类来代替传统记录
·Statements-Level Refactorings 语句级的重构
1. 分解布尔表达式
2. 将复杂布尔表达式转换成命名准确的布尔函数
3. 合并条件语句不同部分中的重复代码片段
如果有完全相同的代码同时出现在一个条件语句if语句块和else语句块中,那么就应该将这段
代码移到整个if-then-else语句块的后面。
4. 使用break或return而不是循环控制变量
如果在循环中用到了一个类似done这样的控制循环的变量,请用break或return来代替它。
5. 在嵌套的if-then-else语句中一旦知道答案就立即返回,而不是去赋一个返回值。
6. 用多态来代替条件语句(尤其是重复的case语句)
结构化程序里很多的case语句中的逻辑都可以被放到继承关系中,通过多态函数调用实现。
7. 创建和使用null对象而不是去检测空值。
· Routine-Level Refactorings 子程序级重构
1. 提取子程序或者方法
2. 将子程序的代码内联化
如果子程序的程序题很简单,而含义不言自明,那么就在使用的时候直接使用这些代码。
3. 将冗长的子程序转换为类
4. 用简单的算法替代复杂的算法
5. 增加参数
如果子程序需要从调用方获得更多的信息,可以增加它的参数从而为其提供信息。
6. 删除参数
如果子程序已经不再使用某个参数,就删掉它。
7. 将查询操作从修改操作独立出来。
一旦有类似GetTotals()的操作改变了对象的状态,那就应该将查询功能从状态改变功能中独
立出来。提供两个独立的子程序。
8. 合并类似的子程序,通过参数区分它们的功能
9. 将行为取决于参数的子程序拆分开来
10. 传递整个对象而非特定成员
如果发现同一个对象的多个值被传递给了一个子程序,考虑是否可以修改器接口使之接收整
个对象。
11. 传递特定成员而非整个对象。
如果发现创建对象的唯一理由只是你需要将它传入某个子程序,那么就考虑一下是否可以修
改这个子程序,使之接收特定数据成员而非整个对象。
12. 包装向下转型的操作
·Class Implementation Refactorings 类实现的重构
1. 将值对象转化为引用对象
2. 将引用对象转化为值对象
3. 用数据初始化代替虚函数
4. 改变成员函数或成员数据的位置
请考虑对类的继承体系做出修改。这些修改可以减少派生类的重复工作:
a. 将子程序上移到基类中。
b. 将成员上移到基类中。
c. 将构造函数中的部分代码上移到基类中。
下面这些改变则可以用来对派生类进行特殊化:
a. 将子程序下移到派生类中。
b. 将成员下移到派生类中。
c. 将构造函数下移到派生类中。
5. 将特殊代码提取为派生类
6. 将类似的代码结合起来放置到基类中
·Class Interface Refactorings 类接口的重构
1. 将成员函数放到另一个类中
在目标类中创建一个新的成员函数,然后将原类中将函数体移到目标类中。然后在旧的成员
函数中调用新的成员函数。
2. 将一个类变成两个
3. 删除类
4. 去除委托关系
有时类A调用了类B和类C,而实际上类A只应该调用类B,而B应该调用C。这种情况下就应该
考虑A对B的接口抽象是否合适。如果应该由B调用C,那么就应该只有B调用C。
5. 去掉中间人
有时存在类A调用类B,类B调用类C的情况,有时让类A直接调用类C会更好。是否应该去掉
类B,取决于怎么做才能够最好地维护类B接口的完整性。
6. 用委托代替继承
7. 用继承代替委托
8. 引入外部的成员函数
9. 引入扩展类
10. 对暴露在外的成员变量进行封装
11. 对于不能修改的类成员,删除相关的Set()成员函数。
12. 隐藏那些不会在类之外被用到的成员函数。
13. 封装不使用的成员函数
14. 合并那些实现非常相似的基类和派生类。
·System-Level Refactorings 系统级重构
1. 为无法控制的数据创建明确的索引源。
2. 将单向的类联系改为双向的类联系。
3. 将双向的类联系改为单项的类联系。
4. 用Factory Method模式而不是简单地构造函数。
5. 用异常取代错误处理代码。
posted on 2023-06-11 14:47 20214073-付沛森 阅读(8) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理