重构重复代码为方法

7
我正在使用Resharper进行重构。当您在约5个不同的事件中有相同的代码被调用,但您想要用方法调用替换它们并将该代码放置在该方法中时,这种类型的功能叫什么?并自动完成所有操作。谢谢。

已经过去了13年,但是Resharper仍然没有提供类上下文重复代码重构的功能... - StackHola
3个回答

14

我一直在开发一个Resharper插件,可以做到你所需要的功能。也就是说,它会扫描你的代码,寻找可由现有方法调用替换的部分。这些部分可以是整个方法或仅是方法的一部分。当它找到这样的部分时,灯泡会弹出并提供将该部分替换为对现有方法的调用的选项。

alt text
(来源:landofjosh.com

我称它为AgentRalph。目前它还不适合生产使用,但我已经取得了很大进展,希望很快发布一个版本。


3

2
如何一次将它们全部传递到方法中?相同的代码在多个事件中找到。 - Shawn Mclean
1
我认为这是不可能的。但你仍然可以轻松地实现它。提取方法一次,将从该提取中复制并粘贴方法调用到其他位置,并根据需要重命名参数。或者,使用Resharper为每次复制代码提取一个方法,然后删除所有方法,只替换剩下的方法调用。 - jason
1
Extract Method 的典型用法是将两个几乎重复的代码块分别提取到自己的方法中;使用其他重构方法使这两个方法相同;将对 Method2 的调用替换为对 Method1 的调用;删除 Method2。当然,在每次重构之间运行单元测试。重复此过程,直到所有重复项都消失。 - John Saunders
1
@jason,我认为这不是一个好方法。使用“提取方法”功能的优势在于发现重复的代码并将其提取出来,而不是将此发现委托给开发人员。这需要由工具完成,如Eclipse所做的那样。 - Dherik
很遗憾,这只能在同一个方法(相同的上下文?)中识别重复出现,不能在整个类中识别。 :) - Vetras

1

请查看我们的C# CloneDR。虽然它不能用函数调用替换冗余代码,但它可以告诉您在非常大的系统中它们的位置,并形成基本的抽象(过程体和参数)。该网站链接提供了C#版Hibernate(NHibernate)的示例克隆分析。


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