重构从现在开始

1 前言

重构,是一名程序员必备的职业技能。然而,大多数人对于重构的认知仍然停留在项目中期为了提升代码质量而做的并非不可不做的操作。对于重构的重要性和含义并没有充分的认知。

本文,笔者将结合自身经验和阅读《重构,改善既有代码的设计》一书(下面简称《重构》)的心得,以系列文章的方式讲述重构的内功心法以及武功招式。

2 何为重构

重构,就是对软件代码进行调整。这里调整的前提是不改变软件的功能,目的在于使代码更易让他人看懂,从而进行有意义的修改

对于程序员来说,大多数情况下很难做到对一个项目从 0 到 1 地开发,往往都是中途加入,在已有的代码基础上进行现有代码的修改或增加新的特性。由于项目往往经过多人的合作开发,每个人的编程风格各异,从而导致代码质量直线下降,不同模块给人一种割裂感。因此,当我们接手一个前人写过的项目代码时,往往喜欢戏称之为“屎山”。

屎山带来最直接的影响就是:

  1. 代码不易阅读和理解
  2. 代码不易修改,新特性很难加入

因此,为了方便修改和理解,我们需要对修改的部分的相关代码在不改变其功能的基础上进行一定的调整,这个过程就是重构。

3 为何重构

  1. 重构改进软件的设计
  2. 重构使软件更容易理解
  3. 重构帮助找到bug
  4. 重构提高编程速度

4 何时重构

很多人习惯性地认为重构应该发生在特性实现后,但事实上这样只是方便了后人对你的代码进行修改,而对于你本次开发的难度性没有任何减小。

那是否是在特性实现前?事实上,我们大多数时候无法保证自己第一遍写出来的代码能够完全符合高质量代码的标准而不需要重构。因此,特性实现前的重构只是方便了自己本次的开发,但对于本次开发引入的新的屎却无法解决。

最佳实践:
我很喜欢《重构》一书中两顶帽子的比喻,它将开发软件时需要分配时间的两种行为:添加新功能和重构比喻为两顶帽子。添加新功能时不对代码做任何结构的调整,而重构时也不添加任何新的功能。在软件开发的过程中我们需要不断地变换两顶帽子。当我们为添加新功能时每写入一段新的代码,如果发现此时需要重构,便可以立即暂停对新功能的开发而进行重构。重构后又可立即转回继续开发新功能。

5 重构中测试的重要性

重构过程中最怕的一个点就是当我们变更了代码结构后,为代码加入了新的bug,或是原本的程序在重构后运行结果不符合预期。因此,为了保证重构的正确性,测试必不可少。

在重构开始前,我们需要保证有一套完整的针对需要重构的代码部分的自动化测试。当然,这个测试可以是自动化测试脚本,也可以是单测。在重构的过程中,需要保证哪怕进行了一些微小的变动都进行一次测试,确认运行结果与重构前一致。

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

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

相关文章

北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载 2.解压打开 3.modelsim初安装 4.…

设计模式:策略模式、工厂模式、模板模式混合使用

目录 优缺点总结 这次我们利用模板模式固定下策略模式的骨架,工厂模式提供注册策略,获取策略的方法,提供一个三个设计模式的例子。 abstract class Template{// 模板方法,定义了算法的骨架public void templateMethod() {System.o…

Java代码质量评估工具

概述 Java代码的质量评估主要包括代码的可维护性、健壮性、以及在运行时能达到既定的性能目标,可维护性主要包括代码的可读性、在关键的代码上提供详细注释、在设计类、方法以及代码逻辑时符合设定的编码规范,健壮性主要包括编写代码时应使用常用的设计…

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用 kubeadm方式部署 一、测试所需环境(三台均要执行)二、配置准备(三台均要执行)1. 重命名hostname、添加hosts2. 关闭防火墙、selinux与swap3. 添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm 三…

Mysql002:(库和表)操作SQL语句

目录: 》SQL通用规则说明 SQL分类: 》DDL(数据定义:用于操作数据库、表、字段) 》DML(数据编辑:用于对表中的数据进行增删改) 》DQL(数据查询:用于对表中的数…

【Verilog教程】2.3 Verilog 数据类型

Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg),其余类型可以理解为这两种数据类型的扩展或辅助。 线网(wire) wire 类型表示硬件单元之间的物理连线,由其连接的器件输…

Docker 部署 Redis 服务

拉取最新版本的 Redis 镜像: $ sudo docker pull redis:latest在本地预先创建好 data 目录和 conf/redis.conf 文件。 使用以下命令来运行 Redis 容器: $ sudo docker run -itd --name redis --privilegedtrue -p 6379:6379 -v /home/ubuntu/docker/redis/data:/data -v /ho…

代理IP与Socks5代理:跨界电商智能爬虫的引擎与安全壁垒

一、引言 跨界电商已成为全球商业发展的重要趋势,但要成功进入多样化的市场,企业需要大量的市场数据和对隐私安全的保障。代理IP和Socks5代理是两项关键技术,它们在这一领域的应用对于企业的成功至关重要。 二、代理IP:跨界电商…

十分钟理解OSPF路由协议

十分钟理解OSPF路由协议 1.RIP的缺陷以跳数为度量值最大跳数为15更新路由表采用全更新收敛速度慢 2.RIP与OSPF比较OSPF概述运行OSPF协议之前运行OSPF协议之后 3.OSPF协议工作过程1.发现邻居2.建立邻接关系3.传递链路状态信息4.计算路由 4.OSPF分区域管理 有RIP协议,…

单元测试框架-pytest

单元测试框架-pytest 官网 常用插件 pytest-html: 生成html报告pytest-xdist: 实现并发测试pytest-ordering: 实现测试用例顺序设置pytest-rerunfailures: 测试用例失败重试allure-pytest: 生成测试报告 引入依赖 在项目根目录下创建:requirements.txt pytest pytest-htm…

Visual Studio Code配置开发Maven项目、Spring Boot项目

配置开发Maven项目、Spring Boot项目 配置全局配置项目配置注意 Maven项目开发安装插件创建项目启动项目 Spring Boot项目开发安装插件创建项目启动项目 其他插件 配置 全局配置 ctrlshiftp打开搜索setting.json,这个setting.json配置属于全局配置 配置全局的Java与…

Python配置与测试利器:Hydra + pytest的完美结合

简介:Hydra 和 pytest 可以一起使用,基于 Hydra Pytest 的应用可以轻松地管理复杂配置,并编写参数化的单元测试,使得Python开发和测试将变得更为高效。 安装: pip install hydra-core pytest案例源码:my…

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计

基于stm32单片机的app视频遥控抽水灭火水泵小车设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 L298N电机驱动电路设计2.2 继电器控制电路设计 3、部分代码展示3.1 小车控制代码3.1 水泵控制代码 4 演示视频及代码资料获取 1、项目简介 视频简介中包含资料http…

用selenium和xpath定位元素并获取属性值以及str字符型转json型

页面html如图所示: 要使用xpath定位这个div元素,并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …

(图论) 1020. 飞地的数量 ——【Leetcode每日一题】

❓ 1020. 飞地的数量 难度:中等 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个 海洋单元格、1 表示一个 陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边…

python基础语法(四)

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️🐿️🐿️C语言例题 🐣🐓🏀python 这…

9.19 QT作业

完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QFontDialog> //字体对话框 #include<QFont> //字体类 #include<QMessageBox> //消息对话框 #inclu…

SpringMVC学习|JSON讲解、Controller返回JSON数据、Jackson、JSON乱码处理、FastJson

JSON讲解 JSON(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交换格式&#xff0c;目前使用特别 广泛。 采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON成为理想的数据交换语言。 易于人阅读和编写&#xff0c;同时也易于机…

岩土工程安全监测中振弦采集仪连接振弦传感器时注意事项

岩土工程安全监测中振弦采集仪连接振弦传感器时注意事项 岩土工程安全监测是保障工程稳定和安全的重要手段之一&#xff0c;而振弦采集仪则是岩土工程安全监测的常用设备之一&#xff0c;可以用于实时监测地下水位、土体变形、岩体应力等。其中&#xff0c;振弦传感器是振弦采…

Clickhouse存算分离的思考

Exploring storage and computing separation for ClickHouse - JuiceFS Blog ClickHouse 存算分离改造&#xff1a;小红书自研云原生数据仓库实践 唯品会翻牌ClickHouse后&#xff0c;实现百亿级数据自助分析_语言 & 开发_dbaplus社群_InfoQ精选文章 在思考如何实现存算…