重构:何时知道是时候进行重构,以及何时进行重构?

4
你何时知道该重构/审查某段代码?更好的方法是什么?
也许像其他人一样,我发现自己知道某些东西需要重构/审查,但是截止日期和管理层没有留出时间。我也想听听你如何将代码审查纳入常规开发流程中。
最近,我发现自己在开始新功能/代码之前进行代码审查。例如,如果我必须在应用程序的模块X中开发新内容或更改某些内容,则会对该模块进行代码审查。我发现这也有助于我更好地理解该模块,以便更轻松地进行更改。
那么,你何时知道该重构/审查代码?何时执行?最重要的是,你如何将其纳入项目计划中?
16个回答

10

重构并不是我单独花时间做的事情。我会在开发新代码或维护旧代码时不断进行重构。将其纳入日常工作计划,并一直寻找可以改进代码的地方。

针对您在回答这个问题时添加的具体案例:我认为您的情况是重构而不是彻底重写的好例子。确保在更改任何代码之前,为相关代码编写一组良好的测试用例。如果代码未通过某些测试,则可以达到三个目的。首先,它将使您专注于特定区域。其次,它将为您(向老板)提供充分的理由来修改代码。第三是标准的单元测试安全网,您希望在重构代码时始终使用该安全网。


6
标准的测试驱动开发方式是红-绿-重构:先编写一个会失败的测试,然后编写代码使其通过测试,最后在保证测试通过的情况下重构现有代码。重构是指在测试通过后,当您发现代码过于复杂或使用了不良模式时进行的操作。重构应该成为您日常开发过程中的一部分,而不是在开发周期结束时才添加的附加功能。我认为,将重构的规模保持较小效果更好。将其作为您日常活动的一部分进行可以避免质量较差的代码在重构之前变得过于庞大 - 至少理论上是这样。

4
我往往会看到“代码异味”,比如我一遍又一遍地重复相同的代码,或者我看到一些让我想,“一定有更好的方法来做这个,我会去找它。” 这是我编写代码的一部分,我认为拥有好的代码可能需要更长时间才能完成,但更容易扩展、可维护,或者其他人接手时不必花费数天时间弄清楚我在代码中做了什么。
如果你要继承代码,那么我认为有两种思路:
1)保持距离。这意味着你只需进行所需的更改以获得功能,就不用再做其他事情。如果你知道该模块将很快被替换,或者你每年只会使用一两次,那么我可以理解不想花费大量时间修复它的逻辑。
2)沉浸自己并立即修复它。如果你正在进行相当广泛的更改或者正在处理经常使用的代码片段,那么对于一些重构或文档编写等工作,你可能会认为这是维护的一部分,或者你想描述的是将糟糕的代码转化为不那么糟糕的代码,因为这将为你节省时间。

2

重构是我在开发过程中持续进行的操作,而不是计划做的事情。每当代码表明可以以某种方式更好地组织时,我都会进行适当的更改。

你永远无法期望设计完全正确。实际的细微差别会在实现过程中显现出来,通过不断地重构,你始终努力达到更好的设计和分解代码的目标。


2
我认为正确的答案是:总是! 当我在开发新功能时,如果看到可以重构的代码片段,我就会直接进行重构。 因为我使用TDD,所以我不担心旧功能会停止工作。

2

0
通常我只有在知道我将要复制代码时才会这样做。因此,在编写新功能时,如果我发现自己说“嗯,我在其他地方做过类似的事情……”我会尝试看看如何重构原始代码,以尽可能多地实现代码重用。

0

我在编写代码的同时进行重构,并尽力保证快速和安全 - 代码区域经过更好的测试,我就能更快、更安全地进行操作。

此外,我会标记那些需要进行大规模改进的区域或架构问题,并尝试将这些较大的工作单独安排 - 通常,导致它们变得更大的原因是缺乏测试,这意味着我必须花费一段时间来添加所需的测试。


0

针对一个具体的问题:有一个项目,其中一些糟糕的代码(甚至是已经离开公司的人写的)在几个月内被编写出来。完全重写是不可行的,我无法向客户或管理层解释。

因此,我想知道在这种情况下,在对该模块进行更改之前重构某个模块是否可行。

我知道这不是最好的情况,但上下文是一个特殊情况(代码已经损坏,无法全部重写)。


从编写测试开始,逐步重构代码,一定要确保不会破坏当前的功能。 - Eran Galperin
我同意Eran的观点。同时,尝试阅读《遗留代码有效工作》这本书,对于这些情况会有很大的帮助:http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052 - orip

0

我会说我也会寻找代码异味,但我想更具体一些。我正在使用一个由我设计的框架,随着每个项目的发展而不断壮大和演变。在项目早期,我通常会进行大量的重构和重新设计(让自己保持分离是我仍在努力的事情),并且随着接近截止日期和解决任何问题或代码异味的时间越来越近,我会放松并专注于我的特定实现。在这样做的过程中,我通常会发现(或创建)一些功能上可行但我并不完全满意的东西。我会记录这些问题,并在下一次迭代项目时解决这些问题。

当我回到代码时,有时我会发现有一种更优雅的处理方式,然后为自己没有早点看到它而感到遗憾。有时候,我会发现有一种更好的方法,但它不是我最初设想的方式。有时候我发现它的现状很好,改变它会过度设计。其他时候,我发现在修复其他问题时,我的原始问题已经消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接