2017年3月左右,爆出了华为裁掉35岁程序员的新闻,我不禁思考起如果我35岁了会怎么样,也促使了我去思考我想成为什么样的人?成为一个管理人员,还是一个深耕在一线战场的技术人员?我最后选择了后者。但是我也越发觉得我技术的薄弱,与社会技术潮流的脱节,于是我幡然醒悟,《重构》是我大学毕业后买的第一本书。
好景不长,在我看了一半之后,我放弃了这本书,而2018年春节的时候,我又捡起了这本书。一部分是项目原因,一部分是因为CTO推荐我重新开始看。因此,《重构》这本书我算是看了1.5遍吧。
先说下我第一次看的时候的想法吧。第一次听说“重构”这个词是时候已经不记得了,一直觉得重构是一个高大上的事情,能把整个项目“一下子”变成更好,更合理。看了前面几章之后,一下子就发现重构并不是一件离程序员很远的事情了。重构其实应该是发生在日常开发中的点点滴滴,一旦闻到代码的“坏味道”,就是程序在给出的警告,这里需要重构一下了。而根据我后来的工作实际情况。大部分情况下这些重构都不会花很多时间,小到改个变量名、方法名,大到提取个抽象基类等。这是我第一次看的时候最大收获,而中间章节介绍的方法,我当时觉得挺简单的,也就没什么兴致看下去了。
而这次看的时候,我收获了挺多东西。
1、我忘了第一次看到“单一职责原则”是在哪看到的了,但会这么去思考的时候很少很少。在读《重构》的过程中,我发现有一些手法,如果不看动机的话,就会觉得自我矛盾,或者两两矛盾,比如move method,extract class和inline class等。move method:将A方法从α类搬到β类,那么也可以再从β类搬到α类去啊,那么不是可以无限循环,什么时候是个头?extract class和inline class也是一个道理。因此其核心思想是“职责归属”。不管哪一段代码,放在哪个类里或者方法里,其实从不同角度去思考或者解释,都是可以说的通的。而从职责角度去思考可以过滤掉一些不合理的说法。但是职责角度也不是万能的,也可能有两个或者多个职责角度都可以解释的通。这个就像历史、政治和语文的开放题一样,自圆其说,并没有标准答案,但可以有一个参考答案。此外,如果整个程序设计上如果已经有了一个核心的思路,那么就应该按照这个思路去思考职责问题,这样也就是参考答案了。而对于职责的认知,纯粹是个人的认知,意识水平的体现,实际处理较为麻烦。虽然问题多多,可能得出不理想的想法(自圆其说),但如果平时不去这么思考的话,水平永远也无法提高,对面向对象的理解也无法提高。个人认为职责思想是对象意识的最重要的一种体现。
2、对单元测试的重视,重构应该是测试驱动,从测试开始,小步走。
3、重构解决的问题:拥抱变化,适应变化;改善既有代码的设计,提高其艺术价值。而敏捷开发的提出,我觉得很重要的一点出发点就是拥抱变化,适应变化,因此我觉得重构是对敏捷开发的一个很好的补充。
4、个人对重构的理解或者定义:当觉得程序扩展起来麻烦了,或者不适合现在的设计,或者阅读起来觉得不舒服了,于是采取的一系列措施,就叫重构(重构给了我改变主意的自由)。
5、如果以武侠的视角来看重构,我觉得《重构》就是一本武功秘籍,而里面蕴含的面向对象思想就是对应的心法秘籍。重构应该也有武功的三重境界:重形不重意、重形重意、重意不重形。如果重构能够信手拈来的话,我觉得就应该是从面向对象出发,不拘泥于书各手法几起步骤,最终达到的效果是一样的。
6、重构中蕴含的面向对象思想:职责思想是封装的体现,代码复用主要依靠的是继承,复杂的逻辑判断则是多态的使用场景之一。
以上6点是我本次对《重构》的读后感。《重构》是一个可以读多次的书。在经历过更多的项目后,对重构也会有不同的理解,期待下次看的时候会有什么不同的理解。