文档章节

重构-改善既有代码的设计-重新组织函数

梦想游戏人
 梦想游戏人
发布于 2016/05/16 08:37
字数 894
阅读 36
收藏 1

重新组织函数(函数相关的重构手法)

 

1.Extract Method(提炼函数)(过长的函数或者需要注释才能让人理解用途的代码,那么就该提炼出来放到一个独立的函数里面)

做法:

1.创造一个新函数,根据这个函数的意图来命名

2.把提炼出来的代码拷贝到新函数里面

3.仔细检查提炼出来的代码,看看其中是否引用了“作用于限制于原函数”的变量,包括局部变量和原函数参数

4.检查是否有“仅作用于被提炼代码段的临时变量,如果有 那么在目标函数中申明为临时变量”

5.吧被提炼代码中需要读取的临时变量,当做参数传给目标函数

6.在原函数中,被提炼出来的代码段 替换为 对目标函数的调用

7.检查被提炼代码段,是否有个局部变量被修改了,如果被修改了看看是否可以处理为一个查询,如果不能,那么就不能原封不动的提炼代码了,参考Split Temporary Variable 然后在提炼,或者用Replace Temp With Query 吧临时变量消灭,再提炼

 

2. Inline Method(内联函数)(有一种情况是该函数没有必要成为一个独立的函数,还有一种情况是如果委托太多,有时候就需要内联了)

做法:

1.确定不具备多态性,找出所有的调用者,把函数被替换为内联

3.Inline Temp(内联临时变量)(有些临时变量是多余的,那么删掉吧)

4.Replace Temp With Query(用查询替代临时变量,程序用一个临时变量来保存某一表达式的结果,吧这个表达式提炼到一个独立的函数中再把所有表达式 替换为函数的调用,此后新函数就可以被其他使用,,,临时变量的问题在于,只在该函数可见 ,这会驱使你写更长的代码,如果替换为查询,那么情况会好得多)

做法:

找出只被赋值一次的临时变量(C++ 可用const来确认),然后提炼出函数,再用inline temp来处理临时变量

5.Introduce Explaining Variable(引入解释性变量)(把复杂的表达式或者其中一部分的结果放进一个临时变量,以此变量名称来解释表达式的用途,来增加可读性)

6.Split Temporary Variable(分解临时变量)(某个临时变量被赋值超过一次,它既不是循环变量也不用于收集计算结果,那么就该针对每次赋值,创建一个独立,对应的临时变量。保证一个临时变量值承担一个责任) 

7.Remove Assignments to Parameters(移除对参数的赋值)(注意传值和转地址的区别)

8.Replace Method with Method Object(以函数对象取代函数)(如果一个大型函数无法用Extract Method 那么就可以吧这个函数放进一个单独的对象,如此一来局部变量就成了对象内的字段,然后在这个类中拆分这个大型函数)

8.Substitute Algorithm(替换算法)(吧每个算法替换为一个更清晰的算法,如:函数内部大量的if 如果可以用查询 循环来替换,那就替换吧)

© 著作权归作者所有

梦想游戏人
粉丝 41
博文 461
码字总数 132517
作品 0
成都
私信 提问
[读书]读《重构-改善既有代码的设计》

读《重构-改善既有代码的设计》 断断续续,加上过年,花了快2个月吧,把《重构-改善既有代码的设计》读完了,这里总结下。 发现此书背景 读的感觉 知识感触 发现此书背景 这本书是从同事的桌...

zemel
2016/03/07
41
0
读书笔记《重构 改善既有代码的设计》

重构 (refactoring) 在不改变代码的外在的行为的前提下 对代码进行修改最大限度的减少错误的几率 本质上, 就是代码写好之后 修改它的设计。 1,书中开始用一个例子简单阐释为什么要重构,以...

MichaelDuan
09/29
0
0
重构-改善既有代码设计

重构是在不改变软件可观察行为的前提下,对代码作出修改,以改进程序的内部结构。本质上说就是在代码写好后改进它的设计 重构往往意味着不了解软件行为下重构程序 2.在设计前期使用模式常常导...

zhchl2010
2015/12/24
128
0
31 天重构学习笔记2. 移动方法

摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过...

技术小甜
2017/11/15
0
0
闲谈简单设计(KISS)疑惑

忙碌了一年了项目又到了交付了,虽然项目能成功上线(因为还有维护支持的团队)。但是个人从技术上看,这是一个不那么成功的项目,因为后期艰难的修复bug,添加feature。这与简单设计有什么关...

zting科技
2017/01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
18分钟前
4
0
redis 命令

redis 秒杀用到的 原子锁 :$redis->decr('jili_reward_goods_stock_' . $gifts_id) redis 秒杀用到的原子锁在秒杀过程中库存量增加 $redis->incrBy('key1', 10); redis 键查看重复:$redis-......

小小小壮
18分钟前
4
0
像智能手机一样管理云端应用:阿里云联合微软全球首发开放应用模型(OAM)

2019 年 10 月 17 日上午 9 点 15 分,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟在 QCon 上海《基于云架构的研发模式演进》主题演讲中,正式宣布: “今天,我们同微软联合发布...

阿里巴巴云原生
28分钟前
4
0
SpringBoot配置数据源

默认数据源 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是: org.apache.tomcat.jdbc.pool.DataSource......

Gx_ww
31分钟前
4
0
Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。 实战环境信息 操作系统:macOS Catalina ...

程序员欣宸
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部