Refactoring (Restructuration de code ) J.M. Vanel
Refactoring: Plan Les symptômes: les mauvaises odeurs Définition Exemples
Définition d'un Refactoring Changement à fonctionnalité égale Appuyé par des tests Par étapes successives Premature optimization is the root of all evil. Donald Knuth
What Motivates Us to Refactor? Make it easier to add new code. Improve the design of existing code. Gain a better understanding of code. Make coding less annoying.
Principes Beaucoup d'yeux Code lisible par l'homme Martin Fowler said it best: Any fool can write code that a computer can understand. Good programmers write code that humans can understand. Garder la propreté À petits pas La dette de mauvaise conception
Mauvaises odeurs: défauts majeurs méthodes et classes trop longues duplication de code Mauvais nommage arguments trop nombreux
Mauvaises odeurs: défauts locaux réutilisation de variables temporaires pour plusieurs usages différents Nombres en dur Commentaires !
Mauvaises odeurs: défauts OO pas d'encapsulation des champs Objets immuables Switch, codes de types Cast (transtypage), instanceof Trop de static
Mauvaises odeurs: défauts architecturaux comportement métier et couche infrastructure mélangés trop de dépendances croisées ou cycliques entre classes ou paquetages À détecter avec JDepend hiérarchies d'héritage parallèles
Mauvaises odeurs: autres défauts - 1 Nécessité de changements dans plusieurs classes (shotgun surgery) Changement divergent Envie pour les attributs d'une autre classe (feature envy) Données groupées (data clumps) Usage excessif des types simples (Primitive obsession) Généralité inutile (speculative generality)
Mauvaises odeurs: autres défauts - 2 Champs utilisés occasionnellement (temporary fields) Chaînes de messages L'intermédiaire qui fait surtout de la délégation (middle man) Trop d'intimité (inapropriate intimacy) Classes alternatives avec interfaces différentes Classes de données pures (Data Class)
Mauvaises odeurs: autres défauts - 3 Conventions de nommage implicites À remplacer par introspection Tout ce qui est détecté par les outils classiques ( PMD, Checkstyle, ...) Complexité cyclomatique
Exemples de Refactoring Extraire: Méthode, classe, variable Renommer Déplacer (Méthode, classe, variable) D'une classe à une autre quelconque Entre parent et descendant Changer arguments méthode ==> eclipse fait tout ça