代码重构 第六章 总结

2022-07-05

第六章 重新组织函数

6.1提炼函数

看见过长的函数或需要注释才能使人理解的代码,标志着需要提炼。将函数细粒度的切分为多个独立函数,函数被复用的机会越大,对函数的覆写也更容易。另外,切分出的独立函数取一个对功能描述准确的名字以增强可读性。不要害怕函数名太长,哪怕函数名比提炼出的代码还要长也没关系。

步骤

  • 创建一个新函数,以他的功能命名
    如果不能概括他的功能那就别动他
  • 从源函数复制代码
  • 检查提炼出的代码是否引用了作用域仅限于源代码的变量
    作为参数传给提炼的函数
  • 检查是否有仅限于提炼代码使用的变量,将其声明在提炼出的函数中
  • 检查提炼函数是否改变了某些局部变量
    如果后面用到了被改变的变量,可以将作为它返回值。
    如果需要返回的不是一个值,那尽可能再拆分为多个有单一返回值的函数
  • 编译测试
    临时变量太多往往使提炼变得举步维艰,所以提炼之前尽量先减少临时变量数量
6.2内联函数

以下情况需要用到内联函数
1.有些小函数,他的代码读起来和函数名一样清晰易读,这个时候可以不作为独立函数
2.有一堆组织不合理的小函数,可以将其组成一个大函数,然后重新拆分为组织合理的小函数

步骤

  • 检查函数,确定它不具备多态性
  • 找出调用这个函数的点
  • 将调用的地方换成函数体
  • 编译测试
  • 删除函数定义
    如果做的时候不像上面说的这么轻松,遇到了很多难以处理的问题(如递归等)。就说明不应该用这种手法重构
6.3内联临时变量

临时变量往往是用来替换某个查询值。临时变量的存在往往会影响重构
唯一需要使用临时变量的情况是临时变量被赋予一个函数返回值,这种基本没有什么危害。

步骤

  • 检查给临时变量赋值的语句,确保等号右边的表达式没有副作用
  • 如果临时变量没有被声明为final,则声明为final然后编译(可以确定临时变量是否真的只被赋值一次)
  • 找到引用点,替换为赋值时的表达式
  • 每次修改后编译测试
  • 删除临时变量声明和赋值语句
  • 编译测试
6.4以查询取代临时变量

将临时变量赋值提炼为一个有返回值的函数
临时变量的问题在于:他们是暂时的,且只能在所属函数内使用。导致所在函数变长。把临时变量替换为查询,使得同一个类中所有函数都可以使用。在提炼函数之前往往需要这么做。

步骤

  • 找出只赋值一次的临时变量
  • 声明为final
  • 编译
  • 将对临时变量赋值的语句等号右边提炼到一个独立函数中
    可以先声明为private如果将来还有其他人用,再修改也很容易
    确保提炼出来的函数没有副作用(修改对象的内容)
  • 编译测试
  • 将临时变量改为内联临时变量
6.5引入解释性变量

将复杂表达式的结构放进一个临时变量,以变量名解释用途
这个看起来与消除临时变量的理念相悖,所以要确定遇到的情形需要用到这个重构手法。
对于提取复杂表达式的重构手法更推荐使用提炼函数,如果算法拥有大量局部变量,直接提取函数很难。这时就需要先用引入解释性变量清理代码,搞清楚算法逻辑后再用以查询取代临时变量的手法重构。

步骤

  • 声明一个final变量,将复杂表达式结果赋给它
  • 将用到复杂表达式的地方用临时变量替换
  • 编译测试
6.6分解临时变量

如果一个临时变量被赋值了多次,表示它承担了多个责任此时它应该被分解为多个变量。因为同一个变量承担多个责任会使代码阅读者糊涂

步骤

  • 在第一次赋值处修改名称,声明为final
  • 用新的变量替换第二次赋值之前对其的引用
  • 在第二次赋值处重新声明临时变量
  • 重复
6.7移除对参数的赋值

对于按值传递的情况,对参数的任何修改都不会影响原值,在函数中修改参数会使代码变得难以阅读,所以需要修改时将参数赋给一个临时变量,需要返回时,将临时变量返回即可。

步骤

  • 建立一个临时变量,把要处理的参数赋给它
  • 将对参数的引用修改为对临时变量的引用
  • 修改赋值语句为给临时变量赋值
  • 编译测试
6.8以函数对象取代函数

对于一些需要拆解但是由于局部变量太多导致难以拆解的可以使用这种方式

步骤

  • 建立一个新类,以拆解出的函数功能为这个类命名
  • 类中新建一个final字段用以存放原函数所在类,用来访问原函数所在类的字段
  • 新类中建一个构造函数接受源对象,及原函数所有参数,及局部变量
  • 新类中建一个compute函数
  • compute函数中复制原函数代码,需要使用源对象属性和局部变量都更改为使用新对象的属性
  • 修改原函数代码,改为创建新类的一个对象而后调用compute函数
  • 编译,测试
    这个步骤过后可以在这个新类里轻松拆解compute函数,所有访问临时变量可以改为访问类属性
6.9替换算法

对于现有算法,如果有更清晰的解决方式,就应该用更清晰的方式取代复杂的方式
这么做的前提是已经充分理解了原函数

步骤

  • 准备好一个替换算法让其通过编译
  • 测试新算法和原函数结果相同
  • 替换原函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容