重构,改善既有代码的设计 -- 阅读笔记

代码的坏味道

神秘命名

直观明了,能够清晰地表明自己的功能和用法

  • 改变函数声明
  • 变量改名
  • 字段改名
重复代码

两个函数含有相同的表达式:

  • 提炼函数

  • 移动语句重组代码顺序,再提炼

一个超类的不同子类中:

  • 函数上移、避免互相调用
过长函数

什么时候分解函数?

  • 一段代码需要以注释来说明
  • 函数做什么、如何做 (函数名解释用途)

如何分解?

  • 大段代码:提炼函数
  • 太多的临时变量:以查询取代临时变量
  • 参数列表过长: 引入参数对象、保持对象完整 、以命令取代函数
  • 条件表达式: 分解条件表达式
  • 庞大的switch: 每个分支提炼函数、多态取代条件表达式
  • 循环:提炼函数、(难以命名)再拆分循环
过长参数列表
  • 以查询取代参数
  • 保持对象完整
  • 引入参数对象
  • 移除标记参数
  • 函数组合成类
全局数据
  • 封装变量
可变数据
  • 封装变量 – 数据更新操作在几个函数内执行

  • 拆分变量 – 拆分为不用用途的变量

  • 查询函数、修改函数分离 – 不调用有副作用的代码

  • 移除设值函数 – 缩小变量作用域

  • 以查询取代派生变量 – 在其他地方计算可变数据

  • 函数组合成类、函数组合变换 – 限制需要对变量进行修改的代码量

  • 引用对象改为值对象 – 一个变量内部包含数据,直接替换整个数据结构

发散式变化
  • 拆分阶段 – 发生变化的两个方向有先后次序
  • 搬移函数 – 将处理逻辑分开
  • 提炼函数、提炼类
霰弹式修改
  • 搬移函数、搬移字段 – 需要修改的代码放入同一个模块
  • 函数组合成类 – 多函数操作相似的数据
  • 函数组合成变换 – 函数的功能是转化or充实数据结构
  • 拆分阶段 – 一些函数输出可以组合供给一段使用这些计算结果的逻辑
  • 内联函数、内联类 – 将分散的逻辑聚合
依恋情结
  • 搬移函数 – 函数和数据交互过多
  • 提炼函数、搬移函数 – 函数中的一部分代码依恋过多
数据泥潭
  • 提炼类 – 将数据项整合
  • 引入参数对象保持对象完整 – 为提炼的类瘦身
基本类型偏执
  • 以对象取代基本类型 – 将单独存在的数据值替换为对象
  • 以子类取代类型码、以多态取代条件表达式 – 替换的数据值是控制条件行为的类型码
重复的switch
  • 以多态取代条件表达式
循环语句
  • 以管道取代循环(filter,map)
冗赘的元素
  • 内联函数、内联类
  • 折叠继承体系 – 类元素处于一个继承体系中
夸夸其谈通用性
  • 折叠继承体系 – 某个抽象类没有作用
  • 内联函数、内联类 – 不必要的委托
  • 改变函数声明 – 函数的某些参数未用or一些不必要的参数
  • 移除死代码
临时字段
  • 提炼类、搬移函数
  • 引入特例 – 变量不合法的情况下创建一个代替对象
过长的消息链
  • 隐藏委托关系
  • 提炼函数、搬移函数
中间人
  • 移除中间人 – 过度运用委托封装
  • 内联函数 – 将函数放入调用端
内幕交易
  • 搬移函数、搬移字段 – 减少私下交流

  • 隐藏委托关系 – 将模块变成两者中介

  • 以委托取代子类、以委托取代超类 – 离开继承关系

过大的类
  • 提炼类 – 将几个关联的变量提炼到一个新的类中
  • 提炼超类、以子类取代类型码 – 简单
异曲同工的类

未来可以替换

纯数据类
  • 封装记录 – 一些public字段
  • 移除设置函数 – 一些不被其他类修改的字段
  • 搬移函数、提炼函数 – 将一些调用行为搬移到数据类中
被拒绝的遗赠
  • 函数下移、字段下移 – 超类只持有子类共享的东西
  • 以委托取代子类、以委托取代超类 – 舍弃继承体系
注释

需要撰写注释时,请先尝试重构,试着让所有的注释都变得多余。

  • 提炼函数、改变函数声明、引入断言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值