《重构的时机和方法》,值得程序员仔细研读的一本书

news2024/9/30 11:30:15

       现有代码结构及框架沿用的比较久,持续在其上新增功能,可维护性与可扩展性变得越来越差,随着需求不断增加,现有代码变得越来越臃肿复杂,变得很难维护,甚至出现较严重的性能瓶颈,一般这个时候我们可能就需要对代码进行改进和重构了。通过重构,可以减少多个模块的耦合,提高代码的扩展性与可维护性,有效地提升程序的性能。今天我们就来讲讲重构相关的内容。

1、何谓重构

       每个人对每样东西都有自己的定义,为了沟通上的达到最佳效果,在这给出重构的定义。视上下文不同,“重构”这个词有两种不同的定义,第一种是以名词形式,第二种是以动词形式。

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

       重构就只是整理代码吗?从某种程度上来说,是的。但是我认为重构不止于此,因为它提供了一种更高效且受控的代码整理技术。重构的目的是软件更容易被理解和修改。你可以在软件内部做很多修改,但必须对软件可观察的外部行为只造成很小变化,或甚至不造成变化。与之形成对比的是性能优化。性能优化通过不会改变组件的行为(除了执行速度),只会改变其内部结构。但是两者出发点不同,性能优化可能除低代码的易理解性,而重构是为了提高代码的易理解性。

2、为何重构

       也许您的态度倾向于尽量少修改程序:不管怎么说,它还运行得很好。您心里牢牢记着那句古老的工程谚语:“如果它没有坏,就不要动它。”这个程序也许没有坏掉,但是它造成了伤害,让你的生活比较难过,如代码难懂查找已有的BUG很困难,设计不合理导致修复BUG需要改动的地方很多且增加程序的臃肿程度,在效率驱动开发的今天,只会让程序慢慢趋向于复杂和难以掌控,直至没有人愿意接手或痛苦的工作着。

        重构可以帮助你始终良好地控制自己的代码。重构可以改进软件设计,重构使软件更容易理解,重构可以帮助您找到BUG,重构可以提高编程速度。听起来重构可以提高编程速度违反直觉。我一直深信,良好的设计是快速开发的根本——事实上,拥有良好设计才可能做到快速开发。如果没有良好的设计,或许某一段时间内你的进度迅度,但是恶劣的设计很快就让你的速度慢下来,你会把时间花在调试上面,花在寻找BUG上面。在修改BUG的过程中,如果仍采用哪里出问题就临时修改的话,你在短时间内修改BUG的数目会很惊人,足以使领导对你的工作满意,然而这是一个恶性循环。

3、何时重构

       常常有人讨论什么重构,怎么安排重构时间表,是不是应该每个月就专门安排两个星期来进行重构呢?几乎任何情况下我都反对专门拨出时间进行重构。在我看来,重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地进行。你不应该为重构而重构,像使用设计模式一样,不能为了模式而模式,你之所以重构,是因为你想做别的什么事,而重构可能帮助你把那些事做好。那么到底什么时候进行重构呢?下面是应该重构的时机。

       三次法则,事不过三,三则重构。第一次做某件事时只管去做,第二次做类似的事会产生反感,但是无论如何还是可以去做,第三次再做类似的事,就应该重构。 

3.1、添加功能时重构

       此时,重构的直接原因往往是为了帮助我理解需要修改的代码——这些代码可能是别人写的,对这些代码进行重构,使我能更快理解它,然后我就会重构。之所以这么做是为了让我下次再看这段代码时容易理解,还有一个更重要的原因是,如果在前进过程中把代码结构理清,我就可以从中理解更多东西。代码的设计往往无法帮助我轻松添加我所需要的特性。每当看着有待于改进的设计时,对自己说:“如果用某种方式来设计,添加特性会简单得多。”这种情况下可以用重构来弥补早期重构上的缺陷。

3.2、修补错误时重构

       调试过程中运用重构,多半是为了让代码更具有可读性。每当收到一份错误报告,这就是需要重构的信号,因为显示代码还不够清晰——没有清晰到让你看一眼就知道BUG所在。这时更具有针对性的重构能帮助加深自己的理解。

3.3、复审代码时重构

        代码复审活动就是为了改善开发状况,在开发团队中传播知识,这时会有经验的同事可以提出好的建议,不必想象代码应该是什么样,可以“看见“是什么样,可以获得更高层次的认识,这时重构不仅可以获得建议,而且其中许多建议能够立刻实现。

4、如何重构

当想对发现的代码进行重构时,应该采用下面三步来执行重构。

  • 第一步,为即将修改的代码建立一组可靠的测试环境。 
  • 第二步,要有效掌握代码重构的时机,使用科学的代码重构方法!(具体内容可以参见下面推荐的这本重构方面的经典书籍)
  • 第三步,对重构的代码进行测试。

5、给大家推荐《重构的时机和方法》

       《重构的时机和方法》是一本关于软件开发中重构技术的书籍。它以独特的风格和内容优势,为读者提供了全面而易于理解的指导,帮助他们在实际项目中应用重构技术,提高代码质量和开发效率。

       本书有一下几个重要特点:

  • 全面系统:本书从基础知识到高级技巧,涵盖了重构领域的各个方面。无论是初学者还是有经验的开发人员,都能够从中获得宝贵的知识和指导。
  • 易干理解:作者注重清明了,使用简洁易量的语言,避免对多专业术语和复杂念,这使得懂者合够轻松地理解和应用书中所述的重构技术
  • 实用性强:本书提供了大量实际案例和源代码示例,帮助读者将所学知识应用到实际项目中。通过具体案例演示不同类型的重构技术,读者可以更好地理解如何改进和优化代码。

        本书在业界收到了广泛的赞誉,获得了业界专家的一致好评:

6、最后

       《重构的时机和方法》是一本帮助软件开发人员提升代码质量和效率的重要参考书籍。无论你是初学者还是有经验的开发人员,都能够从中获得宝贵的知识和技巧。通过学习本书所述的重构技术,你将能够编写出更易于理解、维护和扩展的高质量代码。让我们一起探索重构的世界,打造更优秀的软件!购买链接:点击查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thymeleaf入门

Thymeleaf是前端开发模板,springboot默认支持。前端模板用法大多数是类似的jsp、thymeleaf、vue.js都有while\for\if\switch等使用,页面组件化等。 1.前端模板区别 jsp是前后端完全不分离的,jsp页面写一堆Java逻辑。 thymeleaf好处是html改…

域名解析优先级

浏览器访问过程解析 访问网址——>首先在本地电脑看看hosts里面是否有域名对应IP地址,如何有直接访问对应IP, 如果没有,则联网询问DNS服务器(一般网卡那边都配置了DNS服务器IP) linux hosts 路径: w…

苍穹外卖-day07

苍穹外卖-day07 本项目学自黑马程序员的《苍穹外卖》项目,是瑞吉外卖的Plus版本 功能更多,更加丰富。 结合资料,和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频:https://www.bilibili.com/video/BV1TP411v7v6/?sp…

中国气象局:到2030年,人工智能在气象应用领域取得世界领先地位

最近,中国气象局发布了《2023-2030年人工智能气象应用工作方案》,旨在加快推进国内人工智能气象应用技术体系建设,提升基础支撑能力,构建健全的人工智能气象应用政策环境,促进人工智能技术在气象观测、预报和服务领域的…

华为H12-821更新了32题,大家注意了

(多选题)使用堆叠和集群技术构建园区网的优势包括以下哪些项? A、业务中断时间大大减少 B、简化网络管理,降低网络部署规划的复杂度 C、可有效减少网络功耗 D、提高网络设备和链路的利用率 正确答案是…

教雅川学缠论02-K线

传统行情上的K线是下图中这样子的 而在缠论中K线是下面这样子的,它没有上影线和下影线 下图是武汉控股2023年7月的日K线 接下来我们将它转换成缠论K线(画图累死我了) K线理解了我们才能进行下一步,目前位置应该很好理解的

C++笔记之vector的resize()和clear()用法

C笔记之vector的resize()和clear()用法 code review! 文章目录 C笔记之vector的resize()和clear()用法1.resize()2.clear() 1.resize() 运行 2.clear() 运行

Python自动计算Excel数据指定范围内的区间最大值

本文介绍基于Python语言,基于Excel表格文件内某一列的数据,计算这一列数据在每一个指定数量的行的范围内(例如每一个4行的范围内)的区间最大值的方法。 已知我们现有一个.csv格式的Excel表格文件,其中有一列数据&#…

设计模式行为型——责任链模式

目录 什么是责任链模式 责任链模式的实现 责任链模式角色 责任链模式类图 责任链模式举例 责任链模式代码实现 责任链模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是责任链模式 责任链模式(Chain of Responsibility Pattern)又叫职…

【面试题】前端中 JS 发起的请求可以暂停吗?

这个问题非常有意思,我一看到就想了很多可以回复的答案,但是评论区太窄,就直接开一篇文章来写了。 审题 JS 发起的请求可以暂停吗?这一句话当中有两个概念需要明确,一是什么样的状态才能称之为 暂停?二是…

Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)

简介 前边介绍的都是通过按钮点击启动按钮来启动appium服务,有的小伙伴或者童鞋们乍一听可能不信,或者会问如何通过命令行启动appium服务呢?且听一一道来。 一睹为快 其实相当的简单,不看不知道,一看吓一跳&#xf…

TCP 三次握手四次挥手浅析

大家都知道传输层中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手。 一、三次握手 三次握手的交互过程如下 喜欢钻牛角尖的我在学习三次握手的时候就想到了几个问题:为什么三次握手是三次?不是…

shell脚本:使用mysqldump实现分库分表备份

一.什么是分库分表备份 分库分表备份是一种数据库备份策略,用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时,单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题,使用分库分表技术将数据库拆分成多个库…

解决eclipse 打开报错 An error has occurred. See the log file null.

解决eclipse 打开报错an error has ocurred. See the log file null 出现原因:安装了高版本的jdk,更换 jdk 版本,版本太高了。 解决方案:更改环境变量 改成 jkd 1.8

【RTT驱动框架分析00】-应用层函数调用流程-串口为例

应用层函数调用流程分析以-串口为例 1. rt_device_find调用流程 RTT内部有一个全局变量数组rt_object_container数组的数量就是 rt_object_info_type 内核对象的种类,其中包含一个RT_USING_DEVICE (设备的数据类型),数组内部的每一个变量包含一个链表&…

Codeforces算法心得——A. Escalator Conversations

大家好,我是晴天学长,今天开始尝试一些外国的题目了,不得不说,创新性挺高的,然后是全英文,也可以练练英文的水平,后面我会持续的更新的!加油!💪💪…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案,线上线下统一管理,打造私域流量,微信、门店会员全渠道管理,打通私域流量池,实现裂变营销: 开启新零售之路,必然要摒弃原有的管理模式,大…

JDK17 中的新特性初步了解

1. Switch 语句的增强 jdk12 ,switch语句不用写break了,直接写箭头和对应的值。 jdk 17中, 加了一个逗号,用于匹配多对一。 如果要在每个case里写逻辑,可以写在花括号里。 在返回值的前面加上yield的关键字。 也可以对…

如何查看网页中请求的路由地址

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

软考A计划-系统集成项目管理工程师-项目质量管理-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…