重构:最容易落地的敏捷实践

如何克服“一听就会,一做就废”
2020年8月31日

作者:熊节

重构这个实践在中国软件业的经历真的是太玄幻了。我翻译的《重构》这本书卖了15万册,然而很少有人说重构很容易、照着书一做就会,我听到的反馈都是重构太难了、落不了地、在真实项目里不知道怎么搞。听着这些反馈,每每搞得我很手足无措。

因为重构真的很容易,真的是照着书一做就会。

既然是照着书一做就会的东西,而又那么多人不会,那不就说明那么多人买了这书其实从来也没有照着书做一遍吗?

卖了十几万册的书,却没几个人照着书里写的做,是不是很玄幻。

言归正传。为什么我说重构是最容易落地的敏捷实践?因为它不需要别人配合,自己一个人就能干。更妙的是,重构甚至都不怎么需要动脑子。我前面说的,照着书一做就会。字面意思。

那到底怎么做呢?

第一步。你先把《重构》拿出来,放在键盘边上。每写15分钟代码,就翻到第3章,24条坏味道(第一版是22条,没关系,影响不大)一条条对着看:刚才15分钟写的代码,有没有重复代码?有没有长方法?有没有大类?……就这么挨个模式匹配过去。

第二步。如果任何一条坏味道匹配上了,好的,书里已经写了,用什么重构手法可以消除这个坏味道。把书翻到对应的重构手法。

第三步。照着重构手法的“做法”里面写的步骤,一步步做。实在没有单元测试,其实问题也不太大,照着重构手法一步步做,出错的概率很小。消除一处坏味道,再回到第一步。

有人说了,我不是在开发新代码,就纯粹想重构遗留代码,又怎么弄呢?很简单嘛,前面「第一步」稍微调整一下,翻开《重构》第3章,在你现在要重构的代码里模式匹配找坏味道,找到一处就进入「第二步」、「第三步」。都是一样的,照做就行,不用动脑子。

为啥这么简单的事,这么多人不照着做呢?据我观察,很多人的问题恰恰就是脑子太活,老想偷工减料走捷径:

  1. 对着一段代码,凭本能大概齐看看感觉,懒得对着《重构》第三章一条条匹配坏味道。「这个代码我感觉还行,就这样吧。」
  2. 看见了坏味道,懒得马上动手重构,自己心里偷偷降低标准。「这个函数也才二十几行,好像还不算太长吧,就这样吧。」
  3. 重构过程不照着书里的做法一步步做,总想走个捷径一步到位。「不就改个函数名嘛,看我直接全文检索替换。」

然后,一点小毛病被积累成了一堆大毛病,面对一堆大毛病又没那个本事一点点重构出来,不就卡住寸步难行了嘛,不就落不了地了嘛。

总想偷奸耍滑走近路,结果走成了死路。世上哪有那么多近路,照着正确的路老老实实一步步往前走吧。

书上叫你「创建一个空的函数」,你就创建一个空的函数。书上叫你「仔细检查提炼出的变量」,你就检查提炼出的变量。书上叫你「传入一个参数」,你就传入一个参数。书上叫你编译测试,你起码看看编译是否通过,没有单元测试就手工运行一下相关的功能看看有没有出错。

不要动那么多脑子,你就会发现,重构真是个特别简单的事。每一步都那么小了,想出错也不是太容易的。

可是又有人说了:这得多费时间啊,我写15分钟代码就要把那24条坏味道轮询一遍,我光是看字就得看一个小时,这活还干不干了?

首先,这是个熟能生巧的事。你把24个坏味道轮询一遍要花1小时,还不就是因为不熟嘛。不熟就多轮几遍,第一天可能看字要看1小时,坚持两个星期,你大概率连书都不用打开了,24个坏味道就在脑子里刻着,根本不用去想,看见代码不由自主就知道有什么坏味道——用Kent Beck的话来说,「鼻子一闻就知道」。常用的几个重构手法也不用翻书看,随手拈来就都是行为保持的小步重构。

看别人行云流水般的重构过程,那不都是靠时间和汗水练出来的嘛。要是不能上班时间练,那就下班时间练嘛。每天两小时,找一堆祖传代码来练,练上两个月,本事就有了。又不用麻烦别人,又不依赖什么天赋,上哪儿找比这更简单的事?

要是真没时间练呢?

那你应该更没时间动代码。

—— Kent Beck在《实现模式》里说的

另外,软件行业泰斗级人物,世界级编程大师Bob大叔曾提出一个观点——代码质量与其整洁度成正比。他认为在软件开发行业保持高效的秘诀,就是始终尽可能保持代码整洁。

Bob大叔是一名多产的作家,先后出版了《UML:Java程序员指南》《敏捷软件开发:原则、模式和实践》《代码整洁之道》《代码整洁之道:程序员的职业素养》等。其中,整洁之道系列成为了国内外数百万程序员的案头读物,豆瓣均分高达8.9。今年,Bob大叔的新书《敏捷整洁之道:回归本源》正好构成了“整洁之道”三部曲。

评论关闭了。