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

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

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

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

文章内容如下:

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

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

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

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

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

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

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

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

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

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



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

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT