从零开始学重构——《重构,改善既有代码的设计》

来源:互联网 发布:excel建立数据库 编辑:程序博客网 时间:2024/05/29 07:19

第0篇,引言

为什么写这个系列

  想写这个重构系列的文章已经有一段时间了,至于写作的动机应该有三个。
  首先,是带领的两个团队的所有成员都是刚毕业不久的半新人,都充满了积极的干劲和责任心。只是在一些基础技能上还略有不足,或将成为他们继续成长的瓶颈,也必然会成为团队发展的制约。
  其次,是之前在和人交流的时候,包括在面试中,也会有人提及自己重构了哪些哪些模块,但具体细问下来却发现对重构的定义和标准有误解,简单地把替换为更好的实现重构画上了等号,意识不到重写(rewrite)重构(refactor)的区别。
  最后,我想也是最重要的,应该是关于自我成长。在这个快速变化的时代,行业、企业与职业的界线已经越来越模糊,会发现有更多的跨界者参与到本行业的竞争中,而企业的寿命在这个快速变化的环境中也越来越短,比如:

世界500强平均寿命只有40年,1000强只有30年,而创业公司只有1-2年。
——《超级个体 2016年10月24日》

  也就是说人们已经越来越难固守在一个企业和行业中凭借混上来的资历而保有竞争力。在这个不确定的年代,需要成长为拥有能力、特色及影响力的超级个体,才能在变化的浪潮中成为一个崛起的个人。对我自身而言,或许在积累能力的过程中,也应该扩大自身在圈子中的影响力,从而成为一个能跳脱出企业而依然保有价值的个体。
  因此才有了这篇重构系列,既是为团队和公司作出的贡献,也是为了自身更好的成长,也希望能给有缘看到这个系列的人一定的帮助和启发。
  

到底什么是重构

  到底什么是重构?很多人对重构只有模糊的概念,知道这个专业词汇,于是在交流中经常把重构作为重新实现了一遍的代名词。在《重构——改善既有代码的设计》一书中,Martin大叔是这么说的:

所谓重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部行为。是一种经过千锤百炼形成的有条不紊的程序整理方法,可以最大程度地减少引入错误的几率。
——《重构——改善既有代码的设计》

  可见,重构必须有两个条件:一是不改变程序的行为,二是整个过程有条不紊、能够减少错误。
  对于第一点,意思是程序在各种输入输出,任何条件分支下都要有相同的行为和结果,重构前后要尽可能地完全相同。这就要求在重构过程中应当尽可能使用原有的代码,因为重构是一种对原有代码的重新组织,而不是删除原有代码然后重新实现,因为在重写的过程中很容易与原先产生不一致。不要仅仅因为原有的代码太过混乱就认为其没有价值,它只是组织和结构比较混乱,但它内在的逻辑却是正确的。(就算逻辑不正确,也应该将重构和修改分开进行,毕竟应该一次只戴一顶帽子
  对于第二点,意思是整个重构的过程中是安全的,是小步前进的,而不是一种破坏性、整体性的大规模一次性的修改。我个人的体会是,在大部分时刻,如果停止修改代码,编译依然能通过、程序依然能正确运行。而不是在被打断时说:“再给我2个小时,程序才能恢复正常”。这个过程用下图可以表示:横坐标代码重构的过程,纵坐标代码代码整洁度,中间的标线代表程序行为的偏离度。
 重构过程示意图
 破坏性过程示意图
  在重构的整个过程中,时时刻刻都与原程序的行为没有过大的偏离,而整洁度却会随着重构的过程渐渐上升(不要觉得难以置信,这就是重构的力量)。而破坏性过程则不然,可能一下子因此删除或重写代码而导致很长时间内编译无法通过,或行为不正常,在过程尾声逐渐恢复行为,但这个新的行为很难证明与原来的保持一致。

本系列有什么

  本系列会以《重构——改善既有代码的设计》一书就参照,把书中大部分常用和重要的重构手法都展示、讲解一遍。
  每篇文章都会以一个或多个重构手法为主题来进行讲解,讲解时会以书中的重构步骤为基础,结合自身的体会,并基于现实中的代码片断来进行示范。手把手讲述重构过程,并在文章中贴出中间过程,最后也会将文章中的代码及重构结果放到git项目中供大家线下实践:https://github.com/samsai/Refactor。
  重构这项技术的学习需要依靠大量的实践和操作,”纸上得来终觉浅,绝知此事要躬行”。
  在操作的过程中若有困惑也欢迎与我联系:samsai1@163.com,也可以主动向我提供重构的案例一起线下讨论。
  重构——改善既有代码的设计

谁该阅读本系列

  本系统的目标读者是那些拥有“写出更好代码”梦想和目标的程序员。
  人言:代码虽是给机器读的,但终究也是给人读的。正如同写小说讲究凤首、猪肚和豹尾,精心代码也讲究内聚、解耦与简洁。一个不想当作家的程序员不是一个好程序员。如果你感觉你的代码像是一段剪不断理还乱的思绪,并且想克服这种状态,那么请跟着我们一起习得重构这项技能。大神们早就为我们扫清了前方的道路,路一直在那里,只是没人走而已。
  想想两三年之后自己要成为什么样的人,自己和目标之间还差着什么?重构这项技术对于你来说有什么积极意义?
  
P.S. 文章中的示例和讨论都涉及大量需要详细阅读和理解的Java代码,但也能迁移到其它具有OO特性的语言。

系列文章汇总

  • 从零开始学重构——重构的流程及基础重构手法
0 0
原创粉丝点击