8

问题

我的问题是如何教授整理和重构代码的方法和重要性?

背景

我最近正在为一位同事进行代码审查。他们对久违的同事作品进行了一些修改。在新更改期间,我的同事曾尝试重构项目,但一旦遇到崩溃或其他问题就放弃了(而不是追着兔子往洞里找问题的根源),因此重新实现了问题代码和在此基础上构建更多。这让代码陷入了一堆变通办法和幻数之中,所以我和他们坐下来进行重构。

我试图解释我是如何确定我们可以重构的地方,以及每次重构通常如何突出新领域。例如,有两个变量存储了相同的信息——为什么?我猜想这是解决更大问题的一种解决方法,所以我取出一个变量并把兔子追到洞里,在我们进行的过程中发现了其他问题。这最终导致我们发现了一个问题,即我们多次循环相同的东西。这在很大程度上是由于使用了幻数大小的数组混淆了正在做的事情——修复最初的“双变量”问题导致了这一发现(和其他发现)。

当我和同事一起进行重构之旅时,很明显她并不总是能够理解我们为什么要进行某些更改以及我们如何确保新功能与原始功能相匹配,所以我花时间解释和证明通过与早期版本进行比较并在纸上逐步完成每个更改。我还通过示例解释了如何判断重构选择是否是一个坏主意,何时选择注释而不是代码更改,以及如何选择好的变量名。

我觉得坐在一起做这件事的过程对我自己(我必须了解更多关于如何最好地向他人解释事物)和我的同事(他们必须了解更多我们的代码和我们的编码实践)都是值得的但是,这段经历让我想知道是否有更好的方法来教授重构过程。

……最后……

我知道什么需要或不需要重构,以及如何重构它是非常主观的,所以我想避开那个讨论,但我有兴趣了解其他人将如何应对教授这项重要技能的挑战,如果其他人这里有类似的经历以及他们从他们身上学到的东西(无论是作为老师还是学生)。

4

9 回答 9

3

像大多数编程一样,重构技能伴随着实践和经验。认为可以教授它会很好,但它必须被学习——并且在不同环境中可以完成的学习量存在显着差异。

要回答您的问题,您可以以教学方式教授重构方法和良好的设计,这很好。但是,归根结底,你我都知道,只有通过长期的艰苦经验才能达到一定的水平。

于 2008-10-23T18:06:25.053 回答
2

我不是 100% 理解您的问题,但我认为您可以参考需要重构的Code Smell 。它包含很多示例,您可以向其他人展示。

这是应该使用重构的列表(代码异味列表

于 2008-10-23T17:50:53.090 回答
2

如果您还没有阅读过,Martin Fowler 有一本关于该主题的优秀书籍,名为Refactoring: Improvement the Design of Existing Code。他详细介绍了如何以及为什么要重构一段特定的代码。

我什至不愿提及它,因为担心有人询问重构时会假定您对这本书的了解,并且您会认为,“呃,我的意思是除了Fowler 的书。” 但是,嘿,你去吧。:-)

于 2008-10-23T17:59:34.490 回答
2

你没有提到测试。要“证明”重构不会破坏现有功能,您需要在进行重构之前进行现有测试或编写测试。

于 2008-10-23T18:00:24.677 回答
1

结对编程似乎是我理解这一点的最佳方式。这样,当我们在处理真实的生产代码时,我们都遇到了一些味道不对的代码,我们一起解决了代码重构问题。这对作为司机的良心说做正确的事而不是快速修复,反过来,他们都知道在这个过程中好的代码是什么样的。

重构可以是一门艺术,只需要练习。你做的越多,你就越擅长。继续研究 Martin Fowler 的 Ractoring 书中描述的方法,并使用你的工具(Resharper for Visual Studio 民间)

于 2008-10-23T17:53:06.517 回答
1

一种构想重构的简单方法就在名称中——就像你从等式中分解出一个公共变量一样:

xy + xz

变成

x(y + z)

x 已被分解。重构代码是一回事,因为您要找到重复的代码或逻辑并将其分解。

于 2008-10-23T18:13:56.350 回答
1

听起来你的方法是一个非常好的方法。在这个过程的最后,你展示了你是如何发现和解决很多问题的。出于教育目的,发明新的更改/增强/修复可能会很有趣。然后,您可以询问您的导师,他们将如何使用旧的新代码库进行更改。希望他们会看到使用重构的代码进行新的更改要容易得多(或者如何进行更多的重构是为假设的更改做准备的最简单方法)。

于 2008-10-23T18:16:27.560 回答
1

我看到了几种不同的方法,你可以尝试教授重构:

给出类似教科书的例子。这里的一个缺点是您可能有人为或简单化的示例,其中重构有用的原因并不一定像在其他情况下那样突出。

重构现有代码。在这种情况下,您可以使用您要清理的现有遗留代码,或您自己的开发代码,并显示之前和之后的各种位,以查看之后在可读性和易于维护方面有多好。这可能是一个更好的练习,因为这是在某种程度上改进和增强实时代码。

这不是某人可以立即掌握的东西,它需要时间、练习、努力和耐心,因为一些重构可能是出于个人喜好,而不是因为代码以一种或另一种方式以最佳方式运行。

于 2008-10-23T18:22:33.260 回答
1

教别人在不自然时进行重构是一项艰巨的工作。以我的经验,你最好的选择是在办公室和他们坐下来重构一些代码。当您这样做时,请保持“意识流”对话。谈论你所看到的,为什么代码闻起来不对,重构的选项等等。你还应该确保他们在做同样的事情。最重要的是说明为什么而不是如何更改代码。任何体面的程序员都可以做出改变并让它发挥作用,但是需要技巧和经验才能说明为什么新解决方案比以前的解决方案更好。

于 2008-10-23T18:23:24.677 回答