重构-代码坏味道

本文深入探讨软件开发中常见的代码坏味道,包括重复代码、过长参数列、数据泥团等问题,并提供了一系列的消除策略,如提炼函数、引入参数对象、封装字段等,旨在帮助开发者提升代码质量和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语句级

主要是代码段、参数等方面的小维度的坏味道

重复代码 Duplicated Code

定义
  • 同一个类、兄弟类、不相干类中出现相同表达式或函数
消除
  • 提炼函数
  • 函数上移(到超类或新类)
  • 替换算法

过长参数列 Long Parameter List

定义
  • 参数列表太长
  • 全局数据是邪恶的
消除
  • 以函数取代参数(被调函数内直接获取)
  • 保持对象完整
  • 引入参数对象

数据泥团 Data Clumps

定义
  • 多项数据捆绑出现
消除
  • 提炼类(老类提新类)
  • 引入参数对象
  • 保持对象完整

过多的注释 Comments

定义
  • 注释闻起来香
  • 但是往往意味着代码臭
消除
  • 提炼函数
  • 函数改名(自解释)
  • 引入断言(针对要说明的默认条件)

基本类型偏执 Primitive Obsession

定义
  • 对象的价值在于模糊了基本数据与大类之间的界限
  • 新手不愿意构造小对象
消除
  • 提取类
  • 引入参数对象
  • 以对象取代数据(提取成员变量及对应接口为类)
  • 以对象取代数组(同类型不同含义构成的数组)
  • 以类取代类型码(不影响行为的纯类型码)
  • 以子类取代类型码(可继承,影响行为,不变的类型码)
  • 以state/strategy取代类型码(影响行为,不可继承或变化的类型码)

函数级

主要是函数级、类级等方面的大维度的坏味道

过长函数 Long Method

定义
  • 小函数支持了间接层的解释能力、共享能力、选择能力
  • 小函数的好名字能使其相比大函数更容易理解
  • 需注释说明的地方、条件表达式、循环,是常要提炼为独立函数的代码
消除
  • 提炼函数
  • 以查询替代取代临时变量
  • 引入参数对象(缩短参数列表)
  • 保持对象完整(缩短参数列表)
  • 以函数对象取代函数(局部变量改为类成员变量)
  • 分解条件表达式(条件分支处理提取为函数)

过大的类 Long Class

定义
  • 单个类做的事情太多
消除
  • 提炼类
  • 提炼子类
  • 提炼接口

冗赘类 Lazy Class

定义
  • -让没价值的类慷慨就义
消除
  • 折叠继承体系(父子类合并)

夸夸其谈未来性 Speculative Generality

定义
  • 现在用不上的就删吧,留着干哈
消除
  • 折叠继承体系(无用的抽象类)
  • 将类内联化(不必要的委托)
  • 移除参数(无用的参数)
  • 函数改名(多余的抽象函数名)

令人迷惑的暂时字段 Temporary Field

定义
  • 某个变量仅为类或函数内的某个特定情况而设
消除
  • 提炼类(变量相关代码提取为新类)
  • 引入Null对象(避免四处判空)

发散式变化 Divergent Change

定义
  • 一个类受多种变化影响
  • 一个类理应只收到一种变化影响而修改
消除
  • 提炼类(提取变化处理到不同类)

霰弹式修改 Shotgun Surgery

定义
  • 一种变化需到不同类或函数中都修改
消除
  • 搬移函数(统一到类集中修改)
  • 搬移字段(统一到接口集中修改)

switch惊悚现身 Switch Statements

定义
  • switch容易出现重复,多出swtich就得改多处
  • 这里先要消除的类型码成员变量,其次是条件表达式
消除
  • 以子类取代类型码
    • 子类返回各自的类型码
  • 以State/Strategy取代类型码
    • 无法继承或类型码会变化时
    • 构建Type类及newType工厂方法提供给设置类型接口
  • 以多态取代条件表达式(基于上述两方法)

对象级

主要是类及对象间关系方面的坏味道

依恋情结 Feature Envy

定义
  • 一个函数调用了一个类或多个类较多的取值函数
  • 数据和对数据的操作包装在一起,应该只在一处变化
消除
  • 提取函数
  • 搬移函数

平行继承体系 Parallel Inheritance Hierachies

定义
  • 霰弹式修改的特殊情况
  • 为某个类增加一个子类时必须为另一个类增加相应子类
消除
  • 搬移函数(让当前类实例应用另一个继承体系的类实例)
  • 搬移字段

过度耦合的消息链 Message Chains

定义
  • 一个对象获取下一个对象,再获取下一个对象,依次下去得到最终对象
消除
  • 隐藏委托关系
  • 提取函数
  • 搬移函数

中间人 Middle Man

定义
  • 过度委托,如一半接口都委托出去
消除
  • 移除中间人(与隐藏委托关系 是反作用)
  • 内联函数(仅少量委托出去的
  • 接口)
  • 以继承替换委托(有非委托接口时)

狎昵关系 Inappropriate Intimacy

定义
  • 两个类互相依赖,互相访问private成员
消除
  • 搬移函数(减少依赖)
  • 搬移字段
  • 将双向关联改为单向关联(避免双向依赖)
  • 提取类(提取公共部分)
  • 隐藏委托关系(通过中间人委托)
  • 以委托取代继承(子类继承太多)

异曲同工的类 Alternative Classes with Different Interfaces

定义
  • 两个函数做同样的事情,命名却不同
消除
  • 重命名函数
  • 搬移函数
  • 提取子类

不完美的库类 Incomplete Library Class

定义
  • 库类不能满足新增功能
消除
  • 引入外加函数
  • 引入本地扩展(买进来再加工)
    • 对象创建自己控制,则继承库类
    • 否则,扩展类用委托方式

纯稚的数据类 Data Class

定义
  • 只有数据和读写数据接口的类(我国有矿,等你来挖)
消除
  • 封装字段(收归国有,打击非法渠道)
  • 封装集合
  • 移除设值函数
  • 搬移函数(自主研发挖矿)
  • 提取函数(自己不行就引入外资)
  • 隐藏函数 (彻底国营)

被拒绝的遗赠 Refused Bequest

定义
  • 有些接口或数据不想继承
消除
  • 函数下移(你不想要的给你兄弟)
  • 字段下移
  • 以委托取代继承(断绝父子关系,我们只谈生意)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值