《重构》读书笔记(一)

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定 本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。 阅读详情
前几天,从同事那里借来Matin Fowler的《重构》一书,看得我很是过瘾。尽管看后印象颇深,但要作到过目不忘是不可能的,故将书中自己认为重要的东西记录下来。俗话说的好:好记性不如烂笔头。

注:很多直观的重构方法没有做解释,从其名字就可以猜出其用法。


重新组织你的函数
==========================================================

1.Extract Method
2.Inline Method
3.Inline Temp
4.Replace Temp with Query

临时变量的问题在于:它们是暂时的,只能在函数内部使用,这驱使你写出更长的函数,
因为只有这样你才能访问到你要访问的临时变量。如果采用该方法,那么同一个Class中
的所有函数都可以获得这份信息。这将给你极大的帮助,使你能够为这个Class编写更清
晰的代码。
将只被赋值一次的临时变量的赋值操作提炼到独立函数中,然后在该临时变量上实施
Inline Temp.

例:
// 原函数
double getPrice(){
int basePrice = _quatity * _itemPrice;
double discountFactor;
if (basePrice > 1000) discountFactor = 0.95;
else discountFactor = 0.98;
return basePrice * discountFactor;
}

// 替换basePrice
double getPrice(){
double dicountFactor;
if (basePrice() > 1000) discountFactor = 0.95;
else discountFactor = 0.98;
return basePrice() * discountFactor;
}

int basePrice(){
return _quatity * _itemPrice;
}

// 替换discountFactor
double getPrice(){
return basePrice() * discountFactor();
}

int basePrice(){
return _quatity * _itemPrice;
}

double discountFactor(){
if (basePrice() > 1000) return 0.95; // 从上次替换中获得好处
else return 0.98;
}


5.Introduce Explaining Variable
6.Split Temperary Variable
7.Remove Assignments to Parameters
不要对参数赋值
8.Replace Method with Method Object
将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field)。
然后你可以在同一个对象中将这个大型函数分解为小型函数。
9.Substitue Algorithm
替换你的算法


在对象之间搬移特性
==========================================================

1.Move Method
在你的程序中,有个函数与其所在class之外的另一个class进行更多交流:调用后者,
或被后者调用。
减小类之间的耦合。

步骤:
考虑source class定义的source method所使用的一切特性是否也应该搬移。
如果source class的subclass和superclass有其声明,或许无法搬移,除非
target class也同样表现出多态性。
在target class中新建函数,然后将source method的代码复制到target method
决定如何从source正确引用target object。
修改source method,使之成为一个delegating method。
决定是否删除source method,看是否方便。
如果删除,则将对source method的调用替换为对targetobject.targetmethod的
调用。

2.Move Field
3.Extract Class
4.Inline Class
5.Hide Delegate
将调用Server.delegate.someMethod()变为Server.someMethod()。
去除调用方对Server.delegate的依赖。
6.Remove Middle Man
7.Introduce Foreign Method
时机:你所使用的server class需要一个额外函数,但你无法修改这个class。
如果你发现自己已经为server class建立了大量的外加函数,或有许多class都需要
同样的外加函数,你就不应该使用本方法,而应该使用Introduce Local Extesion。
步骤:
在client class中建立一个函数,用来提供你的功能。该函数不应该去用client class
的任何特性,如果需要一个值,就将其当作参数传给它。
以server class实体为该函数的第一个参数。
将该函数注释为:外加函数,应在server class实现。

8.Introduce Local Extension
时机:见7.Introduce Foreign Method
方法:建立新类,其中包括那些额外函数,使该类成为source class的subclass或wrapper。



重新组织数据
==========================================================

1.Self Encapsulate Field
封装的好处:subclass可以通过覆写读取、写入函数来改变数据读取、写入的逻辑方式
不封装的好处:简单
2.Replace Data Value with Object
比如说:一开始你会用字符串来表示『电话号码』这个概念,但随后你会发现,电话号码需要『格式化』、
『抽取区号』之类的特殊行为。如果这样的数据项只有一二个,你还可以把相关函数放进数据项所属的对象
里头;但是Duplicate Code臭味和Feature Envy臭味很快就会从代码中散发出来。当这些臭味开始出现,
你就应该将数据值变成对象。
3.Change Value to Reference
将这个value object(实值对象)变成一个Reference object(引用对象)
4.Change Reference to Value
5.Replace Array with Object
6.Duplicate Observed Data
重复的意思:界面类中有的数据,逻辑类也有相同的数据。
其中运用了Observer模式来同步界面类和逻辑类的数据。
可以用于界面与逻辑分开。

需要进一步研究
7.Change Unidirectional Association to Bidirectional
8.Change Bidirectional Association to Unidirectional
9.Replace Magic Number with Symbolic Constant
10.Encapsulate Field
11.Encapsulate Collection
12.Replace Record with DataClass
13.Replace Type Code with Class
枚举型数据的替代方案

class BloodGroup{ // 血型
public static final BloodGroup O = new BloodGroup(0);
public static final BloodGroup A = new BloodGroup(1);
public static final BloodGroup B = new BloodGroup(2);
public static final BloodGroup AB = new BloodGroup(3);

private final int _code;
private BloodGroup(int code){
_code = code;
}

}

14.Replace Type Code with Subclasses
你有一个不变的type code,它会影响class的行为。
类似于状态处理机模式

15.Replace Type Code with State/Strategy
你有一个type code,它会影响class的行为,但你无法使用subclassing.
比如:type code 在对象生命周期中发生变化。
state object对应的Field可以替换成其他state object
16.Replace Subclass with Fields


简化条件表达式
==========================================================

1.Decompose Conditional(分解条件式)
将其分解成多个独立函数
2.Consolidate Conditional Expression(合并条件式)
合并不必单独存在的条件式
3.Consolidate Duplicate Conditional Fragments(合并重复的条件片断)
在条件式的每个分支上有着相同的一段代码。进行该重构,可以更好的表明那些东西
随条件的变化而变化。
4.Remove Control Flag
循环语句中,最好用Break或Exit取代控制标记(用来判断是否继续循环)
5.Replace Nested Conditional with Guard Clauses
以卫语句取代嵌套条件式
函数中的条件式使人难以看清正常的执行路径。
给某一条分支以特别的重视。
条件式通常有两种形式:一是所有分支都是正常行为;二是只有一种是正常行为,其他
都是不常见的情况。
卫语句最好返回一个明确值,以便看得更清楚。

// 原代码
double getPayAmount(){
double result;
if (_isDead) result = deadAmout();
else {
if (_isSeparated) result = separatedAmount();
else {
if (_isRetired) result = retiredAmount();
else result = normalPayAmount();
}
}
}

// 新代码
double getPayAmount(){
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
}

6.Replace Conditional with Polymorphism
以多态取代条件式
多态最根本的好处是:如果你需要根据对象的不同型别而采取不同的行为,多态使你不必编写
明显的条件式。
7.Introduce Null Object
将null value替换为null object

比如想显示一个Persion对象信息,它大约有20个instance变量。如果这些变量可被设为null,
那么打印一个Person对象的工作将非常复杂。如果将null value换成null object(他们都知道如
何正常地显示自己),Person类就可以减少很多代码。

比Null Object模式更大的模式:Specail Case模式。

步骤:
1.为source class建立一个subclass,其行为像source class的null版本。在source class
和subclass中都加上isNull()函数,前者返回false, 后者返回true。
2.找出所有取得source object却取得null的地方。修改它,使其获得null object。
3.找出所有『将source object与null比较』的地方,使他们调用isNull()函数。
4.找出这样的程序点:如果对象不是null, 做A动作,否则做B动作。
5.对于每一个这样的地方,在null class中覆写A动作,使其行为和B动作相同。
6.删除isNull()的条件判断。

8.Introduce Assertion
以断言明确表现这种假设。
苏宁易购手机行情比价系统:构建一个完整的Python爬虫实战指南 在当今数字化时代,智能手机已成为人们生活中不可或缺的一部分。随着各大手机品牌每年推出多款新品,消费者面临着越来越多的选择。然而,不同电商平台、不同时间段的价格波动使得消费者很难把握最佳购买时机。苏宁易购作为国内领先的电商平台之一,拥有丰富的手机商品信息和价格数据。本文将带领读者构建一个完整的苏宁易购手机行情比价系统,帮助消费者实时掌握手机价格动态。 阅读详情

相关推荐

【论文笔记】Beyond Low-frequency Information in Graph Convolutional Networks

文章目录1. Abstract2. Introduction低频和高频信号作用FAGCN怎么设计3. An Experimental Investigation4. Model4.1 filter定义4.2 Aggregation4.3 Problems of signal combination4.4 Spatial vision of FAGCN4.5 系数αijG\alpha_{i j}^{G}αijG​4.6 模型整体框架FAGCN的表达能力实验 本文发表在AAAI-21上 论文地址:https:

Running Snail 5602

《重构》读书笔记一

一、重构之前一定要对原有代码有一套可靠的测试机制,并且测试要有自我检测能力。   第六章主要是讲的最简单的重构方法,就是对函数的重构。重构的目的就是要让函数更容易理解,思路更清晰。个人觉得重构的目的主要是针对开发者,能让维护者更容易理解而已。对函数的效率没有太多帮助,用作者的话来说就是应该放到优化中去做。有了易理解的函数,清晰的思路,优化起来那是事半功倍!   几个比较重要的重构的小方法:

IT江湖的刀光剑影 1086

STM32cube HAL库两条命令实现i2c通信---Nucleo L476RG用I2C实现tmp117模块温度读取并串口打印

Getting Started with STM32 - I2C Example

m0_54706625的博客 1832

《代码重构》读书笔记(一)

一、简单认识重构 1.认识重构的概念 重构是一种非常重要的技术,越复杂的系统越是需要不停地进行不同规模上的重构; 什么时候我们需要重构:当我们打算修改系统或者添加优化需求时,结构较差的系统很难修改,因为很难找到一个合适的修改点和扩展点;比如,我们可能需要在很多处都进行一致性修改,我们可能有一个很复杂的函数以至于当我们扩展时就只能复制粘贴冲i性能创建一个函数来满足需求;所以,如果发现自己需要为...

mozhi 508

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 403

自定义css属性实现渐变边框动画

自定义cs属性实现渐变边框动画

lemon的博客 1875

大话重构读书笔记——基础篇一

重构:改变既有代码的一剂良药 1.什么是系统重构? 它是一套严谨而安全的过程方法,它通过一系列行之有效的方法与措施,保证软件在优化的同时,不会引入新的bug,保证软件改造的质量。 2.系统重构的概念 系统重构,就是在不改变软件的外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。 3. 如何保证重构是安全的、可靠的、没有风险的? 系统重构,对于客...

254

灰度重心法实战:从原理到MATLAB代码实现激光条纹中心线提取

本文详细介绍了激光条纹中心线提取的核心方法——灰度重心法。通过物理类比阐释其原理,并提供从图像预处理到MATLAB代码实现的完整实战教程。文章重点解析了算法流程、关键参数调整及常见问题避坑指南,帮助读者快速掌握这一机器视觉与三维测量中的基础且高效的技术。

cake8的博客 462

小强的重构读书笔记(一)

一、 What is 重构? 名词:对软件内部结构的一种调整。 动词:对软件内部结构进行调整。 二、 Why 重构? 1. 改进软件设计 代码结构在累积性的后续开发被破坏,不同的人不同的风格。重构保持身材。 减少重复。 2. 使软件更容易理解 有意义的变量、方法命名。 抽取公共的方法,删除重复冗余的代码,明确的调用路径,在代码阅读上更易理解。 3. 提高编程速度 重构带来良好的设计,良好的设计才能...

qq_39722475的博客 365

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 518

《重构,改善既有代码的设计》读书笔记一:初识重构

一、何为重构? 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 二、重构有哪些好处? 1、改进软件设计 如果没有重构,程序的设计会逐步腐败变质。随着软件功能的增加,很多开发人员在未完全理解软件的整体设计之前便动手写代码,程序将逐渐失去自己的结构,开发人员越来越难以通过阅读代码而理解原来的设计。重构很像是在整理代码,让所有的代码回到它应该的位置,经常性的重构可以帮助代码维持自己该有的形态。 完成同一件事,设计不良的程序往往需要更多的...

zjl_pcw的博客 466

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【读书笔记】从零开始了解重构(一)

重构读书笔记

Rain_Mic的博客 1269

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大话重构读书笔记——进阶篇一

什么时候重构? 重构是一种习惯,一种编程习惯。这种习惯让我们迅速由菜鸟转变为大牛,可以编写出高质量、优秀的程序。 问题的关键就是降低修改成本与风险的方法,而这个方法就是系统重构。 走出重构的第一步对每一个人来说都是一次心灵的考验,甚至许多人总是徘徊于路口踌躇不前,但一旦跨出去了,它将成为你生命的一部分。 没有经过重构的,原生态的代码是没办法复用的,当我们发现代码需要复用时,切忌不...

173

《重构》读书笔记(一)——序言

《重构——改善既有代码的设计》(以下简称《重构》)。 这本书有三个序言,《重构的重新认识》(再版序),《重构的生活方式》(译序),《序》。嚇!NB书就是NB书啊,序言都这么多。   一、《重构的重新认识》(再版序)----译者熊节       再版序,顾名思义,就是再一次出版,嗨,看来这书还真是名不副实啊,估计只有书好,买的人才多,才能再版吧。看来这书买对了,^-^       在《重构的

e5Max的专栏 1504

《重构》读书笔记(一)

关于重构 1.如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地那么做,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性。 2.重构之前,首先检查自己是否有一套可靠的测试机制。这些测试必须有有自我检验(self-cheking)能力。 3.重构技术系以微小的步伐修改程序。如果你犯下错误,很容易便可发现它。 重构的定义        对软件内部结构的一种调

arcticant的专栏 434

《重构 改善代码既有设计》读书笔记(一)

即使只提取出一行,即使调用这个函数比实现函数本身代码还要多,只要函数名能解释其用途,就应该毫不犹豫的重构。面向对象较之面向过程的一个好处是,面向过程的函数上下文只能通过参数和全局变量传递,过多的全局变量和参数列表都会使程序变得晦涩难懂;重构不是一件应该特别拨出时间注意的事情,重构应该随时随地进行,不应该为了重构而重构,重构的目的应该是帮助自己把要做的事做好。一个类是否可能发生发散式变化,在设计阶段往往是难以分辨的,只有在真正发生变化时才能意识到,然后你就需要重构,运用。将尽可能多的逻辑在类的内部闭环。

cques的博客 757

重构读书笔记(一)

重构与设计:重构一书提到重构与设计的关系,讲到的一个场景就是,作者早年编程,总是混混额额的开始编码,很快就发现事先做好设计可以节省很多返工的工作量,于是又有意识的加强“预先设计”风格。 这不正是目前国人的写照吗,国人往往吃了没有设计的亏后,就过分强调设计,特别在大项目大企业更是如此,其实还是处于软件开发的初级阶段,是走了另一个极端。 有观点认为,特别是极限编程认为,完全靠重构也可以达到设...

weixin_30267697的博客 128

关于代码重构的 读书笔记 (一)

AgileJava 读书笔记 (一)AgileJava是一本基于测试驱动开发的方法帮助你学会如何雕琢你的Java代码,从而得到稳定的面向对象设计和高可维护、高质量的系统。全书以一个学生管理系统为例子,一步一步教你如何设计你的系统,编写出高质量的代码,重构已有的代码等。 下面是我对本书学习的跟踪记录: 1 需要的软件 IDE或者程序编辑器   IDE:Eclipse、Myeclipse、Borlan...

BingFire的博客 249

重构-改善既有代码的设计 读书笔记一

影片出租店的程序:计算每位顾客的消费金额并打印详单。操作者告诉程序:顾客租了哪些影片,租期多长。程序根据租赁时间和影片类型计算费用。影片分为3类:普通片,儿童片,新片。除了计算费用还要为常客计算积分,积分根据组片种类是否为新片而不同。Movie(movieKind, name)Rent(影片名称,租赁时间)RentTotal(Rent列表)阶段1:从statement()到htmlSta...

diaopitian0181的博客 255

《重构:改善既有代码的设计》读书笔记(一)

各位程序老司机对重构肯定不会陌生,程序员的工作离不开重构。那么重构是已经“飞入寻常百姓家”的普通技术能力,还是看起来高大上的杀器? 对于一项技术你并不是天生就会而是需要持续学习的,很多人对重构的认识停留在 DevTools 自带的 Refactor 工具和搜索引擎出来的几篇文章,但是这样得到的知识并不够完善和系统。所以当指点江山、慷慨激昂的重...

cpongo5 503

《重构 改善既有代码的设计》读书笔记一

重构原则

不务正业的野猴子 945
下一篇: 《重构》读书笔记(二)
aaafei
博客等级 码龄24年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值