重构:这仅仅是清理代码的幻想吗?[关闭]


21

在马丁·福勒(Martin Fowler)的书《重构:改进现有代码的设计》问世之前,我们习惯将对代码的主要更改称为“重新架构”,而将较小的更改称为“清理”。IMO,重构技术都是常识/我们一直在做的显而易见的事情。

您认为重构曾经是新事物吗?也许只是一种诱使管理人员分配时间进行代码清理的方法?


当您说“书出版之前”时,我想您指的是马丁·福尔韦(Martin Folwer)的书,这是正确的吗?
AlexC 2011年

-1:这个问题的用处是什么?
Jim G.

是的,福勒的书。
Chuck Stephanski

Answers:


43

重构比丘陵还要古老,所以不,它不是什么新鲜事物。

重构并没有清除。可以,但不仅限于清理。

它在保留行为的同时调整了应用程序的体系结构(无论是大规模还是小规模)。

这意味着,尽管您的应用程序的某些部分昨天可能已经很干净了,但是今天的新功能需要调整该部分以适应新功能。

您不想破坏现有功能,因此可以在保留行为的同时调整应用程序的结构-这就是重构。

这表示无论对代码进行什么更改,都应该始终运行其测试...以防万一。


1
Newtopian:这是至关重要的一点。如果您尚未运行测试,则不知道您是随机入侵某些东西还是实际重构了。(当然,您需要足够的测试套件!)
Frank Shearar 2011年

9

这只是整理代码。本质上,程序员(尤其是Martin Fowler)注意到,每次整理代码时,他们往往会执行相同的任务。他们定义并标记了整理方法和相关的代码问题,并为之加油!重构诞生了。

设计模式是相同的-人们注意到他们倾向于一遍又一遍地使用相同的方法来解决特定问题。他们标记并定义了这些方法,现在看来您不是真正的程序员,除非您仅在代码中使用相同的十几个模式。

重构没有魔术。这只是描述旧习惯的一组新术语。


William Opdyke,1992年:重构面向对象的框架。Fowler&Beck和朋友们大力推广了重构。乔恩·布兰特(Jon Brant)和唐·罗伯茨(Don Roberts)在1999年之前的某个时间实施了第一个自动化工具。因此,“新术语”并不是很准确。
Frank Shearar 2011年

如果您接受自1800年代中期Ada Lovelace以来一直在进行的计算机编程,那么可以-它是相对较新的术语。
蚂蚁

1
我认为与设计模式不同的是,几乎每个开发人员都从本书中学到了一些新的模式,因此也学到了一些新的交易工具。通过重构,我觉得没有人真正学到任何东西。仅给某物起一个名字具有次要的价值(设计模式的比较在那里存在),但他本可以在博客文章中做到这一点。
Chuck Stephanski

确实,我提到过,相对于lambda演算,这是新的行话。
Frank Shearar 2011年

@Chuck,您读过本书,重构吗?如果是的话,我会非常如果你没有学到惊讶的东西新的从它。
马西(Marcie)

7

我们在公司中做三件事,为这三件事分配时间:

  • 重构:在于更改代码结构,从而保持行为。

示例:将一个丑陋且难以理解的100行方法拆分为四种可重复使用的方法,每种方法可以做四件事,每个方法25行。

  • 清除:进行少量修改以使代码更具可读性,而不修改其行为或结构。

示例:在确保不再需要此代码后,删除注释的代码。

  • 实施StyleCop / FxCop规则:检查代码是否与StyleCop或FxCop规则的默认集合匹配,如果不匹配,则对其进行修改以匹配这些规则。

实施例:将Culture.Invariantstring.Format(或其他培养物,其是更合适)。

因此,就我而言,重构与清理大不相同。在做清理工作,我没有再次运行单元测试:如果代码工作之前,它清除后工作。换句话说,这不是因为我删除了空行或添加了注释,代码将停止工作。另一方面,当我重构旧代码的复杂部分时,我可能会犯一些错误,因此我必须在重构后运行单元测试。


4
尽管我同意清理和重构之间存在根本的区别,但在很多情况下,这条线会模糊很多。从方法签名或剩余的关联中删除死类并“清理”对它的所有引用将被视为清理或重构。我也强烈不同意运行单元测试是可选的。您不知道事情如何破裂。我看到了异常中断代码的消息字符串中的更改,因为有人认为将其解析为对某些错误采取措施是一个好主意。
Newtopian 2011年

我必须同意Newtopian,尤其是关于不必重新运行测试。实际上,应该有一个自动化测试套件,其运行频率不低于每次提交一次。不管是清理还是重构,如果您更改了代码以提交到版本控制,都应该运行测试。
kojiro 2011年

在进行任何清理后,您始终应进行完整构建-即使只是空白且注释更改。询问任何Python或Makefile作者。
JBR威尔金森2011年

3

重构为您的代码增加了知识。如果您知道某个东西的名称不正确,则可以给它起一个更好的名字。如果您知道可以做得更好,则可以将其更改为更好的东西。

这是很多步骤,无论大小,都有望使程序更好。


3

我同意“重构是花哨的单词,可以清理代码”,但不赞成。人们使用花哨的单词是有原因的:有时是因为他们想显得聪明,有时是因为他们传达了更大或更精确的含义,而恕我直言的重构(即使偶尔被滥用)通常是指后者。

“清理”可能意味着从“重新格式化”到“重写大块”的任何内容。

“重构”特别是指“对代码进行少量的增量更改,以保持相同的功能,同时将其转换为更好的设计”。在您做的事情上有很多最佳实践:有些是临时的,但是有一些通用的原则,例如使用单元测试,将部分函数提取到新函数或类中,等等,人们可以并且应该学习。

您说“只是把技巧管理分配给代码清理时间”。但是,如果说“重构”正确地传达了这样一个概念,那就是现在进行稳定的透明投资将在将来提高效率,这不是“把戏”,而是清晰有效的沟通。


2

重构是对代码的编码,而归一化是对关系数据的编码。这是一个将概念抽象为更清晰,更清晰和更有效的表示形式的应用程序过程。


1
这是一种有趣的观察方式。也许它来自我的数据库背景,但是有一些让我感到烦恼的是重构的压力,而您已经帮助了我。就是说,在数据库中,您在设计中未解决的问题需要花费10倍的时间才能解决,而在生产中可能要花费1000倍。因此,一个好的DBA会尽早将事情做好。我的直觉是,在以后的阶段进行过多的重构意味着设计上花费的时间太少。
2011年

@ user21007:代码比数据库模式复杂得多,但是更容易更改和部署。
凯文·克莱恩

1

这取决于您如何理解术语重构。对于大多数人来说,这是在不改变行为的情况下改善结构的过程。如果您同意,那么是的,在本书问世之前就已经完成了。我知道,因为(在许多其他事情中)我在写本书之前重命名类,提取类和提取方法。我并不是说它是重构的,但实质上,我在做完全相同的事情。

对我来说,个人重构就是人们现在所说的“自动代码重构”,即:支持IDE内的各种重构技术。这是对我之前所做的事情的真正改进(确实非常痛苦)。我可以在一堂课中进行更改,而不必担心这将如何影响软件的其余部分。我认为Martin将重构技术正式化,直到可以将其表示为算法,然后在各种IDE中实现为止。

因此,如果您将重构理解为一个过程,那么它并不是什么新鲜事物。如果您将其视为自动化,那么它是一项巨大的改进。尝试在一个相当大的项目中重命名几个核心类(实际上,不是通过IDE的重构选项),以了解原因:)


0

重构的确是代码“清理”,但也重构了代码。在我的团队中,重构通常是后者。当我们遇到“重构”情况时,我们会分配时间来重构代码,例如,使其与新的体系结构或信息模型保持一致,或者使其效率更高。

代码“清理”是我们连续执行的工作,没有为其专门分配时间。对我来说,“清除”通常是重命名,清除注释等。


1
重命名是一种标准的重构技术!
Chuck Stephanski

0

我会说不。

重构过程中可能需要清理,但这不是本质。

清除是基于先前代码不干净的假设进行的。实际上,即使原始代码已经干净,开发人员也可以重构其代码。

DRY是重构背后的关键驱动力。

在将新代码添加到现有代码库中时,由于DRY原理,自然可以完成重构。

我的0.02


0

清理代码就像整理房子,重构就像拆掉一堵墙,可能把它放在其他地方一样


0

当其他人打扫您的房子时,您什么也找不到,因为目标是使事情变得干净整洁。重构将建立并标记房间,壁橱,橱柜,架子,垃圾箱等。它仍然可以容纳大部分相同的东西(您仍然可以在厨房里做一个烤奶酪三明治,然后在客厅里吃它),但是应该这样做更容易找到,并且可能有放置新事物的有效场所。


我不是流行语的狂热者,但有时需要对常见任务进行标记和形式化,以便每个人都知道您在说什么。一位客户报告一个错误,然后经理大喊:“清理代码!” 您知道他们不是在谈论重构。
JeffO 2011年

0

术语“重构”是从代数中优雅地借用的。这意味着简化术语以产生相同的结果。它不仅优雅,而且是革命性的-它要求对代码进行严格的有限处理,其程度令许多人感到惊讶。因此,该术语本身意义重大且很有帮助。


-1

否。重构是在不改变行为的情况下改善结构。从严格意义上讲,重构需要良好的测试纪律。当您“清理”时,这不一定是必需的。


2
危险的态度。删除整个无效代码和无效配置将清除并更改重构的单个方法的签名。但是在这两种情况下,我都希望获得良好的测试纪律,以确保我不会破坏任何内容。
Newtopian 2011年

我并不是说在没有测试纪律的情况下进行重大更改是很好/安全/理想的。我是说,重构作为一种方法论涉及测试纪律,而“清理工作”根本不是一种方法论。
威利·惠勒

因此,如果我没有正确的名字却正确理解的话,我们很好!:-O,开个玩笑,我明白您要说的是,确实很难将清理工作称为一种方法论,但是再一次,它们都不在重构。这只是个花哨的字眼,它表明您在不更改代码行为的情况下更改了代码。它本身对测试没有任何影响。遵循良好的编码习惯将说明,如果代码发生更改,则无论您如何调用生成更改的操作,都应对它进行测试。
Newtopian 2011年

1
当然可以。测试规则更多地是关于如何执行重构的,但是它并不是定义中固有的。(即,我可以完全不用任何测试就可以重构代码。)我不知道我是否可以同意重构不是一种方法论-整本书都是用逐步模式编写的,依此类推。
威利·惠勒

-1

两者在边缘有些重叠,但对我来说,这是打扫房屋和重塑房屋之间的区别。对我来说,清理并不意味着结构上的改变,而重构却意味着。


-2

“重构”与“重构”实际上是相同的东西,但是具有“功能不变”的更强含义。就重新架构的目标而言,这一点也更加清楚,它通常是将通用代码“分解”为可重用的块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.