代码重构常用的技巧

article/2025/8/14 19:10:55

一、前言

重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。

根据重构的规模可以大致分为大型重构和小型重构:

大型重构: 对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等等。这类重构的工具就是我们学习过的那些设计思想、原则和模式。这类重构涉及的代码改动会比较多,影响面会比较大,所以难度也较大,耗时会比较长,引入bug的风险也会相对比较大。

小型重构: 对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名和注释、消除超大类或函数、提取重复代码等等。小型重构更多的是使用统一的编码规范。这类重构要修改的地方比较集中,比较简单,可操作性较强,耗时会比较短,引入bug的风险相对来说也会比较小。什么时候重构 新功能开发、修bug或者代码review中出现“代码坏味道”,我们就应该及时进行重构。持续在日常开发中进行小重构,能够降低重构和测试的成本。

二、代码的坏味道

2.1、代码重复

实现逻辑相同、执行流程相同

2.2、方法过长

方法中的语句不在同一个抽象层级逻辑难以理解,需要大量的注释面向过程编程而非面向对象

2.3、过大的类

类做了太多的事情包含过多的实例变量和方法类的命名不足以描述所做的事情

2.4、逻辑分散

发散式变化:某个类经常因为不同的原因在不同的方向上发生变化散弹式修改:发生某种变化时,需要在多个类中做修改

2.5、严重的情结依恋

某个类的方法过多的使用其他类的成员

2.6、数据泥团/基本类型偏执

两个类、方法签名中包含相同的字段或参数应该使用类但使用基本类型,比如表示数值与币种的Money类、起始值与结束值的Range类

2.7、不合理的继承体系

继承打破了封装性,子类依赖其父类中特定功能的实现细节子类必须跟着其父类的更新而演变,除非父类是专门为了扩展而设计,并且有很好的文档说明

2.8、过多的条件判断

2.9、过长的参数列

2.10、临时变量过多

2.11、令人迷惑的暂时字段

某个实例变量仅为某种特定情况而设置将实例变量与相应的方法提取到新的类中

2.12、纯数据类

仅包含字段和访问(读写)这些字段的方法此类被称为数据容器,应保持最小可变性

2.13、不恰当的命名

命名无法准确描述做的事情命名不符合约定俗称的惯例

2.14、过多的注释

坏代码的问题

难以复用:系统关联性过多,导致很难分离可重用部分难于变化一处变化导致其他很多部分的修改,不利于系统稳定难于理解命名杂乱,结构混乱,难于阅读和理解难以测试分支、依赖较多,难以覆盖全面

三、什么是好代码

代码质量的评价有很强的主观性,描述代码质量的词汇也有很多,比如可读性、可维护性、灵活、优雅、简洁。这些词汇是从不同的维度去评价代码质量的。其中,可维护性、可读性、可扩展性 又是提到最多的、最重要的三个评价标准。

要写出高质量代码,我们就需要掌握一些更加细化、更加能落地的编程方法论,这就包含面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。

SOLID原则

在这里插入图片描述
3.1、单一职责原则:

一个类只负责完成一个职责或者功能,不要存在多于一种导致类变更的原因。

单一职责原则通过避免设计大而全的类,避免将不相关的功能耦合在一起,来提高类的内聚性。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性,以此来实现代码的高内聚、松耦合。但是,如果拆分得过细,实际上会适得其反,反倒会降低内聚性,也会影响代码的可维护性。

3.2、开放-关闭原则:

添加一个新的功能,应该是通过在已有代码基础上扩展代码(新增模块、类、方法、属性等),而非修改已有代码(修改模块、类、方法、属性等)的方式来完成。

开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。

很多设计原则、设计思想、设计模式,都是以提高代码的扩展性为最终目的的。特别是 23 种经典设计模式,大部分都是为了解决代码的扩展性问题而总结出来的,都是以开闭原则为指导原则的。最常用来提高代码扩展性的方法有:多态、依赖注入、基于接口而非实现编程,以及大部分的设计模式(比如,装饰、策略、模板、职责链、状态)。

3.3、里氏替换原则:

子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。

子类可以扩展父类的功能,但不能改变父类原有的功能

父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。

3.4、接口隔离原则:

调用方不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则提供了一种判断接口的职责是否单一的标准:通过调用者如何使用接口来间接地判定。如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。

3.5、依赖反转原则:

高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

3.6、迪米特法则:

一个对象应该对其他对象保持最少的了解

3.7、合成复用原则:

尽量使用合成/聚合的方式,而不是使用继承。

单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,告诉我们要对扩展开放,对修改关闭。

四、设计模式

设计模式:软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。

创建型:主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码结构型:主要通过类或对象的不同组合,解耦不同功能的耦合行为型:主要解决的是类或对象之间的交互行为的耦合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、命名小技巧

5.1、命名规范

一个好的命名应该要满足以下两个约束:

准确描述所做得事情格式符合通用的惯例

如果你觉得一个类或方法难以命名的时候,可能是其承载的功能太多了,需要进一步拆分。

约定俗称的惯例:

在这里插入图片描述

类命名

类名使用大驼峰命名形式,类命通常使用名词或名词短语。接口名除了用名词和名词短语以外,还可以使用形容词或形容词短语,如 Cloneable,Callable 等,表示实现该接口的类有某种功能或能力。

在这里插入图片描述
方法命名

方法命名采用小驼峰的形式,首字小写,往后的每个单词首字母都要大写。和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/sjHfoyeW.shtml

相关文章

代码重构,最佳实践,你真的会代码重构吗?

WHAT:什么是重构? Martin Fowler:重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。 大型重构 对象:对系统、模块、代码结构、类与类之间的关…

代码重构有什么意义?为什么重构有用?

点击上方“武培轩”,选择“设为星标” 技术文章第一时间送达! 所谓重构就是在不改变代码外在行为的前提下,对代码进行修改,以改进程序的内部结构。本质上说,重构就是在代码写好之后改进它的设计。 前几个月完成了一个模…

代码重构之路 --我的2022年总结

2022年是我正式参加工作的第10个年头,也是我在CSDN上写博客的第11个年头。在这10余年的时间里,虽然在工作上遇到了各种情况,但我一直坚持输出、坚持分享,一共在CSDN上发表了530多篇原创博文。在这些文章中,大部分都是与…

java代码重构的思路Java代码重构的几种模式

Java代码重构的几种模式 Java代码的重构模式主要有三种:重命名方法重构模式、引入解释性变量重构模式、以查询取代临时变量重构模式重命名方法重构模式建议执行如下的步骤来完成:1.建立一个具有新名称的方法2.将旧方法的方法体复制进新方法3.讲旧方法的方…

java 代码重构

几天前的一次上线,脑残手抖不小心写了bug,虽然组里的老大没有说什么,但心里面很是难过。同事说我之所以写虫子是因为我讨厌if/else,这个习惯不好。的确,if/else可以帮助我们很方便的写出流程控制代码,简洁明…

代码重构终极指南!!

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇 作者丨Alex Omeyer译者丨弯月出品丨CSDN(ID:CSDNnews)原文链接: https://medium.com/swlh/the-ultimate-engineers-gu…

如何进行代码重构?

作为一个程序员,大部分时候,如果不是一个人承包整个项目,那么有1/3的时间在写代码,1/3的时间在看别人写的代码,剩下的1/3的时间在摸鱼。 那么如何提高摸鱼的时间?看别人写代码十分头疼,分分钟想…

代码重构学习

一、代码重构是什么 用重构手法去重构代码 二、为什么需要代码重构 1.方便维护。为了在修改代码时,添加的地方有个切入点,减少bug。 2.有利于理解设计思想和代码。 三、代码重构怎么做(养成习惯) 思想: 1.修改一…

代码重构技巧:如何将烂代码变成好代码?

这是本文的目录 前言重构入门1. 格式化代码2. 注释3. 废弃的代码4. 变量命名5. 常量命名6. 负值条件的重构7. {} 作为单独的一行8. 变量定义和使用距离太远 重构进阶1. 重复代码2. 函数参数3. 变量多余4. 缺少变量5. 复杂条件 老旧代码的重构利用工具总 结零基础Python学习资源…

代码重构新手教程:如何将烂代码变成好代码?

作者 | 王莉敏 策划 | 蔡芳芳 作为有几年工作经验的程序员,都会对 bad code 不满意。如何将烂代码变成好代码,本文将由浅入深、一步步带你理解重构的奥秘,让你对重构有个基本的了解。本文基于文章《The Simple Ways to…

常见代码重构技巧(非常实用)

你已选中了添加链接的内容点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2020 超神之路,…

hue执行workflow工作流出现直接FAILED

场景: 执行以下任务流的时候就出现了直接失败的情况 在第一次执行并且数据完善的情况下测试的,状态是成功的 但是第二次是在第一次基础上测试的,基础数据有所缺失 日志为: Failing Oozie Launcher, Main class [org.apache.oo…

Git Workflow工作流示意图

来自:http://blog.osteele.com/posts/2008/05/my-git-workflow UPDATE: git pretty 来自: http://justinhileman.info/article/git-pretty/full/ from: http://iccm.cc/git-workflow/

使用Python开源库Couler编写和提交Argo Workflow工作流

Python 是用户在 Kubernetes 上编写机器学习工作流的流行编程语言。 开箱即用时,Argo 并没有为 Python 提供一流的支持。相反,我们提供Java、Golang 和 Python API 客户端[1]。 但这对大多数用户来说还不够。许多用户需要一个抽象层来添加组件和特定于…

SharePoint 2013 Nintex Workflow 工作流帮助(八)

博客地址 http://blog.csdn.net/foxdave 工作流动作 15. Complete Workflow Task(User interaction分组) 此工作流动作将完成任何进行中的任务,它将处理足够的单独任务来达到选择的结果,接下来工作流引擎会依据工作流的设置处理…

工作流(Workflow) -- 实现简单工作流程

工作流(activiti) 工作流简介 业务过程的部分或整体在计算机应用环境下的自动化 工作流就是多个参与者,按照某种预定义的规则,传递业务信息,进行审核的功能一个框架(activiti) 核心 23张表 ACT_RE_*:RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (…

wf工作流java_WF Workflow 状态机工作流 开发

概述 工作流是对业务流程的建模,当我们设计工作流的时候,我们首先要分析业务处理过程中要经历的步骤。然后,我们就可以利用WF创建工作流模型来模拟业务的处理过程。 我们知道,WF包含两种类型的工作流:顺序工作流和状态…

Mendix 9.6 - Workflow(工作流)基础设计

一 概述 Workflow(工作流)是Mendix 9版本中新增的一种可视化语言功能模块,我们可以用它来构建可扩展的流程。此外它还与其他可视化语言完全集成,例如微流编辑器和页面编辑器。 在公司我们往往需要填写许多表单,包括行政、人事、IT等方面的&a…

workflow工作流(三):画流程图工具对比

一、总结 我所用过能画工作流的工具有2个:1.eclipse插件,2.flowable官方网页版,结论是eclipse插件好用,后者要上传下载,还容易丢数据 注意事项:eclipse插件画出来的bpmn文件的schama是activiti&#xff0…

Bladex Workflow工作流引擎开发进阶-版本v1.2.2

Bladex Workflow工作流引擎开发进阶 1 Bladex Workflow简介2 Flowable简介3 workflow部署和配置-参考文档《BladeX插件 - Blade-flow使用帮助文档 》4 配置任务监听4.1 问题:监听类注入不了service 5 配置事件监听6 复杂表单-配置外部表单(不建议配置超大…