我想选择代码,例如
doSomething(myEnum.firstThing)
doSomethingElse(myEnum.firstThing)
evenMoreStuff(myEnum.firstThing)
并将其转换为函数
GroupCommonStuf(myEnum.firstThing)
看起来像:
GroupCommonStuff(myEnum id)
{
doSomething(id)
doSomethingElse(id)
evenMoreStuff(id)
}
最好能捕获任何代码:
doSomething(myEnum.secondThing)
doSomethingElse(myEnum.secondThing)
evenMoreStuff(myEnum.secondThing)
并将其转换为
GroupCommonStuf(myEnum.secondThing)
等
我安装了ReSharper。但是ReSharper中的extract方法似乎只提取了我选择的代码块。它不会传播其他“类似代码”,我相信Eclipse会为C ++和Java做。
我认为我也可以通过正则表达式实现这一点,但我还没有正常的表达。我怎么能这样做?
答案 0 :(得分:4)
使用三个有用的ReSharper工具可以分三步完成:
没有ReSharper的可能替代方案位于底部
选择一个违规代码块提取到方法
( Ctrl + R , M )***或右键单击→重构< / em>→提取→方法)
<强>结果:强>
GroupCommonStuf()
{
doSomething(myEnum.firstThing)
doSomethingElse(myEnum.firstThing)
evenMoreStuff(myEnum.firstThing)
}
选择一个&#34; myEnum.firstThing&#34;在函数中,介绍参数( Ctrl + R , P )或右键单击→重构→介绍参数
向导非常自我解释:)
<强>结果:强>
GroupCommonStuf(myEnum type)
{
doSomething(type)
doSomethingElse(type)
evenMoreStuff(type)
}
ReSharper→查找→使用模式搜索(点击替换标签)
OR 选择未触及的违规代码块,右键单击*→查找类似代码
点击添加PlaceHolder→&#34;输入&#34; =参数→&#34;名称&#34; =枚举
输入以下内容:
<强>结果:强>
使用匹配的上述模式脚本代码块:
doSomething(myEnum.firstThing);
doSomethingElse(myEnum.firstThing);
evenMoreStuff(myEnum.firstThing);
将替换为
GroupCommonStuf(myEnum.firstThing)
对于枚举的任何变体都是一样的:)。
关于此处的内容的一些解释
简而言之,ReSharper在()之间找到任何参数并将它们存储在变量&#34; enumeration&#34; (名称实际上并不重要)。然后在变量块中出现变量出现的任何位置插入该字符串参数。
有不同的placeholders做不同的事情,使用正确的事情很重要。 &#34;类型&#34;占位符甚至支持正则表达式,这使得它非常强大。
在这种情况下,您只需输入$ enumeration $,因为默认占位符是&#34; arguments&#34;。但是我会建议养成使用&#34;添加占位符&#34;因为当你做更复杂的模式时会更清楚。重要的是你要知道它不仅仅是将字符串放入变量&#34;。
为了更好地解释这一点,请考虑这个例子,假设你有以下代码:
... = GetGraphic(Graphics.First).ShapeArray[index].ShapeColour
... = GetGraphic(Graphics.Second).ShapeArray[index].ShapeSize
... = GetGraphic(Graphics.First).ShapeArray[index].ShapeSize
你决定用类似于
的代码替换所有这些代码... = GetShapeColour(Graphics.First, index);
... = GetShapeSize(Graphics.Second, index);
... = GetShapeSize(Graphics.First, index);
通过使用正确的占位符,您可以通过一次搜索完成此操作并替换:
Shape*
)负责移动ShapeColour,ShapeSize&#34;变量类型&#34;名称如果您使用了&#34;参数占位符&#34; for&#34; variableOfArray&#34; Resharper会说它无法找到任何模式,因为没有GetGraphic(..)。ShapeArray [index]。(..)。
没有ReSharper的可能解决方法:
提取到方法→Extract Method Refactoring
介绍参数→&#34;查找替换&#34;有/无Promote Variable To Parameter
使用模式搜索→ 这对我来说显然是很难的,有三个选项我不会特别想要探索,而我的猜测通常需要更多的时间才能手动进行更改: