如何提取常见/类似的代码块以在Visual Studio C中运行#

时间:2014-10-31 12:32:37

标签: c# regex visual-studio-2012 resharper automated-refactoring

我想选择代码,例如

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做。

我认为我也可以通过正则表达式实现这一点,但我还没有正常的表达。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

使用三个有用的ReSharper工具可以分三步完成:

  • 提取到方法
  • 介绍参数
  • 使用模式搜索

没有ReSharper的可能替代方案位于底部


  1. 选择一个违规代码块提取到方法

    Ctrl + R M )***或右键单击重构< / em>→提取方法

    <强>结果:

    GroupCommonStuf()
    {
        doSomething(myEnum.firstThing)
        doSomethingElse(myEnum.firstThing)
        evenMoreStuff(myEnum.firstThing)
    
    }
    
  2. 选择一个&#34; myEnum.firstThing&#34;在函数中,介绍参数 Ctrl + R P )或右键单击重构介绍参数

    向导非常自我解释:)

    <强>结果:

    GroupCommonStuf(myEnum type)
    {
        doSomething(type)
        doSomethingElse(type)
        evenMoreStuff(type)
    }
    
  3. ReSharper→查找使用模式搜索(点击替换标签)

    OR 选择未触及的违规代码块,右键单击*→查找类似代码

  4. 点击添加PlaceHolder→&#34;输入&#34; =参数→&#34;名称&#34; =枚举

  5. 输入以下内容:

    Enter image description here

    <强>结果:

    使用匹配的上述模式脚本代码块:

    doSomething(myEnum.firstThing);
    doSomethingElse(myEnum.firstThing);
    evenMoreStuff(myEnum.firstThing);
    

    将替换为

    GroupCommonStuf(myEnum.firstThing)
    

    对于枚举的任何变体都是一样的:)。

  6. 关于此处的内容的一些解释

    简而言之,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);
    

    通过使用正确的占位符,您可以通过一次搜索完成此操作并替换:

    enter image description here

    • $ args $(一个参数占位符)负责移动任何参数,在这种情况下它只是一个,但它可能是几个。
    • $ variableOfArray $(类型占位符,正则表达式设置为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

    使用模式搜索→ 这对我来说显然是很难的,有三个选项我不会特别想要探索,而我的猜测通常需要更多的时间才能手动进行更改:

    • 非常聪明的正则表达式(这可能在Visual Studio本身中很烦人)
    • 使用聪明的sed重写Bash脚本(在Visual Studio中只是略微改进,但仍然很难)
    • 编写自己的解析器???当所有其他方法都失败时......代码!