2016-10-29 83 views
26

在Visual Studio中,有或没有扩展名,有没有一种方法可以根据自己的使用顺序(它们在调用堆栈中的位置)自动对类中的私有方法进行排序?在Visual Studio中,有没有一种方法可以按使用情况对私有方法进行排序?

例如,考虑下面的类:

public class MyClass 
{ 
    public void MyMethod() 
    { 
     TestC(); 
    } 

    private void TestA() 
    { 
     TestB(); 
    } 

    private void TestB() 
    { 
     Console.WriteLine("Hello"); 
    } 

    private void TestC() 
    { 
     TestA(); 
    } 
} 

这个类中的公共方法是MyMethod,它调用TestC这就要求TestA这就要求TestB。我想(自动)本订购订购这些方法,使类看起来是这样的:

public class MyClass 
{ 
    public void MyMethod() 
    { 
     TestC(); 
    } 

    private void TestC() 
    { 
     TestA(); 
    } 

    private void TestA() 
    { 
     TestB(); 
    } 

    private void TestB() 
    { 
     Console.WriteLine("Hello"); 
    } 
} 

我需要能够选择一类,要求这样的方法排序,并有方法自动排序。也就是说,我不想手动排序这些方法。

我知道有一些细微差别。例如,可能存在一个私有方法,该方法从调用堆栈中两个不同级别的两个方法中调用。我想在这种情况下,考虑公共方法的最小(调用堆栈)距离是有意义的。

UPDATE:

排序以这种方式方法的这种想法来自于清洁守则书由罗伯特C.马丁。在第3章中,定义了降级规则,它讨论了在低级别函数之前出现更高级别的函数。

做对谷歌降压规则快速搜索,我发现了一个NetBeans插件在:http://plugins.netbeans.org/plugin/58863/stepdownruleplugin

我猜想,它类似于我需要的东西,但对于在NetBeans。

+0

ReSharper的声称能以按不同的方式方法。 –

+0

@RawN,我试图找到一种方法来通过Resharper来做到这一点,但我找不到任何。 –

+0

我怀疑你会发现这个开箱即用。你当然可以使用roslyn(https://github.com/dotnet/roslyn)来编码,它可以解析代码,确定调用层次结构等。 –

回答

11

ReSharper的插件“Greenkeeper”做工作:重要的代码在倒数第一和细节:

https://bitbucket.org/denniskniep/greenkeeper

该插件可在“newspapermode”的方法排序。报纸模式与“降序规则”具有相同的行为。

https://bitbucket.org/denniskniep/greenkeeper/wiki/SortingDeclarations

+1

这正是我一直在寻找的。谢谢。这个插件和Resharper 8.2一起工作,我测试过了。我将尝试使它适用于更高版本的Resharper。 –

+0

不会出现在Resharper 2017的列表中:( – willem

+0

对于R#2017的插件应该不是必需的。它已内置到R#中。请在此处查看接受的答案:https://stackoverflow.com/问题/ 1509244/resharper -clean-up-code-how-to-affect-sorting-methods (尽管我还没有尝试过......) – Thomas

9

我不知道是否可以在Visual Studio中本地执行此操作。但是,我认为最好的方法是使用ReSharper(Visual Studio扩展)来执行此操作。

它提供的一些新想法至少有两个选项:

1)使用File and Type Layout喜好有图案,

2)使用的文件结构的窗口(这可能是最快的方式,如果该类你想重新排序没有太多的方法)。你可以check it out here.

希望有帮助。

+2

我真的不明白你的答案。你说你不知道这样做的扩展,但你提供了一些选择。这些选项有什么用途? –

+0

对此感到抱歉。我提到的选项是由Visual Studio扩展ReSharper提供的。我为每个不同的选项提供了链接,以便您轻松更改文件中方法的顺序。其中一个选项使用“文件结构”窗口,通过成员变量,属性和方法向您显示文件的结构。从那里,您可以使用鼠标以任意顺序拖放它们,然后您将在文件中以新顺序查看这些方法。 – Brian

+0

我想这些方法自动排序为重构选项(当然要求),而不是手动。 –

2

如果您想手动触发该逻辑并使用vs 2015,则可以创建一个使用Roslyn的Visual Studio CodeFix。 看到:Build CodeFix ex

,你应该做的步骤是:

  1. 创建CodeFix项目
  2. 的CodeFix使用罗斯林,将分析文档中的所有方法,并创建一个依赖图的逻辑,方法之间。比它会改变顺序和代码重写文件
  3. 安装CodeFix,作为一个分析器,并使用它,你希望每一个视觉工作室文件
+0

虽然这可行,但问题是要求现有的解决方案(如果有的话)。我希望Visual Studio的一个生产力工具已经具备了这个功能。 –

1

简短的回答是NO 见原因很简单,因为大多数开发人员都试图编写易读的代码。如果我需要对TestB进行更新并查看代码,我希望在TestA之后和TestC之前定义TestB。然后,您还要考虑为该类定义的字段以及使用获取/设置方法来设置和获取定义字段的值。

下面的代码显示了2个类。如果另一位开发人员需要更新代码,他们并不是在浪费时间搜索代码,而是为了便于阅读而自己使用的布局中的第一类。第二堂课遵循你想让他们重新安排的方式。

  public class MyClass 
      { 
       private string _HelloWorld; 
       public string HelloWorld 
       { 
        get {return _HelloWorld;} 
        set {_HelloWorld = value;} 
       } 

       public void MyMethod 
       { 
        TestC(); 
       } 

       public void TestA() 
       { 
        TestB(); 
       } 

       public void TestB() 
       { 
        Console.WriteLine(HelloWorld); 
       } 

       public void TestC() 
       { 
        TestA(); 
       } 

      } 

  public class MyClass2 
      { 
       private string _HelloWorld; 

       public void MyMethod 
       { 
        TestC(); 
       } 

       public void TestC() 
       { 
        TestA(); 
       } 

       public void TestA() 
       { 
        TestB(); 
       } 

       public void TestB() 
       { 
        Console.WriteLine(HelloWorld); 
       } 

       public string HelloWorld 
       { 
        get {return _HelloWorld;} 
        set {_HelloWorld = value;} 
       } 
      } 
+1

按照我想要的方式排序方法有一些可读性好处。主要是,你首先了解高层次的方法,然后你往下看看更低层次的方法等。 –

+0

这是一个有效的观点。这一切都取决于你正在与之合作的团队。 –

9

这里有没有人提及的其他产品,可能有一个友好的要求添加的功能:

自己写这个不难。如果您无法在(File> New> Project .. Visual C#> Extensibility)下找到它们,请修改安装(cmd> appwiz.cpl> VS2015更改/修改)。

好消息是,CodeMaid项目是开源的,包含大部分代码&逻辑您将需要重新排列代码块。

你需要的另一件事是调用堆栈和我们有帮助的同胞之一Stackoverflow'rs提供的代码在这里:How to get stack trace of a running process from within a Visual Studio add-in?

鉴于这是你很可能希望一个完整的解决方案赏金,抱歉,我现在没有时间为您编写代码,但如果遇到任何问题,我很乐意为您提供帮助。让我知道在评论中。

要快速启动并运行,我个人只需复制此Visual Studio扩展中的代码,并用调用堆栈重新排序替换胆量:Debug Single Thread

+0

谢谢。因此,似乎没有现有的解决方案,而且我必须创建一个自己的自我,或建立在类似的工具上。 –

+0

是的,或者您可以向我提到的工具的作者之一提出功能请求。你知道当我想按照调用顺序查看代码时会做什么,我只是使用Debug/Code Canvas或Bubble Debugging,这里是一个比较https://blogs.msdn.microsoft.com/kaelr/2012/03/10/ code-canvas-vs-code-bubbles-vs-debugger-canvas /试一试,对你来说它可能比对代码重新排序更好,因为通常有许多不同的分支/路径/重用,一个命令不会总是对的。 –

相关问题