重构的原则(上)

最近在重温 Martin Fowler 的 《重构》一书,在博客中记录一下阅读过程的心得笔记。

什么是重构

重构是软件开发过程中经常会用到重构一次,但在使用时比较随意,Martin 则是认为这个词的使用需要更为严谨一下,因此给出了两个定义

  1. 重构作为一个名词时,是指对软件内部的一种调整,在不改变软件可观察行为的前提下,提供代码的可理解性,降低内部的修改难度。简单的理解便是,优化了程序内部的逻辑,降低第三者的理解难度,以及基于原有逻辑进行修改时,不会觉得难以下手。
  2. 重构作为一个动词时,是指使用一系列的重构手法,在不改变软件可观测行为的前提下,调整它的结构

所以当我们谈论重构时,我们指的是在不改变代码外部行为的前提下,通过一系列微小且保持软件行为的的步骤对代码的结构和内部实现进行调整,使其更易于理解、维护、扩展和重用的过程

每一个重构要么很小, 要么是通过多个小步骤组合而成。在重构的过程中,代码一直是可运行,并且行为与重构前是相同的。放弃当前的重构,代码也是不会受到影响的。

如果有人说他们的代码在重构过程中有一两天不可用,那么基本上就可以确定,他们在做的事不是重构

重构保证的是可观测行为,这意味着重构后程序的行为不一定与重构前的行为完全一致,但是对于用户关心的行为来说是不应该有任何改变的。也就是说重构可能会调整内部的接口,对内部函数的性能造成一定的影响。

总而言之,重构是通过一系列微小且不影响观测行为的步骤,使软件更容易理解,更易于修改。

两顶帽子

在开发软件的工作中, 将自己的时间分配给两种的功能,就像是两顶帽子,同一时间我们只能选择其中的一顶。这两顶帽子分别是“修改帽子”和“重构帽子”。

修改帽子

“修改帽子”是指我们进行代码修改时所带的“帽子”,通常是在实现新功能、修复问题或加入新特性时使用。在修改帽子下,我们通常关注的是完成任务并使代码能够正确运行,而不太关注代码的设计是否合理、可维护性如何等问题。因此,在修改帽子下,我们可能会编写一些不那么优秀的代码,可能会违反一些设计原则,甚至会引入一些技术债务。

重构帽子

相比之下,“重构帽子”则强调了代码的设计和质量。在重构帽子下,我们关注的是如何将代码重构为更加优秀、可读性更高、可维护性更好、更易于扩展和更易于重用的形式。通过重构,我们可以去除代码中的重复和冗余,改进代码的可读性和可维护性,遵循设计原则,减少技术债务。

总的来说,“修改帽子”和“重构帽子”是两种不同的代码修改方式和目的。在开发过程中,我们应该时刻意识到这两种“帽子”的存在,当前戴的是哪一顶“帽子”,并且根据具体情况选择合适的“帽子”来进行代码修改,以实现高质量、高效率的软件开发。

为何重构

在解释了什么是重构之后,我们需要进一步去思考为什么需要重构。重构并不是解决所有问题的“银弹”,而是一种重要的技术手段,应该根据具体情况和需求进行选择和应用,如果需要完成以下的目的,那么就可以使用重构来改善代码。

改进软件的设计

当缺乏重构时,代码的内部设计(架构)逐渐腐败变质,因为人们在修改代码时往往只关注短期目的而忽视整体的设计。这样的修改会导致代码失去原有的结构和清晰性,逐渐变得混乱、复杂和难以理解。

随着这种修改的不断累积,软件的设计逐渐失去了它原有的结构,开发者也无法通过阅读代码来理解原来的设计。这种“技术债务”不断积累,最终导致代码的内部设计变得混乱不堪,甚至变得无法维护和扩展。

设计欠佳的软件在修改时往往需要调整更多的代码,这是因为设计欠佳会导致代码结构混乱、逻辑复杂,同一个功能的代码可能分散在各处,或者有很多重复的代码。这样一来,每次修改时都需要花费更多的时间和精力来查找和调整相关的代码,同时也增加了引入新错误的风险。

改进设计的一个重要目标便是消除重复的代码。通过重构和改进设计,我们可以使代码更加简单、清晰和易于理解,减少代码中的重复和冗余,提高代码的可重用性和可扩展性。

消除重复的代码不仅可以提高代码质量和可维护性,还可以减少代码量,从而降低软件开发和维护的成本。通过重构和改进设计,我们可以使代码更加灵活、易于扩展和修改,从而满足不断变化的需求和技术环境。

使软件更容易理解

编程可以被视为与计算机的一种“谈话”,我们需要通过计算机来达成特定的目的。为了让计算机执行相应的任务,我们需要编写代码来表达我们想要实现的功能和逻辑。编程连接了“我想要做什么”和“我需要计算机怎么做”之间的纽带。

然而,我们的代码并不仅仅只有计算机可以阅读和理解。我们的代码还将被其他的开发者阅读和修改,包括我们自己在几个月或几年之后。如果我们的代码设计和实现难以理解,这将极大地阻碍后续开发者的工作。他们将花费大量的时间来阅读、理解、修改我们的代码,甚至可能需要重构整个系统,从而影响到整个项目的进度和效率。

良好设计的代码是易于理解和修改的,可以为后续开发者节省时间和精力。相反,难以理解和修改的代码会导致开发效率低下,增加开发成本,并可能产生一系列的错误和缺陷。

无论是为了我们自己,还是为了后续的开发者,我们都需要将代码写得更容易理解和维护,更清晰地表达我们的意图和设计思路。

帮助寻找 bug

在重构的过程中,我们需要仔细审视代码,并深入理解其意图和设计。这意味着我们需要逐行、逐句地阅读代码,并确保我们完全理解代码中所发生的事情。

在理解代码的过程中,我们需要验证自己的假设和理解,这通常涉及到一些测试和试验。我们可能会对代码进行一些修改和调整,以验证我们对代码的理解是否正确。通过这个过程,我们可以发现一些隐藏在代码中的 bug,并解决它们。

提升开发速度

一个内部质量良好的程序,具有清晰的代码结构和良好的设计,可以让开发者更轻松地添加新功能或修改已有功能。通过良好的设计,开发者可以更好地理解代码的意图和结构,更容易地找到需要修改的地方,并知道如何进行修改。这可以减少修改过程中引入新错误和缺陷的风险,并且可以提高代码的可维护性和可扩展性。

另外,通过投入精力改善内部设计,程序的耐久度可以得到提高。内部设计良好的程序可以更好地适应需求的变化,更容易地进行维护和扩展。这可以保持软件长时间的高速开发,并且减少因为代码结构混乱而导致的不必要的开发和维护成本。


重构的原则(上)
https://blog.zhangliangliang.cc/post/principles-of-refactoring-p1.html
作者
Bobby Zhang
发布于
2023年3月30日
许可协议