“重构重构重构你的代码。”这究竟意味着什么,为什么呢?

时间:2009-11-13 05:32:12

标签: refactoring

我经常从专业人士博客那里听到类似于有机会重构你的代码的事情。究竟是什么?用更简单和更少的行重写代码?这样做的目的是什么?

7 个答案:

答案 0 :(得分:12)

Refactoring代码是一个清理代码,减少混乱并提高可读性而不会导致任何副作用或功能更改的过程。

基本上,您通过应用一系列代码更改规则来重构,这些规则可以提高代码的可读性和可重用性,而不会影响逻辑。

在重构之前和之后始终进行单元测试,以确保您的逻辑不受影响。

答案 1 :(得分:11)

这个Wikipedia article将让您了解重构的一般概念中包含的事物类型。

这个想法是随着您的需要调整/改进您的代码。简单的事情可能是重命名变量或方法参数,但其他可能是传递一个额外的参数或删除一个参数或更改其类型。数据模型也可能会发展。等

通常重构,与单元测试协同工作,因此“破坏某些东西”的风险被自动测试可能发现这样的问题所抵消(提供良好的覆盖范围和相关的测试用例......)。

简而言之,重构(以及顺便说一句,大多数IDE或附加组件到IDE,提供各种工具,使重构更容易,更不容易出错)的能力使人们可以更快地编写,而不会强调某些决定(“如果这个对象包括一个数组或一个列表等...)让程序员随着时间的推移改变其中的一些决定,并通过一个可行的,如果不是完美的解决方案提供额外的洞察力。参见一个相关的概念:{{3 }}

小心,重构不会给你开始编码的许可,而不会在设计,对象模型,API等中加入任何想法,但是它会减少某些决策的僵硬性。

答案 2 :(得分:8)

Martin Fowler可能在推广重构方面做得最多,但我认为优秀的开发人员总是进行这些重组。查看Fowler的refactoring web site和他的1999 Refactoring,这是使用Java的特定重构的优秀介绍和目录。

我认为他是全新Refactoring, Ruby Edition的合着者,应该是一个很好的资源。

我发现定期清理这样的代码会使它更清晰,更易于维护。

举一个例子,我编写了一个小型(Java 1.6)客户端库,用于访问远程Web服务(使用REST架构风格)。该库的大部分位于一个源文件中,其中大约一半处理Web服务,而另一半是响应的简单内存缓存(性能)。随着时间的推移,两半的功能都在增长,直到源文件变得过于复杂。所以今天我使用Fowler的“Extract Class”重构来将缓存逻辑移动到一个新类中。在此之前,我必须做一些“提取方法”来隔离缓存逻辑。在此过程中,我做了一些“重命名方法”和“介绍解释变量”。

正如其他人所说,在进行每项更改后,要进行一系列良好的单元测试非常重要。它们有助于确保您不会引入新的错误,以及其他好事。

答案 3 :(得分:6)

简而言之,重构意味着改进软件的设计和/或实现,通常不会改变其行为。通常这样做是为了使代码更容易理解并继续使用,从而使未来的开发更快,更容易出错。

重构是对代码的长期投资 - 因为它不会影响软件的外观“外观”,通常会有压力(从管理层等)到“只是让它工作并继续前进”到下一件事。“虽然这有时可能是正确的决定,但取决于业务驱动因素,经历变化但从未被重构的代码库将会陷入困难的混乱状态(参见Technical Debt)。

具体而言,重构的主要原因通常如下:

  1. 摆脱重复的代码
  2. 通过从较长方法的部分中提取新方法,将长方法分解为较小的方法
  3. 将具有太多责任的类分解为更小,更有针对性的类或子类
  4. 将方法从一个类移动到另一个类。通常这样做是因为方法与它们操作的数据位于同一类中。

答案 4 :(得分:2)

用最简单的术语来说,重构代码就是优化代码。什么是“更好”代码的标准可以解释很多,因为有各种编码风格和模式。重构的一个中心思想是“这个代码可以变得更好吗?”的问题。该标准的一些示例可以包括可伸缩性,可维护性,可读性,性能,可执行文件的大小,或最小化执行代码时使用的内存。

答案 5 :(得分:0)

“重构是改变软件系统的过程,它不会改变代码的外部行为,但会改善其内部结构。” - - MartinFowler在RefactoringImprovingTheDesignOfExistingCode

有关详细说明,请参阅此WhatIsRefactoring

答案 6 :(得分:-2)

重构代码通常意味着获取多次修补的代码并重新编写代码,以便考虑后续修补程序的需求。