作为一名开发人员,你如何开始一个新项目的工作……?
首先收集一些基本要求,然后根据要求开始一项一项地实现功能。随着项目的进展和了解更多,您会不断添加和更改代码库中的代码。稍后您还会更改代码以修复错误和边缘情况。
但是几天或几个月后会发生什么……?你的代码看起来像……??复杂吗?很难理解吗?如果是,那么您肯定没有注意改进代码或重构代码。您可能在没有查看现有代码的情况下编写了一些重复的代码,或者您可能编写了一些较长的方法/函数、大型类、太多参数、不直观的变量名称、代码放置等。
在不改变软件功能或应用程序外部行为的情况下改进或更新代码称为代码重构。它降低了技术成本,使代码更加高效和可维护。如果你不早点注意代码重构过程,你就会为以后代码中的错误付出代价。所以不要忽视清理代码。
在软件开发过程中,不同的开发人员有不同的代码编写风格。他们进行更改、维护代码、扩展代码,并且大多数时候他们没有持续重构就离开代码。未重构的代码倾向于代码腐烂:很多 代码中的混乱和混乱,例如重复代码、类或包之间不健康的依赖关系、类职责分配不当、每个方法或类的职责过多等。为了避免所有这些问题,持续重构很重要。
现在的问题是……重构代码的技术是什么?
我们将讨论一些流行和常见的代码重构技术,但在此之前让我们讨论一些快速提示……
提示:
- 您需要以小步骤执行代码重构。在您的程序中进行微小的更改,每一个微小的更改都会使您的代码稍微好一点并使应用程序处于工作状态。
- 在重构过程中进行小的更改后运行测试 TDD 和 CI。如果不运行这些测试,就会产生引入错误的风险。
- 不要在重构过程中创建任何新特性或功能。在现有代码中添加任何更新或新功能之前,您应该重构代码。
- 重构过程会影响测试结果,因此最好让 QA 和测试团队参与重构过程。
- 您需要接受您不会对您的代码完全满意的事实。您重构的代码将在不久的将来过时,您将不得不再次对其进行重构。
最常见的代码重构技术
有许多重构代码的方法和技术。让我们讨论一些流行的…
1. 红绿重构
Red-Green 是敏捷软件开发过程中最流行和广泛使用的代码重构技术。这种技术遵循“测试优先”的设计和实现方法,这为所有形式的重构奠定了基础。开发者主动重构为测试驱动的开发周期,分三区进行。
- RED:第一步从编写失败的“红色测试”开始。您停下来检查需要开发的内容。
- 绿色:在第二步中,您编写足够简单的代码并获得开发通过“绿色”测试。
- 重构:在最后一步和第三步中,您将专注于改进和增强代码,使您的测试保持绿色。
所以基本上这项技术有两个不同的部分:第一部分涉及编写向系统添加新函数的代码,第二部分是关于重构执行此函数的代码。请记住,您不应在工作流程中同时执行这两项操作。
2. 通过抽象重构
这种技术主要由开发人员在需要进行大量重构时使用。我们主要使用这种技术来减少代码中的冗余(重复)。这涉及类继承、层次结构、创建新类和接口、提取、用委托替换继承,反之亦然。
上拉/下推方法是这种方法的最好例子。
- Pull-Up 方法:它将代码部分拉入超类并帮助 在消除代码重复方面。
- Push-Down 方法:它从超类中获取代码部分并移动它 向下进入子类。
P ULL了构造体,提取子类,提取超,倒塌的层次结构,表单模板方法,提取接口,与代表团替换继承,继承与替换代表团,压低场所有这些都是其他例子。
基本上,在这种技术中,我们为系统中需要重构的那些部分以及最终将要替换它的对应部分构建抽象层。下面给出两个常见的例子……
- 封装字段:我们强制代码使用 getter 和 setter 方法访问字段。
- 泛化类型:我们创建更通用的类型以允许代码共享,用状态替换类型检查代码,用多态替换条件等。
三、作曲方法
在应用程序的开发阶段,很多时候我们会在程序中编写很长的方法。这些漫长的方法 使您的代码非常难以理解且难以更改。在这些情况下主要使用组合方法。
在这种方法中,我们使用流线型方法来减少代码中的重复。一些示例是:提取方法、提取变量、内联 Temp、用 Query 替换 Temp、内联方法、拆分临时变量、删除对参数的赋值等。
提取:我们将代码分解成更小的块以查找和提取碎片。之后,我们为这些块创建单独的方法,然后将其替换为对这个新方法的调用。提取涉及类、接口和局部变量。
内联:这种方法 删除了我们程序中不必要的方法的数量。我们找到对方法的所有调用,然后用方法的内容替换所有调用。之后,我们从程序中删除该方法。
4. 简化方法
这种方法涉及两种技术……让我们讨论这两种技术。
- 简化条件表达式重构:编程中的条件语句 随着时间的推移变得更加合乎逻辑和复杂。您需要简化代码中的逻辑以了解整个程序。
有很多方法可以重构代码并简化逻辑。其中一些是:合并条件表达式和复制条件片段、分解条件、用多态替换条件、删除控制标志、用保护子句替换嵌套条件等。 - 简化方法调用重构:在这种方法中,我们使方法调用更简单、更容易理解。我们致力于类之间的交互,并简化它们的接口。
例如:添加、删除和引入新参数、用显式方法和方法调用替换参数、参数化方法、从修饰符进行单独查询、保留整个对象、删除设置方法等。
5.在对象之间移动特征
在这种技术中,我们创建新类,并在新旧类之间安全地移动功能。我们对公共访问隐藏了实施细节。
现在的问题是……什么时候在类之间移动功能,或者如何确定是时候在类之间移动功能了?
当你发现一个类有太多的责任并且发生了太多的事情,或者当你发现一个类是不必要的并且在应用程序中什么都不做时,你可以将代码从这个类移到另一个类并完全删除它。
示例有:移动字段、提取类、移动方法、内联类、隐藏委托、引入外部方法、移除中间人、引入本地扩展等。
6. 预备性重构
当您注意到在应用程序中添加一些新功能时需要重构时,最好使用这种方法。所以基本上它是软件更新的一部分,具有单独的重构过程。如果您注意到在功能开发的早期阶段需要更新代码,那么您就可以免除未来的技术债务。
最终用户无法看到工程团队的这种努力,但开发应用程序的开发人员在构建应用程序时会发现重构代码的价值。如果他们早点花一些时间更新代码,他们就可以节省时间、金钱和其他资源。
“It’s like I want to go 100 miles east but instead of just traipsing through the woods, I’m going to drive 20 miles north to the highway and then I’m going to go 100 miles east at three times the speed I could have if I just went straight there. When people are pushing you to just go straight there, sometimes you need to say, ‘Wait, I need to check the map and find the quickest route.’ The preparatory refactoring does that for me.”
Jessica Kerr (Software Developer)
7. 用户界面重构
您可以在 UI 中进行简单的更改并重构代码。例如:对齐输入字段、应用字体、用主动语态改写指示格式、应用常用按钮大小、增加颜色对比度等。
最后的话
您需要将代码重构过程视为清理有序的房子。家里不必要的杂乱会造成混乱和压力大的环境。书面代码也是如此。干净且组织良好的代码总是易于更改、易于理解和易于维护。如果你早点注意代码重构过程,你以后就不会遇到困难。
两位最有影响力的软件开发人员 Martin Fowler 和 Kent Beck 花费了大量时间来解释代码重构过程及其技术。他们还写了一本关于这个主题的完整的书重构:改进现有代码的设计。本书描述了各种重构技术,并清楚地解释了这些重构过程的工作。如果您想深入了解代码重构过程,我们建议您阅读本书。