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

初识重构

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.xdnf.cn/news/34061.html

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

相关文章

数字图像处理(15):图像灰度反转和彩色反转

(1)图像反转:是指对图像的颜色信息进行相反的处理,从而得到一个新的图像。在计算机视觉和图像处理领域,图像反转是一种常见的操作,它可以帮助我们实现不同的图像特效和视觉效果。 (2&#xff09…

Ubuntu系统上mysql服务部署

前段时间搞了一个mysql服务端的部署,在Ubuntu系统上,中间也踩了许多坑,特此记录下。 下载 官网:MySQL :: MySQL Community Downloads 这个里面有不同系统的安装包,根据自己的系统选择,我选了 MySQL Com…

linux 服务器 一次性查看 CPU、内存和磁盘使用情况

创建 vi check_usage.sh #!/bin/bashecho " CPU 使用率 " mpstat -P ALL 1 1echo -e "\n 内存使用情况 " free -hecho -e "\n 磁盘使用率 " df -h执行授权 chmod x check_usage.sh执行查看 ./check_usage.sh这样可以快速获取系统资源的概览。…

Unity HDRP Water Surface 水系统 基础教程

Unity HDRP Water Surface 水系统 基础教程 Unity Water SurfaceUnity 项目创建Unity Water Surface:Ocean(海洋)简介Ocean:Transform、GeneralOcean:Simulation(仿真模拟)Ocean:Sim…

【Golang】Golang基础语法(三):常量

常量 Golang 语言当中常量的定义和其它语言类似。 const filename_in_package string "abc.txt" // 可以定义为包内常量func consts() {const filename string "abc.txt" // 可以为常量规定类型const a, b 3, 4 // 也可以不规定const…

Cesium-环境搭建

安装步骤 1.安装node.js 2.去Cesium官网下载源码包 other:npm install Cesium 通过这种方式装 ,没有装成功,主要错误提示说缺少gulp文件,具体错误如下 ​ [1/5] Validating package.json... [2/5] Resolving packages... success Already up-to-date. $ gulp prepare &a…

mysql基础学习1

useradd -r -g mysql -s /bin/false mysql (-r)系统用户 不能登录 A temporary password is generated for rootlocalhost: d>#jT7rfoaz) 看是否启动 看进程 端口 直接连接 看日志 varchar (20) char(20)更耗空间 create table student_info(id int,name varchar(20),s…

行业Know-How助力零售企业数字化转型|StartDT Talk

【StartDT Talk】“客户成功三要素”系列直播第三期圆满收官! 本期直播聚焦于三要素之一的“好的行业Know-How”(行业理解),由奇点云创始人行在和资深产研专家追风共同探讨与零售相关的行业知识,以及我们在零售行业的…

linux——进程间通信system V消息队列

Linux——命名管道及日志-CSDN博客 文章目录 目录 文章目录 前言 一、system V消息队列是什么? 二、相关库接口 1.shmget接口 2、ftok接口 3、shmget、ftok接口封装 4、共享内存操作 ​编辑 5、shmdt接口 三.函数的调用 1、查看共享内存 2、shell 四…

【Redis】not support: redis

1、查看redis进程 2、查看是否安装redis扩展,此处以宝塔为例

网站维护记录

服务器重启,网站打不开:chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp: // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

XiYan-SQL:⼀种多⽣成器集成的Text-to-SQL框架

发布于:2024 年 12 月 03 日 星期二 北京 #NL2SQL #阿里巴巴 #Text-to-SQL 文提出了一种用于自然语言到 SQL 转换的多生成器集成框架 ——XiYan-SQL,旨在应对大型语言模型在 NL2SQL 任务中的挑战。该框架融合提示工程与监督微调(SFT)方法,利用 SFT 的可控性与上下文学习(…

283.移动零(快慢指针)

目录 题目过程解法 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 过程 class Solution { public:void moveZeroes(vector<int…

L17.【LeetCode笔记】另一棵树的子树

目录 1.题目 代码模板 2.分析 3.代码 4.提交结果 1.题目 https://leetcode.cn/problems/subtree-of-another-tree/description/ 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff…

天天AI-241302:今日热点-B站第二届超级科学晚聚焦AIGC,年度播放量突破300亿次

2AGI.NET 天天 AI 天天AI&#xff1a;AIGC技术引领科学与媒体新浪潮天天AI&#xff1a;AIGC技术引领科学与媒体新浪潮https://www.2agi.net/blog/daily-ai-aigc-technology-leads-science-and-media-new-wave/ 1. B站第二届超级科学晚聚焦AIGC&#xff0c;年度播放量突破300亿…

MySQL数据集成到广东省追溯平台的销售信息同步方案

销售信息同步--外购上报流程2&#xff1a;MySQL数据集成到广东省特殊食品电子追溯平台 在现代数据驱动的业务环境中&#xff0c;确保销售信息的准确性和及时性至关重要。本文将分享一个具体的技术案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将MySQL中的销售信…

vue-qr在线生成二维码组件(vue2版本)

在对于二维码生成中有许多组件&#xff0c;下面介绍关于自定义比较高的vue-qr组件&#xff0c;能自定义设置背景颜色、背景图片、背景Gif图、实点和空白区的颜色、中心Logo的图片和边距。 依赖下载 注意&#xff1a; 直接npm下载最新版 有些项目可能运行会抱错 这时候你可以降…

C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

Ngrok快速将你的本地Streamlit应用创建一个公共的 URL,供外网访问

目录 1 Ngrok介绍2 Ngrok 的工作原理3 Ngrok安装4 启动Streamlit应用5 Ngrok搭建外网访问 1 Ngrok介绍 Ngrok 是一个开源工具和商业服务&#xff0c;可以为你的本地应用创建一个安全的公共 URL&#xff0c;使其能够通过互联网访问&#xff0c;而无需复杂的网络配置&#xff08…

青龙面板的定时规则

6个数字的定时规则&#xff0c; 第1个是秒&#xff0c;第2个是分&#xff0c;第3个是时&#xff0c;第4个是每月的哪日&#xff0c;第5个是哪月&#xff0c;第6个是每周的周几。 数字之间空格隔开。 不限制的用*号替代&#xff0c;定期的时间用“?”替代&#xff0c;间隔运…