重构三部曲(一):思想准备篇

一、概述

重构三部曲为:思想准备,单元测试,重构

  • 思想准备的目的是明确:为什么要重构,重构的理论支撑是什么
  • 单元测试:重构依托于良好的测试,单元测试是保证重构顺利进行的神兵利器
  • 重构:依照《重构》中的重构技巧进行实战

本文主要是摘录自《重构 改善既有代码设计》的原话,有一部分是个人对原文的个人理解。

重构的思想并不是只适用于重构,也适用于开发过程中的代码编写,两者的目的都是写出良好的代码。

光知道还不够,还必须付诸应用;光有决心还不够,还必须行动

二、代码需要意图明显

  • 重构的定义:在不改变软件可观察行为的前提下改善其内部结构
  • 重构的意义在于:你永远不必说对不起--只要把出问题的地方修补好就行了。(“封装”不可能永远都是适用的,可能过一段时间之前很完美的封装就会显得很“臃肿”了)
  • 你的代码首先是为人写的,其次才是为计算机写的,写出人类容易理解的代码
  • “封装”意味着每个对象都应该尽可能少了解系统的其他部分
  • 关键不在于函数的长度,而在于函数“做什么”和“如何做”之间的语义距离
    • 代码用途和实现手法之间的语义距离
    • 意图要明确,明确说出我所需要的。
    • 提高代码的可理解性,降低其修改成本
    • 避免“代码传达的信息与你的意图南辕北辙”
  • 需要为代码编写文档意味着代码本身写的不好
  • 函数的名称应该准确表达它的用途
  • 好的代码,更有利于性能的优化(不要因为性能而牺牲代码的清晰性)

三、重构要小步前进

  • 重构依托于良好的单元测试。
    • “重构需要一组可靠的测试环境”
    • 测试应该是一种风险驱动行为
  • 一定要快速前进,快速失败并更正,然后再重复
    • 重构应该小步前进,比如修改一个局部变量或者提炼一个函数
    • 每一步出现异常都应该回滚上个版本,保证输出不变
  • 设计模式为重构提供了目标
  • 你之所以进行重构,必定是为了达到某个目的,而不仅仅是为了看起来有所动作
  • 大型重构耗费是假长,在这个过程中,你应该根据需要安排自己的工作,只在需要添加新功能或修补错误时擦进行重构。重构程度只要能满足其他任务的需要就行了
  • 应对并处理变化,是软件开发的根本复杂性之一
  • 重构时不应该有任何添加功能的操作,重构是对已有功能的操作,必须保证软件可观察方式(输出)是不变的。
  • 哪怕你完全了解系统,也请实际度量它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。
  • 你必须培养出自己的判断力
  • 问题发现的越早,为修复而付出的代价越低。

四、重构方法的一些摘录

  • 一个类应该是一个清楚的抽象,处理一些明确的责任
    • 决定把责任放在哪儿
    • 分解类所负的责任,分解出新类的旧类如果责任与名称不符,进行更名
  • 间接性可能带来帮助,但非必要的间接性总是让人不舒服
  • 观察类应该做的所有事情,然后针对任何一项功能的任何一种可能失败情况
  • 增加子类的目的,是为了增加新特性或变化其行为
  • 如果某个类在不同环境下扮演截然不同的角色,使用接口就是个好主意
  • 绝大多数情况下,函数应该放在它所使用的数据的所属对象内
  • 将复杂的处理过程分解成小函数
    • 先搬离低层函数,再搬离高层函数
    • 将查询函数和修改函数分离
  • 所谓重构继承体系,往往是将函数和字段在体系上下移动
  • 如果你手上没有所需的东西,总可以叫另一个对象给你
  • 在分布式软件中,函数的往返必须被减至最低限度
  • 任何有返回值的函数,都不应该有看得到的副作用
  • 所有的数据都应该隐藏起来
    • 数据隐藏,你绝不应该将数据声明为public
    • 哑数据对象--除数据访问函数外,没有其它任何函数
  • 程序当中,复杂的条件逻辑是最常导致复杂度上升的地点之一
    • ”分支逻辑“和”操作细节“分开
  • 加入断言,永远不会影响程序的行为。
    • 不要滥用断言
    • 更多的时候,断言的价值在于:帮助程序员理解代码正确运行的必要条件
  • 过长的参数列总是难以理解的
    • 如果有必要,将参数的计算过程提炼到一个独立函数中
    • 应该只在必要关头才添加参数,预先添加的参数很可能并不是你所需要的。
  • 重复代码是系统中最糟糕的东西之一
    • 避免行为重复,因为这容易导致 ”修改一个却未能修改另一个“的风险
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 多少人向往云南 因为云南的真实 不去大理丽江 才是真正的到过云南 云南的云是实质的 可以摸得到 软软凉凉的 就像穿...
    猫身人面兽心阅读 360评论 0 3
  • 我现在深深怀疑自己到底读研正不正确,连着几天被老爸说的,没忍住,挂了电话哭了一会,好久没有哭过了。最近做课题的压力...
    delmemory阅读 163评论 0 0
  • 在我们留意的那个人离去之后,一切都放松了,有那么一瞬间,我好像看到了你,我知道那只是错觉,发着伤感的说说,讲着唯美...
    mangsan阅读 416评论 0 0
  • 当我发现自己没有办法在走路的时候,把所有的注意力都只集中在身上,我感到很沮丧。我只能把眼睛闭上,双手捂住耳朵,比之...
    漫步的咖啡阅读 331评论 0 0
  • 今天在开车回家的路上 想到了弹幕。这真是一个很好的创造!当我们看电影看电视剧看综艺节目时 都可以打开弹幕 用眼镜的...
    我是忙碌的小叮当阅读 316评论 0 3