Подтвердить что ты не робот

В 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:

Эта идея сортировки методов таким образом происходит из книги "Чистый код" Роберта К. Мартина. В главе 3 определено правило Stepdown, в котором говорится о наличии функций более высокого уровня перед функциями низкого уровня.

Выполняя быстрый поиск правила отключения для google, я нашел плагин netbeans по адресу: http://plugins.netbeans.org/plugin/58863/stepdownruleplugin

Я бы предположил, что он делает что-то похожее на то, что мне нужно, но для netbeans.

4b9b3361

Ответ 2

Я не знаю, возможно ли это сделать в Visual Studio. Однако я считаю, что лучшим способом было бы использовать ReSharper (расширение Visual Studio) для этого.

Он предоставляет как минимум два параметра, которые приходят на ум:

1) Используя Настройки файла и типа с шаблонами,

2) Используя окно "Структура файла" (это может быть самым быстрым способом, если класс, который вы хотите изменить, не имеет слишком много методов). Вы можете проверить здесь.

Надеюсь, что это поможет.

Ответ 3

Вот другие продукты, на которые никто не ссылался, которые могли бы добавить функциональность с дружественным запросом:

Не так сложно написать это самостоятельно. Новые шаблоны Visual Studio VSIX Project доступны в настройке VS2015, если вы не можете их найти (File > New > Project.. Visual С# > Extensibility) просто измените Install (cmd > appwiz.cpl > VS2015 Изменить/Изменить).

Отличная новость заключается в том, что проект CodeMaid является открытым исходным кодом и содержит большую часть кода и логики, которые вам нужно будет переупорядочить куски кода.

Еще одна вещь, которая вам понадобится, - это стек вызовов, и один из наших помощников Stackoverflow'rs предоставил код для этого здесь: Как получить трассировку стека из текущего процесса из в надстройке Visual Studio?

Учитывая, что это награда, которую вы, вероятно, ожидали полного решения, жаль, что у меня нет времени, чтобы скопировать ее для вас прямо сейчас, но я рад дать вам руку, если вы столкнетесь с какими-либо проблемами. Сообщите мне в комментариях.

Чтобы быстро встать и работать, я лично просто скопировал код в этом расширении Visual Studio и заменил бы кишки на Re-Ordering by Call Stack: Debug Single Thread.

Ответ 4

если вы хотите запустить эту логику вручную, и вы используете vs 2015, вы можете создать визуальную студию CodeFix, которая будет использовать Roslyn. см. Создать CodeFix ex

Действия, которые вы должны выполнить, следующие:

  • Создать проект CodeFix
  • Логика CodeFix, использующая Roslyn, проанализирует все методы в документе и создаст граф зависимостей между этими методами. Чем это изменит порядок и перепишите код в документ.
  • Установите CodeFix, как анализатор, и используйте его для каждого визуального документа студии, который вы хотите.

Ответ 5

Короткий ответ НЕТ См. Причину просто потому, что большинство разработчиков пытаются написать код, который легко читается. Если мне нужно сделать обновление для TestB и посмотреть на код, я бы ожидал, что TestB будет определен после TestA и до TestC. Затем вы также учитываете определенные поля для класса и методы 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;}
                }
            }