Techniques avancées de refactoring
Parce qu’on a tous un jour rêvé de devenir un Ninja
Agile Testing Day
@NicholasSuter
Consultant / manager / couteau suisse
Visual Studio and Development
Technologies .NET / C#
http://www.nicholassuter.com/
http://blog.cellenza.com/author/nsuter/
Pourquoi parler de refactoring aujourd’hui ?
Tester une nouvelle
application conçue pour
être testable, c’est facile.
Oui, mais… et l’existant ?
1. Description du champ de bataille
2. Détecter et identifier l’ennemi
3. Techniques de combat et armement
Legacy
Le code des autres
Du code non-
supporté
Tout code déjà
écrit
Code without
automated tests
Michael Feathers in Working Effectively with Legacy Code
Styles d’architecture
1990 2000 2010
Styles d’architecture
Et parfois…
Refactoring
Refactoring
Le refactoring consiste à améliorer du code
existant sans modifier son comportement.
SOLID
Single responsibility
Open for extension, closed for modification
Liskov substitution
Interface segregation
Dependency inversion
Clean Code
Le code propre est :
Simple Expressif Lisible Organisé Testé
Clean Code
Bonnes pratiques
KISS YAGNI DRY
Keep it simple and stupid You aren’t going to need it Don’t repeat yourself
1. Description du champ de bataille
2. Détecter et identifier l’ennemi
3. Techniques de combat et armement
Cartographier
Cartographier
Mesurer la qualité du code
Parfois, l’estimation au doigt
mouillé n’est pas suffisante.
Mesurer la qualité du code
Nombre de
lignes de code
Complexité
cyclomatique
Taux de
couverture
Volume de
commentaires
Ratio de
méthodes
trop longues
Nombre de
classes par
librairie
Nombre de
méthodes par
classe
Indice de
spécialisation
Indice
d’instabilité
Coefficient
d’abstraction
Distance de
bonne
conception
Taux de
duplication
Mesurer la qualité du code
Code smells
Les code smells sont un indicateur de problèmes de
design applicatif.
« Les code smells sont des symptômes de problèmes
plus profonds. »
Martin Fowler
Code smells
Les Gros
Les méthodes
trop longues
Les classes
trop grosses
La liste de
paramètres
interminable
L’abus de
primitives
La
dissémination
de données
Code smells
Les Dispensables
Les
commentaires
Le code mort
Le code
dupliqué
Les classes
fainéantes
La généricité
spéculative
Code smells
Les Abus de la Programmation Orientée Objet
Les switchs et
if/else if/else
if/else
Les champs
facultatifs
L’héritage
abusif
Le manque
d’homogénéité
Code smells
Les Problèmes de Couplage
Feature Envy
Intimité
inappropriée
Enchaînements
excessifs
Man in the
middle
1. Description du champ de bataille
2. Détecter et identifier l’ennemi
3. Techniques de combat et armement
L’Arme Fatale
Cleaning the deck
• Renommage
• Déplacements de
blocs de code
Refactorings
Amélioration de la lisibilité et de la localisation du code
Rename
Move to…
• Move up
• Move down
Extract
variable
Inline variable
Refactorings
Découpage et organisation du code
Découpage de
grosses interfaces
en petites
interfaces ciblées
Extraction de
méthode
Extraction de
classe
Refactorings
Abstraction
Encapsuler un
champ
Remplacer les
conditionnelles par
du polymorphisme
Remplacer un code
de type par un
pattern State ou
Strategy
Extraction
d’interface
Ajout de
paramètre
Fakes, mocks et stubs
Mock : permet également de
compter le nombre d'appels aux
méthodes
Mock
Stub
Fake
Stub : on lui injecte du
comportement dynamiquement
Fake : faux objet généré
manuellement simulant un objet réel
à l'aide de valeurs codées en dur.
IContract
Golden Master
Golden Master
Golden Master
Input Output
Unit tests
When [Input], then
[Output]
Demo
Kata !
Bien armer ses soldats
Roslyn Code Cracker
Bibliographie
Conclusion
• Ne négligez pas la théorie
• Maîtrisez les outils
• Ne soyez pas effrayés par la difficulté
• Gardez le bon état d’esprit
Des questions

[Agile Testing Day] Techniques avancées de tests