他们总在说重构,不过是重写

大约是工作三年后,职业倦怠毫无征兆的袭击了我,我莫名的感到:这一辈子就这样了,每天的工作就是写相同的代码,要命的是,自己在一个领域越精通,别人就越希望自己写同样的模块——再快一点。使我渡过这段时光的,是一些编程行业的老书,对于一个原本追求时髦技术的程序员来说,这样的反转令自己也很惊讶,其中就有这本《重构》,多年后,再次捧读,希望自己如《黑客帝国》里的neo,回到源码,去理解为何重构即不是传说中的银弹,却又如此重要。本篇为第一部分,先来说说看待重构的三心。

回到源码

抛掉对重构的敬畏之心


1. 重构给出了具体的操作方法。

重构不是建立在空中的构建思想,而是从实践中归纳出来的操作手册。比如书中提到的要点之一:

事不过三,三要重构。

这条规则给出了重构时机的具体判断方法:一个值,一段代码,相同的功能,如果重复出现了 两次以上,就要提取为宏,变量,方法,或模块,以方便重用。这不是建议,从代码质量来说,这是要求,也是开发者从小工到专家的必由之路,事实上,除此之外,我不知道还有别的编写代码的方法。

2. 重构早已在开发者身边。

几乎所有开发工具(Eclipse、Xcode...)都内置重构工具,他们的使用与代码编辑器一样简单。
如果你是一名iOS开发者,请参阅Xcode8 五分钟重构起步

要对重构有耐心


由于重构不改变程序的外在表现,换而言之,即没有加入任何新功能,因此项目经理和老板不会主动要求开发者重构,甚至开发者提出时,会招来反对:这个项目还剩一个星期,还有N个需求未实现,现在你请求花费两天时间,什么都不做。开发者几乎都承担不了这样的压力,但是,比延误工期更严重的是,一个臃肿的,不易修改的项目,最终将面临添加需求困难,运行效率低下,以致达不到可用的性能,项目被砍掉,失败几乎不可避免。
那么作为开发者,应该怎么处理这个矛盾呢?一个可行的方法是,把重构当做开发的一部分,一边开发一边重构,先快速的堆叠代码,实现功能,然后在功能不变的基础上(写好单元测试),逐步重构。

庖丁解牛

对于吹嘘重构有戒心


不要对别人吹嘘重构

重构是一系列技法,就如一个优秀木匠不会吹嘘自己的刀法一样,他表现自己的,永远是作品,开发者的作品就是程序,可扩展,少改动,高效,稳健的程序,如果团队里有人说:我现在不重构就没法写代码。大概他就真的只是不会写代码而已。
本人面试过一些刚毕业的开发者,在最后的提问环节,他提出的问题是:你们用什么开发环境?接着他还进一步强调自己一定要使用**Source Insight
**(一种Windows平台流行的开发集成环境,基于代码语义管理代码),否则就无法写代码。当时我有点错愕,面对了解公司环境的宝贵机会,不问福利待遇,不问升职通道,却纠结一个开发工具。后来我发现,很多初学者(也包括我自己)对工具有种痴迷,这当然也不是坏事,但对自己用的开发工具夸夸其谈,只能说明开发者的眼界不够开阔,水平有局限。

木匠不会夸自己锤子好使

当听到有人将重构奉为灵丹妙药,要格外小心,对此保持警惕。

有的技术领导人,动不动就说“下面我们进入重构阶段了”,仔细观察发现:每每他提出的时机,都是项目无法按时完成,某些功能实现不了时,公司领导还无法反驳,懂点技术的都明白重构的重要性。

忽悠

那么,如何鉴别这种拿重构“忽悠”的行为呢?可以从以下几点:

  1. 检查要进入重构阶段的团队有没有写好对应的单元测试,这些测试是否自动测试。
  2. 是否为重构的项目新开版本管理库,如果是,那这不是重构,而是 重写
  3. 最终确认最开始要求添加的需求是否被完成。

最后这点看起来有点二,但实际中常常发生,团队说,我开始重构啦,于是在大汗淋漓的两周后,团队只能保证“重构”后的项目勉强运行,项目进入了新阶段——bug修复,然后就再也没人提最初提出的新功能新需求了。


对于第一点,我们要理解重构的目标是

不改变代码外在行为的前提下,对代码进行修改,以改进程序的内部结构。

如何保证代码外在行为没有改变?就得靠单元测试了,这里将单元测试作为代码或重构的质量标准,谁也不想一个正在运行的程序,被修改后引入一堆Bug。
既然重构讲究的是小步修改,每次改完后都要通过单元测试,那么第二点也很好理解了,重建版本库则意味着大段地搬移代码,这个过程很难保证代码质量,得到的很可能是 未经验证 的代码。

既然重构是一种编程手法,那么实践中的重构是如何操作的?该如何避免重写而**优雅地重构呢?
下篇将通过一个具体的例子,体会重构的过程,请关注我的简书。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,488评论 25 707
  • 先说项目开发过程中团队人员的分工协作。 一 人员安排 毕业至今的大部分项目都是独立完成,虽然也有和其他同事协作的时...
    SnowflakeCloud阅读 10,745评论 3 59
  • LZ 16010C复合剂 SF/CD通用发动机油复合剂。  LZ 16010C以3.90%(重量)的加剂量可满足...
    weeklybright阅读 643评论 0 0
  • 清月起微寒, 梅花鬓上残。 斜照一枝影, 尤隔锦竹帘。
    你予的暖阅读 216评论 0 0
  • 这是李婷365日写作计划第129天的写作内容 自律起初来自家庭教育 尚缺少自律的孩子,未必是因为父母管教不严。不少...
    婷婷玉立水墨画阅读 153评论 0 0