我眼中的“懂重构”(一)

news2025/1/16 20:57:54
初识重构

2017年的时候,领导让我看公司的一本书《重构——改善代码的既有设计》,这是一本JAVA版本的,前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂,然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入职场的几年里能碰到支持下属做重构的领导也是我个人的荣幸。
这本书里面举了很多的例子,能让我现在还记得的有两个

  • 函数是要throw Exception还是要return -1
  • 函数是要先判断异常情况还是要先执行正常情况

搞笑的是,这两个问题的详细答案我现在还想不起来,因为实际编程的时候我基本不会抛出异常,如果真这么做我还要在上层去catch异常,影响编程效率,而且到底throw什么异常,异常的参数也要设计,太麻烦了,并且在我的有的项目里我确实这么实践过,真是给自己挖坑。当然如果是设计sdk的api,可以考虑throw exception,因为给别人调用,还是要明确一下程序运行的条件,一旦程序不满足运行条件,“显示”的告知,比“隐式”的让别人猜好很多。第二个问题,我现在不是很在意,默认先判断异常。但是这种方式如果需要打印异常日志,就显得麻烦,下面的例子每个error要使用一次print,

if (error1) {
print("error1")
return
}
if (error2) {
print("error2")
return
}

当然后来我做了改进,只要最后只有一个return,就只需要一个print,避免代码里到处都是日志

errorType = 0
if (error1) {
errorType = 1
}
else if (error2) {
errorType = 2
}
...
print("errorType: " + errorType)
修正对重构的理解
  1. 重构并不会增加bug
    2017年的时候我跟领导反馈过,我担心重构后本来没明显bug,结果重构完bug更多了。当时领导跟我讲,重构是改变的内部结构,不改变外部结构。也就是说,以前是什么样,重构后还是什么样,重构的目标也不是改bug,是把已经没bug的功能用更容易理解的方式优化一遍,目标就是“更容易读”。从此我写代码会一直考虑“容易读”这一个特征。甚至我写的所有代码哪怕放到几年之后我依然读起来很容易。
  2. 重命名也属于重构
    很多人一提重构就说自己没做过,或者没有时间重构,公司不给时间重构,等等。随着程序功能的增多,有时候变量要换新的名字,重命名就需要做,重命名在Refactor->Rename里面,从这个IDE对这个功能的划分就知道,重构rename属于Refactor。 另外关于很多人说自己没做过重构,除了他不知道rename属于重构以外,他可能也没听说过rename的时机——“立即”,在书上明确写到,“当你想起一个新的名字更有表现力的时候,要立即重命名”,也就是说重构几乎是频繁发生的,在任何需要修改代码的时候都可能会需要重构。
  3. 重构的过程中软件产品长期不可用
    最近就听到有的人重构了一个会议类项目半年,新版本半年不可用。我当时就在想,他们是不是不知道自己是在重写,以为自己是在重构。从网上专门翻了一篇文章,并截图如下,最后一句,“他在做的事情不是重构”
    在这里插入图片描述
    很久以前我的同事也经常把重写当成重构,这是一个很关键的误区,为了避免本博客把个人观点作为事实去阐述,我还专门又百度了一下,如下
    在这里插入图片描述
重构的一些原则

如果要把实践抽象成理论,并逐一解释每个理论在实践中使用的例子,这是很困难的。不仅总结知识困难,表达和分享知识也很困难。先看下官方的说法
在这里插入图片描述
如果是给别人听,这样说会显得专业,但是每个人其实都有自己对于各个原则的实践情况,从而形成自己的理解,就比如百度智能问答有时候给我说7个原则,于是我还发现了三大原则,四大原则,五大原则。真的是除了一大原则,二大原则,其他的真多呀,虽然很好笑,但是经过思考的东西肯定比背诵没有消化的知识更有价值。关于这些原则的截图放在文末。其实对于这些原则除了极个别的会经常考虑,有的原则仅仅在理解以后立马抛之脑后,即便抛之脑后,如果仅仅是保持着“非必要,不让代码冗余”的原则,大概也能满足上述原则。

如何评估代码质量

1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。

这5条每一条都能在每一段代码中体现,甚至我常常都不去记忆上述的6大原则,而仅仅遵循这些评估代码质量的标准,就能够逐渐写出很少需要改动的代码。这5个特性因为太重要所以需要很长的篇幅才能从多个方向去讲清楚。

附图:网友的程序设计原则

三大原则
在这里插入图片描述
四大原则
在这里插入图片描述
五大原则
在这里插入图片描述
七大原则
在这里插入图片描述

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

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

相关文章

机器学习详解(3):线性回归之代码详解

文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播:forward_propagation代价函数:cost_function反向传播:backward_propagation参数更新:update_parameters训练方法:train代码运行结果 3 使用Py…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约,插件自动部署proxy和proxyAdmin合约,帮助管理合约升级和交互;升级已部署合约,通过插件快速升级合约,脚本开发方便快捷;管理代理管理员的权限,只有proxyAdmin的…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几乎需要一个下午的时间 关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作 就想着做一个工具,可以自动处理…

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之:内存与垃圾回收篇(一) ##本篇内容概述: 1、JVM结构 2、类加载子系统 3、运行时数据区之:PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系,它只是与特…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页

首先一点,不管是那个框架开发的网页前端,最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件! 所以不管用原始的三剑客(HTML CSS JS)开发的前端还是用各类框架开发的前端界面(只是让开发简单…

树莓派 PICO RP2040 MACOS 使用

文章参考: Developing in C on the RP2040: macOS | Wellys Dev 这里会提示报错:ln: /bin/picotool: Operation not permitted 参考:Mac ln命令报错:Operation not permitted_ln operation not permitted-CSDN博客 放在 usr/lo…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字,如果等全部文字返回了一次性去TTS,那么延迟会非常严重,常用的方法就是通过标点符号断句,返回了一句话就提交给TTS。随着流TTS的出现,就可以直接把大模型返回的文字灌给流TTS&#xff0…

git使用-创建本地仓库、绑定远程仓库

文章目录 1. 创建git仓库2. commit提交到本地3. 创建远程仓库4. 关联远程仓库5. push代码至远程仓库6. 完成初始化 git作为版本控制工具,在开发过程中经常使用到。这里以github为例,简单介绍下仓库的创建及绑定,方便忘记了能快速的想起来。 1…

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码) 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…

为什么Unity里的变体数和UWA工具测出来的不一样

1)为什么Unity里的变体数和UWA工具测出来的不一样 2)使用TextureArray为什么会导致L1 Cache Miss率变高 3)Gfx.PresentFrame耗时异常高 4)AO方案中哪个更适合移动端 这是第412篇UWA技术知识分享的推送,精选了UWA社区的…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断  接车后试车,…

DataEase 是开源的 BI 工具

DataEase 是开源的 BI 工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表, DataEase 的优势: 开源开放:零门槛&#xf…

【C#设计模式(17)——迭代器模式(Iterator Pattern)】

前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象,而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…

在LabVIEW中如何利用FPGA提升算法性能

在LabVIEW中利用FPGA的性能进行算法开发,能极大提升数据处理和实时计算的速度。LabVIEW提供了针对FPGA的开发工具,如LabVIEW FPGA Module,可以使开发者将算法部署到FPGA硬件上,从而实现并行计算和低延迟操作。以下是如何在LabVIEW…

Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车

目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…

HCIA-openGauss_2_2连接与认证

设置客户端认证策略 设置配置文件参数 gssql客户端连接-确定连接信息 客户端工具通过数据库主节点连接数据库,因此连接前,需要获取数据库主节点的在服务器的IP地址及数据库主节点的端口号信息。 步骤1:以操作系统用户omm登录数据库主节点。…

上海理工大学《2024年867自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《上海理工大学867自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦,如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发,易懂、快捷、迅速,从0开始搭建,很快就能构建起一个SpringMVC项目,能学到两种使用tom…