Clean Code, Refactoring et Resharper

Le refactoring, il est toujours bon de le rappeler, consiste à réécrire du code existant sans modifier son comportement : aucun ajout de fonctionnalité, aucune correction d’anomalie.
Le développeur refactore (du verbe refactorer, 1er groupe) (vous me pardonnerez le néologisme) (mais qui parle réellement de réusinage ?) (à part les Québécois) chaque jour. Tous les jours. Au moins jusqu’à un certain point. Et le bon développeur aime lire et écrire du code propre. D’ailleurs, Fathi vous en parle régulièrement.
Le très bon développeur s’outille en conséquence. Et il apprend à maitriser son outil en vue d’améliorer son efficacité et sa productivité. Partons de l’idée que le développeur dans le monde .NET maitrise déjà son IDE, Visual Studio. Ce dernier embarque déjà un certain nombre d’outils de refactoring, situés dans le menu Edit :
Mais Resharper va beaucoup BEAUCOUP plus loin dans ce sens, en incitant à respecter un certain nombre de bonnes pratiques. Dans cette série d’articles, nous verrons donc un certain nombre de techniques de refactoring et comment Resharper nous aide à les exécuter. Nous partirons des cas les plus communs pour aller progressivement vers les cas les plus complexes. Je me baserai sur le catalogue de techniques de Martin Fowler. Et pour illustrer les exemples, j’utiliserai des katas disponibles sur le Github de Emily Bache.
Nettoyer le pont
La première étape d’un refactoring, quand on se trouve en face d’un code existant écrit par un autre développeur est de nettoyer le pont. Comme son nom l’indique, cette étape consiste à rendre le code plus lisible afin de s’y retrouver. Tous les refactorings possibles par rapport au contexte dans lequel vous vous situez sont accessibles avec le raccourci Ctrl+Maj+R.
Renommage (Ctrl R+R)
C’est probablement le refactoring que l’on utilise le plus. Il consiste à renommer une variable, une propriété, une méthode ou une classe afin de lui donner un nom plus explicite et préciser l’intention du code, son but. Ce refactoring existe également nativement dans Visual Studio, mais Resharper propose également de renommer votre variable si elle est utilisée dans des littéraux (propriétés de binding Xaml, INotifyPropertyChanged, etc.).
Dans le cas ci-dessous, nous voyons que les variables ne sont pas nommées de façon homogène. Nous allons donc y remédier. Notons que Resharper propose par défaut des options, le plus souvent pertinentes.
Introduce Field (Ctrl R+F)
Autre refactoring courant, l’introduction d’un champ. Toujours dans le kata Tennis, nous voyons de nombreuses occurences de chaînes de caractères qui ont un sens fonctionnel. Ici : “love”, “fifteen”, etc. Nous allons donc introduire des constantes.
Nous voyons au passage que Resharper expose un certain nombre d’options de façon à générer le code souhaité et qu’il propose de renommer l’ensemble des occurrences trouvées de cette chaîne de caractères.
Le nettoyage de pont peut également prendre d’autres formes. Nous voyons, par exemple, de nombreux if sans accolades. Nous pouvons y remédier facilement en sélectionnant la zone à encapsuler et en utilisant le raccourci Alt + Entrée, qui sert à effectuer l’ensemble des opérations de nettoyage que propose Resharper dans la barre latérale à droite du code et que l’on peut également corriger à la souris avec les ampoules ou icône marteau qui apparaissent dans la barre latérale à gauche du code :
L’objectif de la phase de nettoyage du pont est donc de nettoyer le code. Le rendre plus aéré, plus lisible. Les exemples ci-dessus ne sont pas exhaustifs. D’autres refactorings simples sont possibles : suppression du code mort (attention néanmoins au piège de la réflexion ! Des méthodes et propriétés peuvent être appelées sans qu’on le sache), suppression des commentaires devenus superflus avec le renommage, réindentation (Ctrl + K, D), etc.