26 votes

Dans Visual Studio, existe-t-il un moyen de trier les méthodes privées en fonction de leur utilisation ?

Dans Visual Studio, avec ou sans extension, existe-t-il un moyen de trier automatiquement les méthodes privées à l'intérieur d'une classe en fonction de l'ordre de leur utilisation (leur emplacement dans la pile d'appels) ?

Par exemple, considérons la classe suivante :

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

    private void TestA()
    {
        TestB();
    }

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

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

La méthode publique de cette classe est MyMethod il appelle TestC qui appelle TestA qui appelle TestB . J'aimerais classer (automatiquement) ces méthodes dans cet ordre afin que la classe ressemble à ceci :

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

    private void TestC()
    {
        TestA();
    }

    private void TestA()
    {
        TestB();
    }

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

Je dois être en mesure de sélectionner une classe, de demander le tri des méthodes et de faire en sorte que les méthodes soient triées automatiquement. En d'autres termes, je ne veux pas trier manuellement ces méthodes.

Je comprends qu'il y a des nuances. Par exemple, il pourrait y avoir une méthode privée qui est appelée à partir de deux méthodes qui se trouvent à deux niveaux différents dans la pile d'appels. Je suppose que dans ce cas, il est logique de considérer la plus petite distance (pile d'appels) de la méthode publique.

UPDATE :

L'idée de trier les méthodes de cette manière vient du livre Clean Code de Robert C. Martin. Dans le chapitre 3, la règle Stepdown est définie. Elle consiste à faire apparaître les fonctions de haut niveau avant les fonctions de bas niveau.

En effectuant une recherche rapide sur Google pour la règle de réduction des effectifs, j'ai trouvé un plugin Netbeans : http://plugins.netbeans.org/plugin/58863/stepdownruleplugin

Je suppose qu'il fait quelque chose de similaire à ce dont j'ai besoin, mais pour Netbeans.

11voto

Dennis K Points 388

Le plugin ReSharper "Greenkeeper" fait le travail :

https://bitbucket.org/denniskniep/greenkeeper

Le plugin peut trier les méthodes en "newspapermode" : Le code important en premier et les détails en bas. Le newspapermode a le même comportement que la "Stepdown rule".

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

9voto

Brian Points 109

Je ne sais pas s'il est possible de le faire nativement dans Visual Studio. Cependant, je pense que la meilleure méthode serait d'utiliser ReSharper (une extension de Visual Studio) pour le faire.

Il offre au moins deux options qui me viennent à l'esprit :

1) En utilisant le Disposition des fichiers et des types préférences avec des motifs,

2) En utilisant la fenêtre Structure des fichiers (c'est peut-être le moyen le plus rapide si la classe que vous voulez réordonner n'a pas trop de méthodes). Vous pouvez Regardez ici.

J'espère que cela vous aidera.

9voto

Jeremy Thompson Points 14428

Voici les autres produits que personne n'a référencés et qui pourraient ajouter la fonctionnalité avec une demande amicale :

Ce n'est pas si difficile de l'écrire soi-même. Le nouveau Visual Studio Projet VSIX Les modèles sont disponibles dans la configuration de VS2015, si vous ne les trouvez pas sous (Fichier > Nouveau > Projet Visual C# > Extensibilité) il suffit de modifier l'installation (cmd > appwiz.cpl > VS2015 Change/Modify).

La bonne nouvelle est que le projet CodeMaid est open source et contient la plupart du code et de la logique dont vous aurez besoin pour réorganiser des morceaux de code.

L'autre chose dont vous aurez besoin est la pile d'appel et l'un de nos collègues Stackoverflow a fourni le code pour cela ici : Comment obtenir la trace de la pile d'un processus en cours d'exécution à partir d'un add-in Visual Studio ?

Étant donné qu'il s'agit d'une prime, vous vous attendiez probablement à une solution complète, désolé, je n'ai pas le temps de la coder pour vous maintenant, mais je suis heureux de vous donner un coup de main si vous rencontrez des problèmes. Faites-le moi savoir dans les commentaires.

Pour être rapidement opérationnel, je me contenterais personnellement de copier le code de cette extension Visual Studio et de remplacer l'essentiel par le réordonnancement par pile d'appels : Déboguer un seul thread .

2voto

Eli Dagan Points 480

Si vous voulez déclencher cette logique manuellement et que vous utilisez vs 2015, vous pouvez créer un CodeFix de visual studio qui utilisera Roslyn. voir : Construire CodeFix ex

Les étapes que vous devez suivre sont les suivantes :

  1. Créer un projet CodeFix
  2. La logique du CodeFix, utilisant Roslyn, va analyser toutes les méthodes du document et créer un graphe de dépendance entre les méthodes. Ensuite, il va changer l'ordre et réécrire le code dans le document.
  3. Installez le CodeFix, en tant qu'analyseur, et utilisez-le pour chaque document Visual Studio que vous voulez.

1voto

Chase Woofer Points 11

La réponse courte est NON La raison en est simplement que la majorité des développeurs essaient d'écrire du code qui est facilement lisible. Si je dois mettre à jour le test B et que je regarde le code, je m'attendrais à ce que le test B soit défini après le test A et avant le test C. Il faut également tenir compte des champs définis pour la classe et de l'utilisation des méthodes get/set pour définir et obtenir la valeur d'un champ défini.

Le code ci-dessous montre 2 classes. La première classe est dans la disposition que j'utilise personnellement pour la lisibilité, si un autre développeur a besoin de mettre à jour le code, il ne perd pas de temps à chercher dans le code. La deuxième classe suit la façon dont vous voulez qu'elles soient réarrangées.

            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;}
                }
            }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X