[观点]是重构,还是代码修整?

2023-11-21 22:38
文章标签 代码 重构 观点 修整

本文主要是介绍[观点]是重构,还是代码修整?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读:本文是从《Code Refurbishment》这篇文章翻译而来,译文来自外刊IT评论《代码修整》。

文章内容如下:

我们这个行业里有大量的专业术语被使用。不幸的是,我们并没有对每个术语表达的究竟是什么意思达成共识。我经常听到人们误用“重构(Refactoring)”这个词,导致这种编程方法在很多企业里变成可怕的事情而被拒绝采用。怕什么?据我的观察,大部分都是因为错误的使用了这个术语。

我认为,因为没有对专业术语的使用严加管理,致使整个行业的发展受到连累。如果一个化学家对另一个化学家说“我们准备做滴定(titration)试验”,所有人都清楚的知道是要干什么。我相信计算机科学仍然是一门非常不成熟的科学。如果这个科学能够成熟起来,我们对专业术语的使用就会更加精确和有章法,这样我们的交流就会更加的精确和有效。

重构对于代码质量和可读性的改进是一种非常有效的技术方法。精确的描述:它是一种为了将来的维护和理解而对代码进行改进的一种限制性的修改行为。一个好的例子:把重复的代码提炼成一个方法,所有出现了这重复代码的地方都使用这个方法来代替,以此消除重复。重构是在上世纪90年代早期被第一次提出来讨论的概念,1999年代Martin Fowler的大作《重构》出版之后成为业界普遍接受的技术方法。

重构会导致代码的内部结构发生一些小的变化。这些变化原则上不会对外部产生任何影响。规范的单元测试只从外部来检查代码的行为,是不会发现这些代码是被重构过的。如果代码的结构变化时导致了代码的对外行为发生变化,那这不是重构。

可是,为什么我们的企业的相关人士当听到这么简单而且有用的“重构”技术时会裹足不前呢?我认为这是因为程序员实际上说的是一种更加复杂、成本更高的结构调整技术,因为没有一个合适的术语来表示,就把它叫做“重构”了。重构里的结构调整通常不是代码的推倒重写,很多的现有代码都要重用。人们对此害怕的原因是,他们不知道水有多深,一旦掉进去将要付出多少时间,而且怀疑这种行为能带来多少的好处。

上面说的结构上发生重大变化的例子让我想起来一个新业主接管一个饭店或酒吧后会做的事情。新主人通常会对饭店进行重新装修,让它看起来更有吸引力,更舒适。饭店建筑的大部分都会被保留和重用,这比完全重建会减少大量的成本。依我的经验,当程序员使用“重构”这个术语时,他们真正的意思是,代码库中的某些模块或有边界的上下文内容需要进行重大的修整。如果我们把这个术语定义清楚,让相关人员知道它的目的和意义,那我们就能对项目进行更好的计划和管理了。

这些代码的修整活动必须在之初有清晰的目标,所有的变动必须按照要求进行测试。例如,当我们对业务有了新的认识后,会发现代码没有真正的反映出业务模型。这种认识经过一段时间后不断的积累,代码开始不再满足业务需求。如果使用领域驱动设计(Domain Driven Design),业务模型的本质会被看的更清楚。当对业务有了新的理解后,代码需要大调整来适应新需求。如果为了赶工期,随意在需要的地方进行代码修改,代码的发展会偏离精炼出的设计模型。各处的修改相互不关联,慢慢积累,虽然可以运行,但也带来了不好的副作用。这就需要代码重构。重构的过程中,测试的目的就是要检查这些重大的程序结构调整是否仍然完全的满足改进后的业务设计说明。

对于核心业务将来的发展,或者降低一个关键的模块为应对产品的需求偶尔做出的升级的风险,代码的修整是十分有必要的。

我好奇其他人也是否相似的在开发中出现的这些现象,你觉得对这些概念进行重新定义有意义吗?

这篇关于[观点]是重构,还是代码修整?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405583

相关文章

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类