Tdd en action - refactoring

37
TDD en action : refactoring

Transcript of Tdd en action - refactoring

Page 1: Tdd en action - refactoring

TDD en action : refactoring

Page 2: Tdd en action - refactoring

Repérage

● TDD en action– Découverte

– Refactoring

– Itératif incrémental

– Bases de données

– Développement Web

– Déploiement continu

Nous allons aborder ceci

Page 3: Tdd en action - refactoring

Refactoring

● Définition● Théorie● Exemples● Exercice● Auto-évaluation

Page 4: Tdd en action - refactoring

Refactoring

● En français vous pourrez trouver le terme « remaniement »

● Définition dans notre contexte logiciel

Modifier la structure interne d'une partie de code sans modifier son comportement observable

Page 5: Tdd en action - refactoring

...donc :

● Le code change● La couverture fonctionnelle ne change pas● Les tests passent toujours

Page 6: Tdd en action - refactoring

Gains attendus

● + simple● + évolutif● + performant● …● La « qualité » du code augmente

Page 7: Tdd en action - refactoring

Qu'est qu'un code de qualité ?

● +simple, +évolutif, +performant ?● Les programmeurs et les clients ont-ils la même

réponse ?● Proposition:

Un code de qualité est un code pour lequel le coût d'ajout d'une nouvelle fonctionnalité reste stable

avec le temps

Page 8: Tdd en action - refactoring

1.TEST 2.CODE

3.REFACTOR

● Le refactoring a lieu lorsque les tests passent● Le refactoring n'ajoute pas de fonctionnalité● Le refactoring concerne le code de production

et le code de test

Page 9: Tdd en action - refactoring

1.TEST 2.CODE

3.REFACTOR

● Le refactoring consiste à améliorer le code● Une façon pour améliorer le code consiste à

supprimer le code dangereux● Vous entendrez parler de « dette technique »

Le refactoring consiste à diminuer la dette technique

Page 10: Tdd en action - refactoring

● Qu'est ce que du code « dangereux »?– Duplication

– Couplage

– Valeurs magiques

– Commentaires (avez-vous envie de réagir à celui-ci ?)

– Conditionnel

– Longues classes ou méthodes

– Code obscur

– ...cherchez « code smells » sur Google

3.REFACTOR

Page 11: Tdd en action - refactoring

● Connaissez les « code smells » qui vous aident● Essayez plusieurs smells pour trouver ceux qui

vous aident● Commencez par étudier les plus faciles

– Bad name

– Switch statement

– Primitive obsession

● Lorsque vous n'avez pas d'intuition d'amélioration, cherchez les smells qui vous ont déjà aidé

3.REFACTOR

Page 12: Tdd en action - refactoring

3.REFACTOR

Un « code smell » est une opportunité, pas une règle ni une obligation de refactoring.

Page 13: Tdd en action - refactoring

● Comment supprimer du code « dangereux »?– Introduire des « Design patterns »

● Création● Structures● Comportements

– Respecter les principes SOLID● Single responsability● Open/Closed● Liskov substitution● Interface segregation● Dependency inversion

3.REFACTOR

Page 14: Tdd en action - refactoring

● Comment supprimer du code « dangereux »?

3.REFACTOR

Page 15: Tdd en action - refactoring

● Une possibilité : piloter vos refactoring par de nouveaux tests

● Une possibilité : programmer par intention et laisser les tests existant réagir

● Une possibilité : faire les deux

3.REFACTOR

Page 16: Tdd en action - refactoring

2 exemples

● Supprimer un smell « God class »

● Supprimer un smell « Comments » dans un test

Page 17: Tdd en action - refactoring

God class

Page 18: Tdd en action - refactoring

Un possible refactoring

Page 19: Tdd en action - refactoring

Notez que

● Ce code est très différent du premier– Plusieurs collaborateurs ont apparu

– Les collaborateurs sont des interfaces dans cet exemple en Java

– Les responsabilités des collaborateurs sont orthogonales

– Des injecteurs sont disponibles● Les tests utilisent ces injecteurs pour paramétrer cette

classe et faire des vérifications de collaboration

Page 20: Tdd en action - refactoring

Notez aussi que

● Plusieurs chemins sont possibles● Vous avez probablement besoin d'une vision

– Un modèle cible

– Une architecture cible

– Au moins une intention cible

Page 21: Tdd en action - refactoring

Modèle cible

● Une cible de type architecture hexagonale

● ...et des coeurs de la part de mes enfants pour me donner du courage ;)

Page 22: Tdd en action - refactoring

Plusieurs chemins possibles

Center

Repository

ErrorLogBlankPage

Order

DisplayOrdersCommand

SqlRepository

ErrorViewOrdersView

Page 23: Tdd en action - refactoring

Plusieurs chemins possibles

Center

Repository

ErrorLogBlankPage

Order

DisplayOrdersCommand

SqlRepository

ErrorViewOrdersView

1

Page 24: Tdd en action - refactoring

Plusieurs chemins possibles

Center

Repository

ErrorLogBlankPage

Order

DisplayOrdersCommand

SqlRepository

ErrorViewOrdersView

1

2

Page 25: Tdd en action - refactoring

Plusieurs chemins possibles

Center

Repository

ErrorLogBlankPage

Order

DisplayOrdersCommand

SqlRepository

ErrorViewOrdersView

1

2

3

Page 26: Tdd en action - refactoring

Souvenez-vous

● Commencez lorsque vos tests passent● Ecoutez vos tests● Ne restez pas trop longtemps sans feedback de

la part de votre suite de tests

– En programmant par intention votre suite de tests passera du rouge au vert plusieurs fois

– En ajoutant de nouveaux tests aussi ;)

Page 27: Tdd en action - refactoring

Un autre exemple

● Supprimer les commentaires– Les commentaires sont souvent désynchronisés du

code

– Remplacer les commentaires par des tests

Page 28: Tdd en action - refactoring

Supprimer un commentaire

Page 29: Tdd en action - refactoring

Attention

● « supprimer un commentaire » veut dire– Prendre l'opportunité d'améliorer le code

– Supprimer le bruit

– Augmenter la confiance

● « supprimer un commentaire » ne veut pas dire– Perdre la documentation

– Perdre quelque chose, quoi que ce soit

Page 30: Tdd en action - refactoring

Un possible refactoring

Page 31: Tdd en action - refactoring

A vous :)

Page 32: Tdd en action - refactoring

Supprimer un « switch »

● Choisissez un code avec du conditionnel● « Jouez » à le supprimer● Ce type de code:

Page 33: Tdd en action - refactoring

Approche par de nouveaux tests

● Choisissez une cible● Décrivez dans un test une étape qui vous

permet d'explorer cette cible● Exemple: cible === reflection

Page 34: Tdd en action - refactoring

Approche par intention

● Modifiez le code comme vous voudriez qu'il soit– Faites le compiler

– Laisser votre suite de tests passer au rouge

– Revenez ensuite au vert

● Exemple:

Page 35: Tdd en action - refactoring

Combinez les deux approches

● Modifiez le code comme vous voudriez qu'il soit– Faites le compiler

– Laisser votre suite de tests passer au rouge

● Identifiez une cible– Décrivez dans un test une étape vers cette cible

– Faires passer un à un les tests qui vous amène à la cible

Votre suite de tests contient plusieurs tests rouges avant de retrouver le vert complet

Page 36: Tdd en action - refactoring

Auto-évaluation

Tests X / V ?

J'ai écrit plusieurs tests

Chaque nouveau test commence par ne pas passer

Chaque test a une seule intention

Chaque test a un nom qui illustre l'intention du test

Mes tests illustrent un développement incrémentale

Un autre que moi comprend l'intention de mes tests

Je sais nommer les smells que je supprime en refactoring

Mon backlog de refactoring a réduit

Je sais nommer les Design Patterns que j'ai implémenté

Je sais nommer le principe SOLID que j'ai suivi

Page 37: Tdd en action - refactoring

Merci

● M'aiderez vous à améliorer ce matériel ?– Qu'avez-vous aimé ?

– Quelles améliorations feriez-vous ?

[email protected]