《重构:改善既有代码的设计》读书笔记

一、理解重构


什么是重构?

按书中 P45 中的说法,重构这个概念被分成了动词和名词的方面被分别阐述:

  • 重构(名词): 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

  • 重构(动词): 使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。

在过去的几十年时间里,重构这个词似乎被用来代指任何形式的代码清理,但上面的定义所指的是一种特定的清理代码的方式。重构的关键在于运用大量微小且保持软件行为的步骤,一步一步达成大规模的修改。

每一次的重构要么很小,要么包含了若干个小步骤,即使重构没有完成,也应当可以在任何时刻停下来,所以如果有人说它们的代码在重构过程中有一两天时间不可用,基本上可以确定,他们做的事不是重构。

与性能优化的区别

重构与性能优化有很多相似的地方:两者都需要修改代码,并且两者都不会改变程序的整体功能。

两者的差别在于起目的:

  • 重构是为了让代码 “更容易理解,更容易修改”。这可能使程序运行得更快,也可能使程序运行的更慢。

  • 性能优化则只关心程序是否运行的更快。对于最终得到的代码是否容易理解和维护就不知道了。

为什么重构?

重构不是包治百病的灵丹妙药,也绝对不是所谓的“银弹”。重构只是一种工具,能够帮助你始终良好的控制代码而已。使用它,可能基于下面的几个目的。

这里有一个有意思的科普(引用自百度百科:没有银弹
):在民俗传说里,所有能让我们充满梦靥的怪物之中,没有比狼人更可怕的了,因为它们会突然地从一般人变身为恐怖的怪兽,因此人们尝试着查找能够奇迹似地将狼人一枪毙命的银弹。我们熟悉的软件项目也有类似的特质(以一个不懂技术的管理者角度来看),平常看似单纯而率直,但很可能一转眼就变成一只时程延误、预算超支、产品充满瑕疵的怪兽,所以,我们听到了绝望的呼唤,渴望有一种银弹,能够有效降低软件开发的成本,就跟电脑硬件成本能快速下降一样。

1. 改进软件的设计

当人们只为短期目的而修改代码时,他们经常没有完全理解架构的整体设计。于是代码逐渐失去了自己的结构。程序员越来越难以通过阅读代码来理解原来的设计。代码结构的流失有累积效应。越难看出代码所代表的设计企图,就越难以保护其设计,于是设计就腐败得越快。

完成同样一件事,设计欠佳的程序往往需要更多代码,这常常是因为代码在不同的地方使用完全相同的语句做同样的事情,因此改进设计的一个重要方向就是消除重复代码。消除重复代码,我就可以确定所有事物和行为在代码中只表述一次,这正是优秀设计的根本。

2. 使软件更容易理解

所谓程序设计,很大程度上就是与计算机对话:我编写代码告诉计算机做什么,而它的响应是按照我的指示精确行动。一言以蔽之,我所做的就是填补“我想要它做什么”和“我告诉它做什么”之间的缝隙。编程的核心就在于“准确说出我想要的”。

然而别忘了,除计算机之外,源码还有其他读者,并且很大概率还是几个月后的自己,如何更清晰地表达我想要做的,这可能就需要一些重构的手法。

这里我联想到了软件设计的 KISS 原则:KISS 原则,Keep ISimple and Stupid ,简单的理解这句话就是,要把一个系统做的连白痴都会用。

3. 帮助找到 BUG

对代码的理解,可以帮助找到系统中存在的一些 BUG。搞清楚程序结构的同时,也可以对自己的假设做一些验证,这样一来 BUG 想不发现都难。

Kent Beck 经常形容自己的一句话是:“我不是一个特别好的程序员,我只是一个有着一些特别好的习惯的还不错的的程序员。”重构能够帮助我们更有效地写出健壮的代码。

posted on 2020-05-10 12:55  哈弗h6  阅读(96)  评论(0编辑  收藏  举报

导航