读书笔记:改善既有代码的设计

news2024/9/20 22:43:17

差不多两年都没写过博客了,好学的习惯差不多都落下了,两年里几乎也把学到的很多东西都应用了,但不学习好像就有点停步不前的感觉了,以后给自己定个目标每周写一遍博客。
写博客好处:
一是加深自己的印象(能够写出来的东西比光光自己理解的东西要理解的深的多),
二是督促自己学习,
三是也是希望让其他人对我有个认识知道我会什么,
四是也是希望自己的分享能够帮助到一些人,

两年前因为自己的编码习惯和一些沟通相关的事情不是很好被广州一家大厂的引擎组嫌弃,于是就不断看设计模式代码的重构等等
最近又因为种种事情被人际关系和沟通烦的要死,也在看人性的弱点非暴力沟通
希望自己还是能够往上走一下,也算是缓解自己的焦虑,最近也要结婚买房,毕竟没房子孩子上学也没那么方便,就先分享之前看的关于代码重构的一本书改善既有代码的设计
在这里插入图片描述

1.重构原则

1.何为重构(what):对软件内部结构的一种调整,目的是在不改变软件可观察的前提下,提高其可理解性,降低其修改成本
2.为何重构(why):改进软件设计,使软件更容易理解,帮助找到bug,提高编程速度
3.怎么重构(how)
重复的事不过三,三则重构
添加功能时重构
修复错误时重构
复审代码时重构
4.何时不该重构:重构是为了写出更好的代码,提高以后的扩展性,可读性
但是如果已经是项目后期了 都不会新增需求的情况下,重构是没必要的
5.怎么让别人理解重构:可以减少代码的出错概率,提升速度,提高可读性,提高扩展性

2.代码的坏味道

1.Duplicated Code (重复代码)
2.Long Method (过长函数)
3.Large Class (过大的类)
4.Long Parameter List (过长的参数列)
5.Divergent Change (发散式变化):一个类受多种变化的影响
6.Shotgun Surgery (霰弹式修改) :一种变化导致多个类的修改
7.Feature Envy (依恋情结 ):一个类的对象函数依赖太多其他类型的对象 应该移动到另一个地方去 另一个类或者独立的类里去
8.Data Clumps (数据泥团) :太多地方都出现了几项一样的数据 应该组成一个对象
9.Primitive Obsession (基本类型偏执): 明明应该以对象表现的 却觉得没必要用两个小的数据类型组成 对象 像:由起始值和结束值组成的range类
10.Data Class (幼稚的数据类):应该有足够好的封装 防止数据被莫名其妙修改 数据的修改查找在多于3次后应该分类

3.重新组织函数

1.Extract Method 提取函数:函数的复用,函数起到的注释作用,函数的重写更简单
2.Replace Temp with Query 用查询代替临时变量
3.Replace Conditional with Polymorphism 用多态替换条件
4.Substitute Algorithm 替换算法
5.函数对象取代函数
6.替换算法:也许有更简单的算法实现某个需求

4.在对象之间搬移特性

1.Move Method 移动函数:某个函数被另一个类更多的用到
2.Move Field 移动字段:某个字段被另一个类更多的用到
3.Extract Class 某个类做了应该由两个类做的事
4.Inline Class 将类内联化:某个类没有做太多事情,将这个类的所有特性搬到另一个类中,然后移除原类
5.Remove Middle Man 移除中间人:某个类做了太多的简单委托动作,让客户直接调用
6.Introduce Local Extension 引入本地扩展:你需要为服务类提供一些额外函数,但你无法修改这个类

5.简化函数调用

__1.Separate Query from Modifier (将查询函数和修改函数分离) 明确的将修改对象和查询对象分开来 可以清楚的看到在哪修改的 不然对象的引用太多会影响查看修改的逻辑
2.Remame Method (函数改名) 函数的名称未能揭示函数的用途
3.Add Parameter (添加参数) 为此函数添加一个对象参数,让该对象带进函数所需信息
4.Remove Parameter (移除参数) 函数本体不再需要某个参数
5.Replace Parameter with Explicit Methods 你有一个函数,其中完全取决于参数值而采取不同行为
6.Preserve Whole Object (保持对象完整) 你从对象取出多个值,将它们做为某一个函数调用的参数 缺点:引用类型的依赖度加高
7.Replace Parameter with Methods(用函数取代参数)
对象调用某个函数 并将所得结果作为参数 传递给另一个函数
而接收函数本身能直接调用前一个函数,让接收者直接调用前一个函数以去掉多余的参数传递
8.Introduce Parameter Object(引入参数对象)
某几个参数总是一起出现,就应该建立一个对象取代这些参数
9.Remove Setting Method (移除设值函数):某个字段 就应该在对象被创建时被设值,然后就不再改变
10.Hide Methid (隐藏函数) 有一个函数,从来没有被其他类用到
11.Replace Error Code with Exception(以异常取代错误码)

6.大型重构

1.Tease Apart Inheritance (梳理并分解继承体系):某个继承体系同时承担两项责任
解决:建立两个继承体系,通过委托关系让其中一个调用另一个

2.MVC:很重要可以说是现在的基本框架了

3.Extract Hierarchy (提炼继承体系)
你有一个类做了太多工作,其中一部分工作是以大量条件表达式完成的

解决:1.建立继承体系,以一个子类表示一种特殊情况
2.用策略和状态模式处理

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

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

相关文章

幽微之处见真章:数据类型与内存存储的内在联系

嘿嘿,家人们,今天咱们来深度剖析数据类型在内存中的存储,好啦,废话多不讲,开干! 1.:数据类型介绍 在前面呢,博主已经介绍了基本的数据类型: char //字符数据类型 ---->占据1个字节 short //短整型 …

51单片机STC89C52RC——18.1 HC-SR04超声波测距

目的/效果 独立按键K1按下后开始测距,LCD显示距离(mm) 一,STC单片机模块 二,HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。 2.2 时序 以上时序图表明…

前端面试题(JS篇五)

一、同步与异步的区别 同步指的是当一个进程在执行某一个请求的时候,如果这个请求需要等待一段时间才能返回,那么这个进程会一直等待下去,直到这个消息返回之后才会继续执行。 指的是当一个进程在执行某一个请求的时候,如果这个请…

Leetcode 1302.层数最深子叶结点的和

大家好,今天我给大家分享一下我关于这个题的想法,我这个题过程比较复杂,但大家如果觉得好的话,就请给个免费的赞吧,谢谢了^ _ ^ 1.题目要求: 给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的…

初学者如何通过建立个人博客盈利

建立个人博客不仅能让你在网上表达自己,还能与他人建立联系。通过博客,可以创建自己的空间,分享想法和故事,并与有相似兴趣和经历的人交流。 本文将向你展示如何通过建立个人博客来实现盈利。你将学习如何选择博客主题、挑选合适…

【华为OD笔试】2024D卷命题规律解读【分析300+场OD笔试考点总结】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过) 文章目录 相关推荐阅读华为OD笔试2024D卷命题规律解读华为OD算法/大厂面试高频题算法练习冲刺训练 相关推荐阅读 【华为OD笔试】2024D卷机考套题…

Android Framework学习笔记(4)----Zygote进程

Zygote的启动流程 Init进程启动后,会加载并执行init.rc文件。该.rc文件中,就包含启动Zygote进程的Action。详见“RC文件解析”章节。 根据Zygote对应的RC文件,可知Zygote进程是由/system/bin/app_process程序来创建的。 app_process大致处…

LLM 的储备知识

GPT一代 模型堆叠了12个解码器层。由于在这种设置中没有编码器,这些解码器层将不会有普通transformer解码器层所具有的编码器-解码器注意力子层。但是,它仍具有自注意力层。 训练过程 Transformer Decoder 结构 编码器(6 layers&#xff09…

Template_C++

C模板 C提供了function template. function template:实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用的函数就称为函数模版。 是不是可以这样理解,函数模版就是给了一种功能&…

Linux 下 ElasticSearch 集群部署

目录 1. ElasticSearch下载 2. 环境准备 3. ElasticSearch部署 3.1 修改系统配置 3.2 开放端口 3.3 安装 ElasticSearch 4. 验证 本文将以三台服务器为例,介绍在 linux 系统下ElasticSearch的部署方式。 1. ElasticSearch下载 下载地址:Past Rel…

vue 如何做一个动态的 BreadCrumb 组件,el-breadcrumb ElementUI

vue 如何做一个动态的 BreadCrumb 组件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定义 elementUI 中的 Breadcrumb 组件是这样定义的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理&#xff1a;实现方法&#xff1a;性能考虑&#xff1a; 模拟过程splice函数对于std::list和std::forward_list基本语法&#xff1a;功能描述&#xff1a; 示例&#xff1a;注意事项&#xff1a; 如果大家已经学习过了Cache的替换算法和…

《人性的弱点》

This book is called ‘How to Win Friends & Influence People’. [COPY] 卡耐基《人性的弱点》有什么干货么&#xff1f;

自学鸿蒙HarmonyOS的ArkTS语言<十>@BuilderParam装饰器

作用&#xff1a;当子组件多处使用时&#xff0c;给某处的子组件添加特定功能 一、初始化 1、只能被Builder装饰的方法初始化 2、使用所属自定义组件的builder方法初始化 3、使用父组件的builder方法初始化 - 把父组件的builder传过去&#xff0c;参数名和子组件的builderPar…

【信号频率估计】MVDR算法及MATLAB仿真

目录 一、MVDR算法1.1 简介1.2 原理1.3 特点1.3.1 优点1.3.2 缺点 二、算法应用实例2.1 信号的频率估计2.2 MATLAB仿真代码 三、参考文献 一、MVDR算法 1.1 简介 最小方差无失真响应&#xff08;Mininum Variance Distortionless Response&#xff0c;MVDR&#xff09;算法最…

AI初学者的利器——香橙派AIpro

目录 引言香橙派介绍公司简介&#xff08;来自官网&#xff09;香橙派AIpro介绍香橙派AIPro硬件规格参数开发板接口详情系统登陆与使用指示灯 AI运行实例AI CPU和control CPU的设置方法香橙派AIpro cpu知识查询AIcpu占用率与cpu类别设置 Juypter lab使用JuypterLab介绍JuypterL…

8款可以替代Axure的设计软件推荐

一个好的原型设计工具对于产品经理或者UI/UX设计师来说非常重要。一个好的原型设计软件可以帮助你快速构建一个还原度高、信息结构清晰的原型图&#xff0c;也可以大大降低工作中与同事的沟通成本&#xff0c;更高效地推进工作。 那么&#xff0c;什么是易于使用和免费的原型设…

C51语言及通用I/O口应用

4.1 C51的程序结构 4.2 C51的数据结构 4.3 C51与汇编的混合编程 4.4 C51仿真开发方法 4.5 通用I/O口的简单应用 4.6 通用I/O口的进阶应用 4.1.1 C51语言概述 C51语言是51单片机的一种高级编程语言&#xff0c;与低级语言的汇编语言相比&#xff0c;一方面具有结构化语…

Chapter12 屏幕后处理效果——Shader入门精要学习笔记

Chapter12 屏幕后处理效果 一、屏幕后处理概述以及基本脚本系统1.OnRenderImage 函数 —— 获取屏幕图像2.Graphics.Blit 函数 —— 使用特定的Shader处理3.在Unity中实现屏幕后处理的基本流程4.屏幕后处理基类 二、调整亮度、饱和度和对比度1.BrightnessSaturationAndContrast…

Postman安装使用教程(详解)

目录 一、Postman是什么 二、安装系统要求 三、下载Postman 四、注册和登录Postman 五、创建工作空间 六、创建请求 一、Postman是什么 在安装之前&#xff0c;让我们先来简单了解一下Postman。Postman是一个流行的API开发工具&#xff0c;它提供了友好的用户界面用于发送…