cststudio / csthinking

一些思路,一些想法,一些实验。随意提提,随意想想,随意看看,不做决策。
0 stars 0 forks source link

重构 读书笔记 #14

Open latelee opened 3 years ago

latelee commented 3 years ago

《重构:改善既有代码的设计》第2版 原版书箱彩色印刷。出现重构方法名称时,后带有数字,表示该种方法出现在书本的第几页。如:提炼函数(106)-在106页、内联函数(115)——在115页。

加功能时:不修改代码结构。——以保证与原先结构一致。   重构时:不新加功能。——以保证无新功能。  (注:必要时例外) 

在实操中,可以随时变化角色。

消除重复代码,重复代码并不会让系统更快运行,但能减少人的维护工作量。有多处代码,修改时,需修改多处,如有一处未改,就可能达不到预期。  

Kent Beck 经常形容自己的一句话:“我不是一个特别好的程序员,我只是一个有着一些特别好的习惯的还不错的程序员。”

补充:个人编码: 有些变量,直接用tmp1、tmp2、tmp3表示,经典示例:C++中执行sql语句返回的值,使用tmp1表示第一列返回的结果。

latelee commented 3 years ago

重构时机:
专门抽时间重构。
在编码过程中重构,注意,只能是小范围或耗时较少时,否则影响进度。
项目较大时,如果暂不涉及到的模块,没必要去重构,只重构与当前任务有关的。

重构时,要注重测试,完成一个方面的重构,要测试。不能积累太久。

latelee commented 3 years ago

重构细则之我见。不照抄,加自己的理解,精简描述。

第六章的

1、提炼函数 将常用的语句,封装为函数,只保留一处。如有部分函数或步骤不同,也可尽量封装,如加参数,用参数做标志判断。以最大并集为原则。也可一层函数一层函数包装。 修改维护容易,结构清晰。 好像也可叫封装函数。

2、 内联函数 有些函数没必须层层封装,则可去掉函数,直接使用里面的语句,这样更直观易懂,方便维护。因为多一层封装,多一层麻烦,还不如直接用原来的语句。有些代码为了封装而封装,没必要。

3、内联变量 与内联函数类似。如驱动寄存器的赋值,使用数字移位可能更直观,则可用之。

4、提炼变量 适用场景:计算复杂的,把不同的计算结果,赋值变量,再用变量做运算,方便阅读理解。官方的示例是基础费用、折扣费用、运费的计算。

5、改变函数声明/函数改名 即修改函数名,让其更准确表达函数含义。可逐步更改(迁移式),保留原有名字,先一个新的函数名,标记原有名字为过时/即将删除(deprecated)。等待测试没问题后,删除旧名字。实际中似乎直接改名来得更快。

6、封装变量 将变量的设置、获取使用函数封装起来。好像可与1对应起来。

7、变量改名 与改变函数声明类似。有的代码命名不规范,容易引起误解。不好的示例:foo(PathFit TradingInfo, calc::TradingInfo transInfo)。前一变量名与后一变量类型名称上无法区分清楚。

8、引入参数对象 如果函数参数太多,则将函数做成结构体,再传递,参数数量少一些。注:实际中遇到反例,不同结构体,其内部有很多字段相同,要判断字段合法性,则将不同字段一一做成参数。(本为设计问题,但已有项目在使用,无法大改)

9、函数组合成类 将有相同参数的函数,组成一个类,使用该类来操作。也可以不带参数。功能上可相近,或不同(大类相同)。如:板子上只有一个相机,则将所有操作相机的函数,封装成一个相机控制类,做成全局唯一对象(可用单例模式)。

10、函数组合成变换 将相同参数(参数一般为类)的函数封装到一个大函数中,在大函数中对参数做一些处理,再返回参数。(注:表达还不够明确,待改)

11、拆分阶段 一个函数做不同的事(分阶段做不同的事),拆分为不同函数。似乎对应到单一职责原则。
示例:
代码片功能:A1 A2 B A3 C1 C2
解释:A1-A3逻辑上类似,但可以分开执行,也可以在一起执行。
重构后:A1 A2 A3 B C1 C2 再重构:A(含A1-A3) B C(含C1 C2)