【阅读笔记】《重构》 第一二章

news2024/12/28 19:25:36

第一章 重构,第一个案例

  • 编译器不会在乎代码好不好看,都是正常运行的。但人在乎,差劲的系统很难修改,因为很难找到修改点,导致程序员很有可能犯错,从而引入bug

重构的第一步

  • 得为即将修改的代码建立一组可靠的测试环境
  • 让测试有能力自我校验,否则就得耗费大量时间来回对比,降低重构开发速度
  • 好的测试会为程序员提供必要的安全保障

分解并重组

  • 代码块越小,代码的功能就越容易管理,代码的处理和移动也就越轻松
  1. 找出代码的逻辑泥团并运用提取方法
    1. 找到函数内的局部变量和参数
  2. 每次修改的幅度小,所以任何错误都很容易发现,不必耗费大量时间进行调试
  • 可以改变变量名称,好的代码能够清除表达出自己的功能,变量名称是代码清晰的关键
  • 任何一个"傻瓜"都能写出计算机可以理解的代码,唯有写出人类容易理解的代码才是优秀的程序员
  • 临时变量只在自己所属的函数中有限,所以它们会助长冗长而复杂的函数
  • 重构大半时间都是用来弄清楚代码所做的事
    在这里插入图片描述
  • 最好不要在另一个对象的属性基础上运用switch语句,否则需要把该对象属性作为参数传进去
  • 也有另一种方法,用多态来取代switch语句

总结

  • 所有的重构行为都使责任的分配更合理,代码的维护更惺忪。重构后的程序风格,更偏向于过程化风格
  • 重构的节奏:测试、小修改、测试、小修改…,的节奏才能让重构得以快速而安全地前进

第二章 重构原则

何为重构

  • 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本
  • 使用一系列重构手法, 在不改变软件可观察行为的前提下,调整其结构
  • 重构技术,提供了一种更高效且受控的代码整理技术
  • 重构使软件更容易被理解和修改;重构不会改变软件可观察的行为

为何重构

  1. 重构改进软件设计
    • 当人们只为短期目的,或是在完全理解整体设计之前,贸然修改代码,程序会逐渐失去自己的结构,程序员越来越难通过阅读代码而理解原来的设计
    • 代码结构的流失是累计性的
    • 重构像是在整理代码,让所有东西(代码)回到应处的位置上
    • 完成同样一件事,设计不良的程序往往需要更多代码,改进的一个重要方向就是消除重复代码
  2. 重构使软件更容易理解
    • 让你的代码变得“准确说出我所要的”
  3. 重构帮助找到bug
    • 重构能够帮助程序员更有效地写出强健的代码
  4. 重构提高编程速度
    • 重构帮助你更快速地开发程序
    • 良好设计师维持软件开发速度的根本,重构可以帮助你更快速地开发软件,因为它阻止系统腐败变质,甚至可以提高设计质量

何时重构

三次法则

  1. 添加功能时重构
    • 能够帮助我理解需要修改的代码
    • 在前进过程中把代码结构理清,可以从中理解更多东西
    • 重构的另一个原动力:代码的设计无法帮助我轻松添加我所需要的特性
  2. 修补错误时重构
    • 调试过程中运用重构,多半是为了让代码更具可读性
  3. 复审代码时重构
    • 代码复审,有助于在开发团队中传播知识,也有助于让较有经验的开发者把经验传递给比较欠缺的人,并帮助更多人理解大型软件系统中的更多部分
  • 程序员希望程序更容易阅读,所有逻辑都只在唯一地点制定,新的改动不会危及现有行为,尽可能简单表达条件逻辑
  • 重构是这样一个过程:他在一个目前可运行的程序上进行,在不改变程序行为的前提下使其具备上述美好性质,使我们能够继续保持高速开发,从而增加程序的价值

重构的难题

  1. 数据库
    • 绝大多数商用程序都与它们背后的数据库结构紧密耦合在一起
    • 重构后的数据迁移,过程十分漫长且繁琐
    • 解决方案:
      • 在对象模型和数据库模型之间插入一个分隔层,隔离两个模型各自的变化
  2. 修改接口
    • 如果接口被修改了,任何事情都有可能发生变化变化
    • 如果重构手法改变了已发布接口,必须同时维护新旧两个接口,直到旧接口彻底被没人用
  3. 难以通过重构手法完成的设计改动
    • 先想象重构的情况
  4. 何时不该重抽
    • 重构之前,代码必须起码能够在大部分情况下正常运作
    • 项目非常接近最后期限时不该重构

重构与设计

  • 重构肩负一项特殊使命:它和设计彼此互补
  • 写代码前,可以先做预先设计,但不一定是最正确的解决方案,能够得到一个足够合理的解决方案即可。在后续的开发过程中,不断改进当前的解决方案,从而想最佳方案的方向前进

重构与性能

  • 在短期看来,重构的确可能使软件变慢,但它使优化阶段的软件性能调整更容易,最终还是会得到好的效果

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

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

相关文章

自动化测试Selenium【基础篇一】

自动化测试Selenium【基础篇一】🍎一.什么是自动化测试🍒1.1 自动化测试介绍🍒1.2 单元测试🍒1.3 接口自动化🍒1.4 UI自动化🍒1.5 为什么选择selenium作为我们的web自动化工具?🍒1.6什么是驱动…

DaVinci:限定器 - RGB

调色页面:限定器Color:Qualifier限定器 - RGB Qualifier - RGB根据像素的三原色通道(红、绿、蓝)的值来选择画面上的对应区域,从而限制节点调色的范围。限定器 - RGB 根据指定的各个原色通道的色阶范围来选择连续的近似…

Java 对象处理流(ObjectOutputStream\ObjectInputStream)

文章目录前言什么是对象流?基本介绍ObjectOutputStreamObjectInputStream对象处理流的使用细节前言 处理流:是对一个已存在的流进行处理和封装,通过所封装的流的功能调用实现对数据的操作。而处理流中也有不同的分类,此片介绍的是…

C规范编辑笔记(十一)

往期文章: C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) C规则编辑笔记(十) 正文: 因为太久没有更新了,今天就…

Elasticsearch7.8.0版本高级查询—— 多关键字精确查询文档

目录一、初始化文档数据二、多关键字精确查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","…

干货 | 算力网络节点可信度评估和安全管控方案

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分:算力网络第二部分:可信度评估一、可信度评估在整个算力网络处理任务的实施流程中,不同部分有不同可信度评估的方法,具体包括:…

忙活了一年的开源社区,终于赶上了春节前的末班车!

随着春节的临近,忙碌了一年的小伙伴们,是不是都已经踏上了回乡的列车?我呢也终于在春节前,完成了 HelloGitHub.com 的重构。HelloGitHub.com 是我在 2017 年的时候用 FlaskjQuery 开发的网站,最初的想法很简单就是为了…

MySQL34道练习题

1、取得每个部门最高薪水的人员名称(要求显示部门编号、人员名称和薪资) 第一步:查询每个部门的最高薪资 SELECT deptno,max(sal) as maxsal FROM emp GROUP BY deptno; 第二步:把上面查询结果当做临时表t&#xff0…

Pagoda panel宝塔面板

宝塔面板是干什么的?有哪些典型的功能作用?宝塔面板是开发的服务器管理工具,是一家专业从事服务器相关软件和服务研发的公司。宝塔的愿景是让用户更容易使用服务器。宝塔面板是一款服务器管理软件,支持Windows和Linux系统,服务器…

【SpringCloud18】SpringCloud Alibaba Nacos服务注册和配置中心

1.Nacos简介 1.1为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service 1.2 是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台Nacos:Dynamic Naming and Configuration ServiceNacos就是注册中心 配置中心…

简单双向LSTM模型实战项目

前言 数据来自于kaggle比赛Ventilator Pressure Prediction,数据背景介绍请看官方说明代码来自于当前排名第一的团队Shujun, Kha, Zidmie, Gilles, B,他们在获得第一名的成绩以后发了一篇博客,提供了他们在比赛中使用的模型,包括…

[C/C++]对象指针

对象指针 1.对象指针变量 和基本类型变量一样,对象在初始化之后也会在内存中占有若干字节的内存空间。因此在程序中,我们可以通过对象名或对象的地址来访问该对象。对象指针变量就是一个用于保存对象在内存中存储空间首地址的指针变量,它与普…

Python Matplotlib 中如何用 plt.savefig 存储图片

目录前言正文前言 plt.show()展示图片的时候,截图进行保存,图片不是多么清晰 如何保存高清图也是一知识点 函数包名:import matplotlib.pyplot as plt 正文 主要功能:保存绘制数据后创建的图形。使用此方法可以将创建的图形保…

MobaXterm的安装与使用

安装: 分为开箱即用和逐步配置版本,这里选择开箱即用的版本,网址如下: MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Home EditionFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Home Editionhttps://mobaxterm.m…

Java面试题(2),这是一篇会一直更新的博客!欢迎大家留言~

Java面试题第二篇1. 并发的三大特性2、线程池、解释线程池参数3、BeanFactory和ApplicationContext有什么区别?4、描述一下Spring Bean的生命周期5、Spring的几种Bean的作用域6、单例Bean是线程安全的吗?7、Spring框架用到了哪些设计模式8、Spring事务的…

Magic Leap CEO:我们的目标是再回到消费级AR市场

相比于几年前,Magic Leap在CEO换人后经历了一系列变化,其中更明显的变化,就是这家公司似乎变得更低调、更务实。此前,Magic Leap的内容库包括了大量趣味、娱乐的AR应用,而现在则主要改成B端解决方案,随着ML…

小程序商城源码代码分析

微信平台开发直播插件后,许多传统的商家开始加入小程序商城源码开发的队伍中,以此来自主管理自己的产品。下文,小编将为大家盘点一下小程序商城源码的优势,以及代码分析。 一、小程序商城源码有什么优势? 1、拓展私域…

定时任务中将redis数据存入数据库相关问题

我的GitHub:Powerveil GitHub我的Gitee:Powercs12 (powercs12) - Gitee.com皮卡丘每天学Java觉得昨天晚上只是分析和解决问题,很多人可能不知道出bug的场景,今天决定重现bug,让代码改回错误代码,重现看到一…

科研快报|PacBio 16S全长测序探究游离唾液微生物群失调在牙周病中的潜在作用

背景介绍唾液是口腔中最重要的介质。唾液中游离细菌的生态失调可能与牙周病的发生、发展、预后和复发有关,但这种潜在的关系尚不清楚。本研究的目的是探讨游离唾液微生物群在不同牙周状态下的潜在作用,它们对非手术牙周治疗的反应,以及治疗后…

年后旺季,服装实体店如何利用微信做新款宣传?

每年过完大年开工后,我们服装的旺季就来临了,对于很多服装店铺来说,无疑是一个必须把握的大好机会。就拿这几天的天气来说,广东最高温度达到了26度,很多人又把自己春夏的衣服拿出来了,而年后气温必然回暖&a…