Language agnostic 解释重构 问题:

Language agnostic 解释重构 问题:,language-agnostic,refactoring,Language Agnostic,Refactoring,我的问题是,如何教授整理和重构代码的方法和重要性 背景 我最近正在为一位同事进行代码审查。他们对一项早已过时的工作做了一些修改。在新的更改过程中,我的同事曾尝试重构项目,但在项目遇到崩溃或其他问题时(而不是千方百计寻找问题的根源)就放弃了,因此重新实现了问题代码,并在此基础上构建了更多。这让代码陷入了一个混乱的解决方案和神奇的数字中,所以我和他们坐下来一起进行重构 我试图解释我是如何确定我们可以重构的地方,以及每次重构如何经常突出新的领域。例如,有两个变量存储相同的信息-为什么?我猜这是一个更大

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

背景 我最近正在为一位同事进行代码审查。他们对一项早已过时的工作做了一些修改。在新的更改过程中,我的同事曾尝试重构项目,但在项目遇到崩溃或其他问题时(而不是千方百计寻找问题的根源)就放弃了,因此重新实现了问题代码,并在此基础上构建了更多。这让代码陷入了一个混乱的解决方案和神奇的数字中,所以我和他们坐下来一起进行重构

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

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

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

…最后。。。
我知道什么需要重构,什么不需要重构,以及如何重构都是非常主观的,所以我想避开这一讨论,但我有兴趣了解其他人如何应对教授这一重要技能的挑战,以及这里的其他人是否有过类似的经验,以及他们从中学到了什么(无论是作为老师还是学生)。

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


下面是应该使用重构的时间列表(代码气味列表)

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


重构可以是一门艺术,只需要练习。你做得越多,你做得越好。继续学习Martin Fowler的《分形》一书中描述的方法,并使用你的工具(Resharper for Visual Studio folk)

如果你还没有读过,Martin Fowler有一本关于这一主题的好书,书名为。他详细介绍了如何以及为什么要重构特定的代码


我甚至不敢提及这本书,因为我担心有人问起重构问题时会假设我知道这本书,你会想,“嗯,我是说除了福勒的书之外。”但是,嘿,你说得对。:-

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

与大多数编程一样,重构技能需要实践和经验。认为它可以被教授是很好的,但是它必须被学习——而且在不同的环境中可以完成的学习量有很大的差异


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

一种简单的重构方法就在这个名字里——就像从等式中计算出一个公共变量:

xy + xz
变成

x(y + z)

x已经算出了。重构代码也是一回事,因为你会发现重复的代码或逻辑并将其分解。

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

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

给出教科书式的例子。这里的一个缺点是,您可能有一些人为的或过于简单的例子,说明重构为什么有用,但这些例子并不一定像在其他情况下那样明显

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