在Visual Studio中,有没有办法按用法对私有方法进行排序?

时间:2016-10-29 21:11:45

标签: c# visual-studio refactoring

在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的{​​{1}}。我想(自动)按此顺序对这些方法进行排序,以便类看起来像这样:

TestB

我需要能够选择一个类,请求这样的方法排序,并让方法自动排序。即,我不想手动对这些方法进行排序。

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

更新

这种以这种方式对方法进行分类的想法来自Robert C. Martin的清洁代码书。在第3章中,定义了Stepdown规则,该规则讨论了在低级函数之前出现更高级别的函数。

在google上快速搜索stepdown规则,我在http://plugins.netbeans.org/plugin/58863/stepdownruleplugin找到了一个netbeans插件

我猜它会像我需要的那样做,但对于netbeans。

5 个答案:

答案 0 :(得分:11)

ReSharper插件" Greenkeeper"做的工作:

https://bitbucket.org/denniskniep/greenkeeper

该插件可以对" newspapermode"中的方法进行排序:首先是重要代码,在底部是详细信息。报纸模式与" Stepdown规则"。

具有相同的行为

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

答案 1 :(得分:9)

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

它提供了至少两个可以想到的选项:

1)将File and Type Layout首选项与模式一起使用,

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

希望有所帮助。

答案 2 :(得分:9)

以下是没有人参考的其他产品可以通过友好的请求添加功能:

自己写这个并不难。 VS2015设置中提供了新的Visual Studio VSIX Project 模板,如果您无法在(文件>新建>项目... Visual C#和可扩展性)下找到它们,只需修改安装(cmd> ; appwiz.cpl> VS2015更改/修改)。

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

你需要的另一件事是调用堆栈,我们的一位有帮助的Stackoverflowr在这里提供了代码:How to get stack trace of a running process from within a Visual Studio add-in?

鉴于这是一个赏金,你可能期待一个完整的解决方案,抱歉,我没有时间为你编写代码,但如果你遇到任何问题我很乐意帮助你。请在评论中告诉我。

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

答案 3 :(得分:2)

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

您应该采取的步骤是:

  1. 创建CodeFix项目
  2. CodeFix的逻辑,使用Roslyn,将分析文档中的所有方法,并在方法之间创建依赖关系图。比它会改变顺序并将代码重写到文档
  3. 安装CodeFix作为分析器,并将其用于您想要的每个visual studio文档

答案 4 :(得分:1)

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

下面的代码显示了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;}
                }
            }