什么是代码重构?

软件开发人员正在使用电脑工作

作者

Rina Diane Caballar

Staff Writer

IBM Think

Cole Stryker

Staff Editor, AI Models

IBM Think

什么是代码重构?

代码重构是一种软件开发实践,它改变软件代码的内部结构,而不修改其外部行为或影响其功能。这些细微的更改旨在使代码更具可读性和可维护性。

Martin Fowler 通过 1999 年首次出版的《Refactoring》一书推广了这一做法。代码重构有助于消除“代码异味”,Fowler 将其定义为“通常与系统中更深层次的问题相对应的表面迹象”。他补充说,代码异味“很容易被发现或嗅探到”,并引用仅包含数据而没有行为的长方法和类作为代码异味的实例。

代码重构的示例包括修复错误格式、重命名非描述性变量、删除重复或未使用的函数,以及将庞大冗长的方法分解成更小、更易于管理的块。这些保留行为的琐碎修改不太可能破坏代码或引入错误,但其增量效应有助于优化软件性能。

代码重构技术

重构看似简单易行,但部分策略可以帮助软件开发人员采取更具战略性的方法:

抽象

构成

移动功能

● 红绿重构

简化

抽象

抽象是面向对象编程中的一个基础概念。它需要概括对象,因此隐藏了复杂的细节,只保留了基本信息。

在代码重构中,抽象通常针对大型代码库实现。它由 2 个机制组成:

上拉方法从子类中提取代码,并在层次结构中将其向上移动到抽象类或超类,借此减少代码重复,并提高任何共享属性或函数的可重用性。

 ● 下推方法将代码从抽象类或超类下推到子类,以实现不可重用或仅适用于特定子类的逻辑。

构成

这种模块化方法将大量代码分解或划分为更小的代码块,使其更简单、更易于管理。提取方法和内联方法是 2 种组合方法:

提取方法将现有方法的部分内容移动到新的方法中。例如,对于包含不同函数的大型方法,可执行此操作,以确保每个函数都有各自独立的方法。

● 内联方法用方法本身的主体或内容替换对方法的调用,然后删除该方法。例如,这通常适用于只有几行代码且仅由单个类调用的方法。

移动功能

在这种技术中,属性、方法和其他功能在类之间移动,以减少依赖性,增强类功能内部和类之间的内聚性。这种重新分配的方式有助于实现现有代码更合理、更平衡的设计,使其更易于扩展和维护。

红绿重构

红绿重构借鉴了测试驱动开发,即在编写源代码之前先编写测试。这是一种允许持续重构和测试的迭代策略。

这个 3 阶段流程遵循以下步骤:

● 在红色阶段,开发人员编写测试来验证特定的软件行为或功能。这些测试最初注定会失败,因为代码尚未创建。

● 在绿色阶段,程序员编写指定行为或功能的代码。这可以是通过测试所需的最少代码,因为此阶段的目标是保障速度而非质量。

● 最后,在重构阶段进一步细化,对代码做出必要的改进,以获取更简洁、更清晰、更高效的代码,同时仍然保留其行为,使其通过所有相关测试。

简化

此阶段的目标是简化代码及其相关逻辑。其形式可以是减少方法中的参数数量、重命名过长变量或方法、合并导致相同结果的条件表达式、解耦复杂的条件片段,甚至使用多态性代替条件。

代码重构的优势

可以将代码重构想象为每天整理房间,以便更轻松、更快速地在周末完成清理。代码重构的目标是减少技术债务,技术债务是由于程序员走捷径而积累的,例如重复逻辑、不遵循编码标准或使用不明确的变量名。

以下是软件开发团队可以从代码重构中获得的部分优势:

● 降低复杂性

● 增强可维护性

● 提高代码可读性

● 加速速度

降低复杂性

重构可以简化代码,这有助于开发人员更好地理解大型代码库。新聘用的程序员也能快速掌握不熟悉代码的内部工作原理,并从中获益。

增强可维护性

代码重构为更好地完成维护工作奠定了基础。在调试、实现新功能、更新现有功能或升级到最新技术时,清除代码所需的工作量将随之减少。与制造业中的预防性维护一样,代码重构允许人员在现阶段进行细微修复,以避免将来出现重大错误。

提高代码可读性

重构代码后,代码就会更简洁、更易于理解和使用。重构后的代码也更易于浏览,有助于简化软件开发过程。

加快速度

重构的影响或许不像以性能为目标的实际代码优化那么显著。然而,更简单、更轻量的代码仍然有助于提高软件的效率并加快运行时。

代码重构的挑战

重构可以生成清晰、简洁的代码,但这一过程并非没有缺陷。以下是开发团队在重构代码时可能会面临的部分挑战:

● 分配开发人员

● 引入错误

● 旧版代码

● 范围蔓延

● 时间限制

分配开发人员

团队必须决定谁将参与代码重构过程,并确定其角色和职责。这会使程序员无法专注于关键软件开发工作,而小型团队可能难以承受这种代价。

引入错误

即使是最轻微的代码变更,也有可能产生新的错误或使已有的错误再次出现。更复杂的代码重构也有可能破坏或更改特性和功能。

旧版代码

旧版代码是指仍在使用但使用旧版技术开发且不再受到积极支持或维护的旧代码库。在重构过程中,它可能会造成依赖性问题和兼容性问题。这就需要更深入的代码分析和详细的计划来应对影响旧版代码的任何变更。

范围蔓延

人们或许会忍不住过度修复问题,尤其在尚未制定计划或设定明确目标时。特别是在处理逻辑重组时,如果程序员没有花时间检查代码并确定哪些部分可以改进,问题的范围就会随之扩大。

时间限制

代码重构可能耗时良久,而大多数开发团队难以负担。他们需要在重构需求和项目期限之间取得平衡,并考虑重构的时机和规模。

小球在轨道上滚动的三维设计

最新的 AI 新闻 + 洞察分析

在每周的 Think 时事通讯中,发现专家精选的有关 AI、云等的洞察分析和新闻。 

提高代码重构效率的技巧

在开始代码重构之旅之前,请考虑以下技巧来帮助解决该过程中的挑战:

● 时机至关重要

● 规划是关键

● 分析和标准化

 ● 测试和记录

时机至关重要

何时进行代码重构与其原因或方式同样重要。它可以作为软件开发团队定期维护活动的一部分,也可以整合至代码审查中。

在添加新功能、实施重大更新、切换到更新的技术堆栈或升级应用程序编程接口 (API) 或库之前,必须完成重构。它面向未来构建了更具可扩展性和适应性的框架。

规划是关键

代码重构可能非常耗时,因此规划至关重要。开发团队必须考虑其目标和范围。他们可以采取一些小步骤,用几天的时间专注于微小的改变,例如删除死代码、修复格式或删除重复内容。如果涉及的清理工作较多,那么重构就会成为一个有时间表的项目,需要更长的时间。

分析和标准化

简单的重构任务可能不需要太多分析。然而,对于涉及逻辑的技术来说,了解所有相关代码至关重要。确定代码结构背后的基本原理可以帮助程序员做出更明智的决定和有针对性的修改。

此外,遵循团队的编码标准和设计原则可以保持完整性并维护代码库的架构。

测试和记录

重构不仅是为了改进代码,还要确保这些改进发挥作用。这就是为什么测试对于确认软件本身及其行为保持完整非常重要。

虽然开发人员可以运行自己的整合和单元测试,但包括 QA 团队在内至关重要。他们可以运行功能测试来验证功能,并运行回归测试来检查重构的代码是否会引入任何错误或破坏任何功能。

记录变更也必须是流程的一部分。这样就能更容易地跟踪修改,并有助于将来更顺畅地进行代码重构。

用于代码重构的工具和资源

多种工具均有助于加速和实现代码重构自动化。以下是部分热门工具:

● 集成开发环境 (IDE)

● 静态代码分析器

● 其他资源

集成开发环境 (IDE)

当今的许多 IDE 已经内置对自动重构的支持,而不会破坏任何代码或引入错误;有的甚至还能提供 AI 驱动的重构建议。

可用于代码重构的 IDE 包括基于 Java 虚拟机 (JVM) 编程语言的 IntelliJ IDEA、适用于 Python 的 PyCharm 以及适用于 C#、C++ 和 .NET 的 ReSharper Visual Studio 扩展。

静态代码分析器

静态分析器无需运行代码即可对其进行评估。这些分析器可检测常见的编程缺陷和代码质量问题,从而帮助开发人员在软件开发过程中尽早修复。

静态代码分析器的示例包括支持多种编程语言的 Codacy 和开源 PMD、适用于 Java 的 jArchitect、适用于 .NET 的 NDepend 以及适用于 Ruby 的 RuboCop linter 和格式化程序。

其他资源

Refactoring.com 是 Martin Fowler 的网站,其中包含他书中提及的重构方法在线目录。Refactoring.Guru 是另一个探讨重构技术和设计模式的网站。

AI 用于代码重构

人工智能 (AI) 可以协助代码重构过程。生成式 AI 应用程序由大型语言模型 (LLM) 提供支持,可以分析复杂或庞大的代码库,并理解其背后的语义和上下文。在此基础上,它们会及时提供实时重构建议。

例如,IBM® watsonx Code Assistant 可利用 IBM® Granite 模型来识别错误以及需改进之处。然后,它会根据团队既定的编码规范提出有针对性的修复建议,从而简化和加速代码重构。其他类似的 AI 重构工具包括 Amazon CodeGuru Reviewer、GitHub Copilot 和 OpenAI 的 ChatGPT。

对于处理旧版代码的人来说,IBM watsonx Code Assistant 将生成式 AI 和自动化相结合,帮助开发人员实现应用程序现代化 。watsonx Code Assistant for Z Refactoring Assistant 允许程序员将其应用程序重构为更具模块化且可重用的服务。它采用代码分析算法来实现 COBOL 应用程序的现代化。

与任何 AI 系统一样,开发人员仍须审查 AI 驱动的代码重构工具输出的准确性。此外还需进行测试,确保任何建议的更改都能达到预期效果。

AI 学院

利用 AI 实现应用程序现代化

了解生成式 AI 如何提高工作效率、降低合规风险并简化更新,从而转变您的应用程序现代化之旅。

相关解决方案
云迁移 - IBM Instana Observability

Instana 通过提供全面的监控和切实可行的洞察分析,简化企业的云迁移之旅。

探索 Instana
大型机应用程序现代化解决方案

利用生成式 AI 加速和简化大型机应用程序的现代化。

深入了解大型机现代化
应用程序现代化咨询服务

利用混合云和人工智能驱动的现代化服务和策略优化旧版应用程序。

应用程序现代化服务
采取后续步骤

利用混合云和 AI 驱动的现代化服务和策略优化旧版应用程序。

深入了解应用程序现代化服务 下载指南