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

在软件开发中,存在许多常见的代码坏味道(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(魔法数):
  • 坏味道:代码中存在未经解释的具体数值,降低代码的可读性和可维护性。
  • 重构手法:将魔法数值提取为常量或枚举,增加代码的可读性和可维护性。

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

相关推荐
FairyDiana几秒前
【JavaScript】✨0、1与"true"的恋爱物语:JS类型转换大揭秘
javascript·面试
JaysonJin几秒前
教你如何用 localStorage+Vue 状态管理玩转数据持久化!
前端·面试
ice854 分钟前
LLM流式输出实现
前端·人工智能·面试
知其然亦知其所以然20 分钟前
对象访问两种方式PK:句柄 VS 指针,谁才是JVM最爱?
java·后端·面试
Dream耀33 分钟前
从零实现JavaScript防抖与节流:渐进式优化之旅
前端·javascript·面试
前端布鲁伊35 分钟前
【前端面试场景题】JavaScript数字溢出了?BigInt来救场!前端处理超大数值的完整攻略
前端·面试
前端小巷子2 小时前
Web缓存:原理、策略与优化
前端·面试
zhuiQiuMX13 小时前
字节面试手撕中等题但还没做出来
面试
趣多多代言人16 小时前
从零开始手写嵌入式实时操作系统
开发语言·arm开发·单片机·嵌入式硬件·面试·职场和发展·嵌入式
YungFan16 小时前
iOS26适配指南之UINavigationController
ios·swift