不愧是疑问解决神器(二)!你强任你强

news2024/12/22 23:29:04

不愧是疑问解决神器(二)!你强任你强👍👍👍

第3章 代码的坏味道

1.神秘命令(Mysterious Name)?

  • 整洁代码中最重要的一环就是有一个好名字,使他们能够清晰地表明自己的功能和用法。
  • 但正因为如此,命名就成了编程中最难的两件事之一。
  • 而在重构中改名是最常用的重构手法,包括改变函数声明,变量名,字段名等。
  • 记住,改名不仅仅是修改名字而已,若想不出一个好的名字,说明背后可能存在更深的设计问题。

2. 重复代码(Duplicated Code)?

  • 最简单的重复代码就是在一个类或方法总,存在两个函数相同相同的表达式。
  • 此时可采用提炼函数的方式来提炼出重复的代码,然后让重复调用这段代码的地方都改为同一个函数命名。
  • 若重复的代码只是很相似,而不是晚安全相同,可尝试移动语句顺序来进行重组。

3. 过长函数(Long Function)?

  • 活的最长,最好的程序,其中的函数都较短。

  • 函数越长,就越难理解

  • 但其实小函数也会给代码的阅读者带来一些负担,因为要经常切换上下文,才能看明白函数在做什么。若能给函数起一个好名字,阅读代码的人就可以通过名字了解函数的作用,根本不用去看函数的实现。

    3.1 如何提炼函数的参数和临时变量?

    • 可运用查询取代临时变量来消除临时变量
    • 可使用参数对象的方式将过长的参数裂变的更简洁一些
    • 若使用以上两种方式还是存在太多的临时变量和参数,那就上我们的杀手锏——以命令取代函数。

    3.2 如何确定提炼某个文件下某一段的代码呢?

    1. 一个好技巧:寻找注释

      • 注释可指出代码用途和实现手法之间的语义距离。若只有一行代码,还需要以注释来说明,那也值得将它提炼到独立的函数中。
    2. 遇到条件表达式和循环

      • 如在将循环和循环内的代码提炼到一个独立的函数中时遇到难以为独立的函数命名,这可能是因为这段代码其中做了几件不同的事情。若是遇到这种情况,更要进行拆分。

4. 全局数据(Global Data)?

  • 全局数据印证了帕拉塞尔斯的格言:良药与毒药的区别在于剂量。
  • 少量对的全局数据或许无妨,但随着数量增多,处理的难度就会呈指数增长。

5. 可变数据(Mutable Data)?

  • 在程序中,我们有时候修改了某一处的数据,然而却没有意识到软件中的另一处地方也在使用,或者另一处需要一个新的数据结构。

6. 发散式变化(Divergent Change)?

  • 在程序设计中,我们都希望软件能够容易被修改,毕竟软件本身就是“软”的。
  • 当我们要对某个上下文做修改时,我们只需要理解这个上下文,而不必操作另一个。
  • “每次只关心一个上下文”这一点很重要

7. 霰弹式修改(Shotgun Surgery)?

  • 霰弹式的修改类似于发散式变化,但却恰恰相反。

    7.1 何为霰弹式修改?

    • 如果当遇到某种变化,你都必须在许多不同的类中做出许多小修改,你所面临的坏味道就是霰弹式修改。

    7.2 如何对霰弹式的程序进行修改?

    1. 可使用搬移函数,将所有需要修改的代码放进同一个模块中
    2. 如果有很多函数在操作相同的是数据,可将这些函数整合成类
    3. 常用策略是使用内联相关的重构,如内联函数,内联类等等,把本不该分散的逻辑组合在一处。

8. 依恋情结(Feature Envy)?

  • 依恋情结的情况:比如一个函数跟另一个模块中的函数或数据交流很频繁。

    8.1 何为模块化?

    • 将代码分出区域,最大化区域内部的交互,最小化跨区域的交互。
  • 8.2 有时候一个函数中往往会用到几个模块中的功能,那如何处理这种依恋情结呢?

    • 可以判断哪个模块拥有的当前函数使用的数据最多,然后就可以把这个函数和数据放在一起。

9. 数据泥团(Data Clumps)?

  • 数据项像小孩子一样,喜欢成群结队待在一起。

  • 9.1 如何评判众多数据是否有价值?

    • 删掉众多数据中的一项,然后看其他数据有没有因删掉的数据项而失去存在意义,如果不再有意义,那就是一个明确的信号,你应该为他们产生一个新对象。

10. 过长的消息链(Message Chains)?

  • 何为过长的消息链?

    • 一个用户向一个对象请求另一个对象,然后再想后者请求另一个对象,然后再请求另一个对对象,循环往复。
  • 如何针对过长的消息连进行重构?

    • 先观察消息连最终得到的对象时用来干什么的,看看能否以提炼函数把使用该对象的代码提炼到一个独立的函数中,再运用搬移函数把这个函数推入到消息链中。
    • 如果还有许多客户端代码需要访问链上的其他对象,同样添加一个函数来完整此事。

11. 注释(Comments)?

  • 注释并不是一件坏事,有时候它还是一个好事。
  • 当你感觉需要编写注释时,请先尝试重构代码,试着让所有注释都变得多余。

第4章 构筑测试体系

1. 自测试代码的价值?

  • 能够确保所有测试都完全自动化,让他们检查自己的测试结果。

  • 当完成一个功能后,就开始编写测试代码可以更好的提高开发效率。

  • 一套测试就是一个强大的bug侦测器,能够大大缩减查找bug所需的时间。

  • 将测试代码的习惯提炼成一个技艺?

    • 这个技艺就是测试驱动开发(Test-Driven Development, TDD)
  • 测试驱动开发的短循环?

    • 先编写一个测试 —> 编写业务代码 —> 重构。然后这个 “测试、编码、重构” 这个循环在我们日常开发中要完成很多次。

2. 本章所讲的内容?

  • 带着你走进自测试代码世界的大门,从简单的例子开始。

第5章 介绍重构目录

1. 重构的记录格式?

  • 每个重构手法都有 5 个部分

    1. 名称(name):建构一个重构词汇名称的对应表
    2. 速写(sketch):帮助我们更快的找到所需要的手法
    3. 动机(motivation):会介绍 “为什么需要做这个重构”和 “什么情况下不该做这个重构”
    4. 做法(mechanics):如何一步一步进行重构
    5. 范例(examples):以一个简单的例子来说明此重构手法如何运作
  • 牢记重构的一点:小步前进,情况越复杂,步子就要越小


系列首发于如上图平台,文章会持续更新,欢迎大家关注~

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

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

相关文章

17.Tensor Product Spaces

同样,本文仍采用非标准 的符号。 在之前的文章里,已经展示了: 使用张量积将向量和协向量组合在一起可以为我们提供线性映射,这个线性映射的系数实际上只是一个数组的条目。 还展示了:使用张量积组合两个协向量&#x…

Linux系统之部署WBO在线协作白板

Linux系统之部署WBO在线协作白板 一、WBO白板工具介绍1.1 WBO白板简介1.2 WBO白板特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、部署Node.js环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 …

进制转换(二进制、八进制、十进制、十六进制)

目录 一:十进制转换为二进制、八进制、十六进制 (1)整数转换 (2)小数转换 1)十进制转二进制 2)十进制转八进制 3)十进制转十六进制 二:二进制、八进制、十六进制转…

数据库实验二:图书信息管理系统数据查询与数据更新

实验项目名称:图书信息管理系统数据查询与数据更新 实验目的与要求实验原理与内容1. 实验原理:2 . 实验内容:2. 数据查询 实验设备与软件环境实验过程与结果1. 数据更新图书信息表t_book新增馆藏可借图书c_book借书证表t_libraryC…

offsetof宏计算某变量相对于首地址的偏移量

宏:offsetof的使用 //offsetof (type,member) //type是结构体的类型名,member是结构体中的成员名。struct Student {char name[5]; // 姓名int age; // 年龄float score; // 成绩 };int main() {struct Student s;printf("%zd\n", off…

MyBatis Generator - 快速生成 实体类 和 映射文件

目录 一、MyBatis Generator 的使用 1.1、生成类和映射文件 1.1.1、在 pom.xml 中引入依赖 1.1.2、根据 configurationFile 标签中配置的路径 创建 generatorConfig.xml 文件 1.1.3、自动生成类 和 映射文件 1.1.4、在 Insert 标签中添加获取主键值的选项 1.1.5、扫描配置…

Linux完全卸载PyTorch重装(cuda11.1)

目录 1.命令行输入2.命令行接着输入3.可以看到卸载完后4.下载PyTorch(cuda对应11.1,可以通过test_gpu.py的测试) 原因:网上看的很多卸载的,并没有把所有跟随PyTorch的包卸载干净,虽然可能后期不会出现较大问…

【计算机操作系统慕课版】第二章课后习题笔记(创作周年纪念版)

一、简答题 (1)什么是前趋图?试画出下面四条语句的前趋图. S1:axy; S2:bz1; S3:ca-b; S4:wc1; 答:前趋图(Precedence Graph)是一个有向无循环图&#xff…

我朋友软件测试月薪5w,跟他聊过之后,才知道差距在哪里!

当我开始工作的时候,年薪50万对于我来说是一个遥不可及的幻想。我认为作为一名普通的软件测试工程师,月薪2w已经是天花板了。然而随着时间的推移和经验的积累,看到越来越多的同行拿到高薪时,我才意识到束缚我薪水的不是行业的天花…

集合迭代器

Iterator迭代器的定义:迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义是,提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该…

山西电力市场日前价格预测【2023-10-23】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-23)山西电力市场全天平均日前电价为232.21元/MWh。其中,最高日前电价为383.23元/MWh,预计出现在18: 30。最低日前电价为0.00元/MWh,预计出…

01、Python 的数据类型

目录 数据类型Python变量具有如下两个特征:输出变量 标识符规则整型四种表示形式浮点数复数 数据类型 使用Python变量 Python的基础类型 Python变量具有如下两个特征: 变量无需声明即可直接赋值:对一个不存在的变量赋值就相当于定义了一个…

十四天学会C++之第九天:内存管理

1. new和delete运算符 new运算符:动态分配内存。delete运算符:释放动态分配的内存。 new运算符:动态分配内存 new运算符的作用是在堆内存中动态分配内存块,并返回指向该内存块的指针。这使得我们能够在程序运行时创建变量&…

短视频如何批量添加水印?实用技巧带你飞

在当今的数字时代,短视频已经成为一种非常流行的内容形式。无论是社交媒体还是视频分享网站,短视频都已经成为了一种非常有吸引力的内容。然而,对于一些拥有大量视频内容的创作者来说,添加水印可能是一项繁琐的任务。本文将介绍如…

沙箱对抗之反沙箱技巧

前言 我们经常会在红蓝对抗中遇到这种场景,离线免杀,但是10分钟又被杀,这就是云查杀的威力,而云查杀可以分为下列两种: 1.静态分析 2.动态分析 静态分析就是分析样本的结构,导入表,等等来判定是否是恶意程…

C语言实现顺序表(图解增删查改+代码)

文章目录 写在前面1. 顺序表的初始化和销毁1.1 顺序表的初始化(SLInit)1.2 顺序表的销毁(SLDestroy) 2. 插入数据2.1 尾插数据(SLPushBack)2.2 头插数据(SLPushFront)2.3 指定位置插入数据(SLInsert) 3. 删除数据3.1 尾删数据(SLPopBack)3.2 头删数据(SLPopFront)3.3 删除指定位…

DDR3笔记 频率配置

可参考 基于FPGA的DDR3设计(2)DDR3各时钟频率及带宽分析 - 知乎 (zhihu.com) DDR3的时钟频率配置要看两个手册: 1.DDR3器件的手册。 2.开发板芯片的手册 器件 器件名称:MT41J128M16JT-125:K tCK 1.25ns,就可以算出…

冒泡排序应用过程中遇到的问题

冒泡排序思想&#xff1a;相邻的两个数据两两比较&#xff0c;然后按顺序排出 代码展示1&#xff1a; #include<stdio.h>void sort(int arr1[],int sz) {for (int i 0; i < sz-1; i){for (int j i1; j < sz; j){if (arr1[i] > arr1[j]) {int temp 0;temp a…

Wordpress - Xydown独立下载页面插件

Wordpress - Xydown独立下载页面插件&#xff1b; 1.使用ftp将demo.php和download.php上传到网站根目录&#xff08;两个文件中设计网站信息的代码可根据实际情况修改为自己的信息&#xff09; 使用ftp将demo.php和download.php上传到网站根目录&#xff08;两个文件中设计…

消息服务MNS之初见

消息服务MNS 说到消息服务MNS&#xff0c;那么消息服务MNS是什么呢&#xff1f;为什么会有消息服务MNS这款产品的产生呢&#xff1f; 什么是消息服务MNS 消息服务-阿里云消息服务MNS&#xff08;Message Service&#xff09;是一种高效、可靠、安全、便捷和可弹性扩展的分布…