代码中常见的坏味道及重构手法

在软件开发中,存在许多常见的代码坏味道(code smells),它们指示出潜在的设计或实现问题。下面是一些常见的代码坏味道以及相应的重构手法:

  1. Duplicated Code(重复代码):
  • 坏味道:代码中存在相同或非常相似的代码片段。
  • 重构手法:将重复的代码抽取为方法或函数,通过调用来避免重复。
  1. Long Method(过长的方法):
  • 坏味道:方法过长,包含过多行数或复杂逻辑。
  • 重构手法:将长方法分解为多个小方法,每个方法负责一个明确的任务,提高代码的可读性和可维护性。
  1. Large Class(过大的类):
  • 坏味道:类过于庞大,承担了过多的责任。
  • 重构手法:将类的功能分解为多个小类或模块,每个类只负责一个明确的职责,提高类的可理解性和可维护性。
  1. Long Parameter List(过长的参数列表):
  • 坏味道:方法的参数列表过长,增加了方法的复杂性和调用的困难度。
  • 重构手法:将相关的参数封装为对象或数据结构,或者使用重构模式(如Builder模式)来简化参数传递。
  1. Primitive Obsession(基本类型偏执):
  • 坏味道:过度使用基本数据类型,而不是创建专门的类来表示概念。
  • 重构手法:创建适当的类来表示相关的概念,提高代码的可读性和可维护性,同时提供更丰富的行为和封装。
  1. Switch Statements(过多的switch语句):
  • 坏味道:代码中存在大量的switch或if-else语句,难以扩展和维护。
  • 重构手法:使用多态、策略模式或工厂模式等技术,将条件逻辑转移到不同的类中,提高代码的灵活性和可扩展性。
  1. Lazy Class(无用的类):
  • 坏味道:存在没有实际功能或用途的类。
  • 重构手法:移除无用的类,或者将其与其他类合并,以减少代码库中的冗余。
  1. Data Clumps(数据泥团):
  • 坏味道:代码中多个地方出现相同的参数组合,表示它们可能应该被封装为一个单独的对象。
  • 重构手法:创建一个新的类来封装这些相关参数,提高代码的可读性和可维护性。
  1. Feature Envy(依恋情结):
  • 坏味道:一个类对另一个类的方法有过多的调用,可能表示这些方法应该属于该类。
  • 重构手法:将被依恋的方法移动到调用它的类中,改善代码的一致性和聚合性。
  1. Shotgun Surgery(散弹式修改):
  • 坏味道:对一个功能的修改需要在多个不同的类或模块中进行大量的修改。
  • 重构手法:将相关的功能集中到一个类或模块中,以减少修改的范围。
  1. Message Chains(消息链):
  • 坏味道:代码中存在长串的方法调用,形成冗长的消息链。
  • 重构手法:使用中间对象或方法来封装消息链,简化代码的调用和维护。
  1. Middle Man(中间人):
  • 坏味道:一个类仅仅委托给另一个类的方法,过度增加了类之间的耦合性。
  • 重构手法:消除中间人类,直接调用被委托的类的方法,简化代码结构。
  1. Speculative Generality(过度泛化):
  • 坏味道:添加复杂的抽象、接口或类层次结构,但实际上并没有真正的需求。
  • 重构手法:去除不必要的抽象,简化代码结构,只有在确实需要时才进行泛化设计。
  1. Parallel Inheritance Hierarchies(平行继承体系):
  • 坏味道:存在两个类继承体系,彼此之间存在强耦合,导致扩展和维护困难。
  • 重构手法:使用组合关系替代继承,将共享的行为封装到单独的类中,减少继承的依赖。
  1. Comments(过多的注释):
  • 坏味道:代码中存在大量冗长、无效或重复的注释。
  • 重构手法:重构代码,使其自我解释,并删除不必要的注释,使代码更加清晰和易懂。
  1. Refused Bequest(拒绝的遗赠):
  • 坏味道:子类只使用了父类的部分方法,而其他方法则被拒绝使用。
  • 重构手法:重新设计继承关系,使子类只包含需要的方法,或者将拒绝使用的方法移动到其他类中。
  1. Lazy Initialization(延迟初始化):
  • 坏味道:对象在第一次使用之前不会被初始化,导致额外的延迟和性能开销。
  • 重构手法:在对象被使用之前进行初始化,避免不必要的延迟和潜在的错误。
  1. God Class(上帝类):
  • 坏味道:一个类负责过多的功能,成为系统中的中心点,导致类变得庞大且难以维护。
  • 重构手法:将类的功能分解为更小的、职责单一的类,提高代码的可读性和可维护性。
  1. Inappropriate Intimacy(过度亲密):
  • 坏味道:两个类之间的交互过于密切,相互依赖过多。
  • 重构手法:通过引入中间层或使用事件驱动的方式,减少类之间的直接依赖关系。
  1. Incomplete Library Class(不完整的库类):
  • 坏味道:使用的第三方库或框架中的类缺少所需的功能。
  • 重构手法:通过继承、组合或适配器模式,扩展库类以满足具体需求。
  1. Excessive Coupling(过度耦合):
  • 坏味道:类之间的依赖关系过多,修改一个类可能导致级联的修改。
  • 重构手法:使用设计模式如依赖注入(Dependency Injection)或解耦合模式,减少类之间的紧耦合关系。
  1. Data Class(数据类):
  • 坏味道:一个类仅仅用于封装数据,缺乏行为和功能。
  • 重构手法:将数据类转换为具有行为和功能的类,遵循面向对象的设计原则。
  1. Feature Creep(功能蔓延):
  • 坏味道:系统的功能不断增加,导致代码变得复杂且难以维护。
  • 重构手法:使用分解和重组的方法,拆分系统为更小的、高内聚的模块,简化系统的复杂性。
  1. Magic Numbers(魔法数):
  • 坏味道:代码中存在未经解释的具体数值,降低代码的可读性和可维护性。
  • 重构手法:将魔法数值提取为常量或枚举,增加代码的可读性和可维护性。

重构是一个持续的过程,旨在改善代码的质量和可维护性。通过识别和纠正代码中的坏味道,可以使代码更加健壮、可读和易于扩展。

相关推荐
找方案2 小时前
AI+人力资源:AI招聘面试的兴起与争议
人工智能·面试·职场和发展
CC数分8 小时前
2026年HRBP岗位硬性要求和加分项
面试·职场和发展·数据分析
2601_962680229 小时前
数据分析面试常考的SQL题和业务题分别是哪几类?
sql·面试·数据分析
黄敬峰9 小时前
一文搞懂 Agentic RAG:用 LangGraph 打造会思考的智能检索架构
面试
晚安日记wanna10 小时前
SSR 为什么不适合登录态从水合冲突到缓存串号
前端·react.js·面试
晚安日记wanna10 小时前
压测 TPS 卡在 800CPU 只跑四成六步定位法
运维·面试·测试
晚安日记wanna10 小时前
批量请求失败只弹一个 Toast面试官想听五层
前端·面试·架构
晚安日记wanna10 小时前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript
晚安日记wanna10 小时前
大表 DDL 面试翻车现场Online DDL 为什么还会锁死业务
数据库·面试·架构
晚安日记wanna10 小时前
MySQL 主从延迟别只答并行复制
数据库·面试·架构