Les bonnes pratiques, les pratiques agiles, et la façon dont on peut s'en inspirer de manière concrète et pragmatique pour améliorer la qualité, la réactivité, la productivité pour la satisfaction du client et le bien-être du développeur.
Le refactoring consiste à modifier le code existant pour améliorer sa qualité intrinsèque, faciliter la compréhension/lisibilité, la maintenance sans changer son comportement.
Les outils et les techniques de refactoring seront évoqués avec notamment les approches de développement piloté par les tests (Test Driven Development) ainsi que les tests unitaires.
2. 4D Summit Europe 2013
• Paris
Bruno LEGAY
A&C Consulting
Responsable Bureau d’Etudes
3. Gérer la complexité
• le code complexe est nuisible
• le code devrait être
• clair et simple
• facile à lire
• évident
• bien organisé
• robuste
• flexible
4D Summit Europe 2013
• Paris
4. Code propre ?
• nommage variable / champ / méthode / fonction
• convention nommage
• locale vs globale, paramètre vs globale, pointeur var locale
• commentaires
• constantes
• méthodes courtes vs méthodes longues fortes imbrication
• recopie de paramètres
• couplage fort / faible
• design modulaire, polymorphisme, encapsulation, etc...
4D Summit Europe 2013
• Paris
5. Code simple ?
• “Everyone knows that debugging is twice as hard as
writing a program in the first place. So if you’re as clever
as you can be when you write it, how will you ever debug
it ?”
The Elements of Programming Style (1978)
4D Summit Europe 2013
• Paris
Brian W. Kernighan and P. J. Plauger
6. Syndrome demoscene
• hackers qui font des tours de force en programmation bas
niveau et qui poussent les limites du matériel pour produire
des démos multimédia impressionnantes
4D Summit Europe 2013
• Paris
11. Syndrome demoscene
• pas nécessairement plus rapide
• difficile à lire/comprendre/maintenir/débugger
• coder pour un humain
4D Summit Europe 2013
• Paris
12. Rapidité / optimisation
• la rapidité est importante
• optimisation prématurée est un fléau
• ne pas se fier à son intuition
• outils
• mesures
• bancs d’essai
4D Summit Europe 2013
• Paris
13. L’odeur du code
• Martin Fowler parle de “puanteur” du code
• expérience / intuition
4D Summit Europe 2013
• Paris
14. Dette technique
• métaphore de Ward Cunningham (XP, Wiki, etc...)
• emprunter / sortir l’application rapidement (connaissance
partielle)
• accumulation de dette => tous les revenus servent à payer
l'intérêt de la dette
• rembourser l’emprunt / affiner le code
4D Summit Europe 2013
• Paris
15. Définition du Refactoring
• définition proposée par Martin Fowler
• improving the design of existing code
• refactoring (noun) : a change made in the internal
structure of software to make it easier to
understand and cheaper to modify without
changing its observable behavior.
4D Summit Europe 2013
• Paris
16. Ethymologie
• facteur
• factorisation en mathématiques
ab + ac = a(b+c)
• expressions remarquables
a2 - b2 = (a+b)(a-b)
a2 + 2ab + b2 = (a+b)2
a2 - 2ab + b2 = (a-b)2 = (b-a)2
4D Summit Europe 2013
• Paris
17. Think different
• adage “if it aint broken don't fix it”
• pourquoi ?
• gérer le risque
• comment ?
4D Summit Europe 2013
• Paris
18. Identifier les objectifs
• nommage de variable/fonction abscond
• duplication
• méthodes longues
• trop de commentaires
• quand le débuggeur est nécessaire pour comprendre
• profondeur des boucles / conditions
• couplage fort
4D Summit Europe 2013
• Paris
19. Outils d’analyse
• nombre de lignes
• bugs / ligne de code
• densité des commentaires
• Thomas McCabe (1976) : complexité cyclomatique
• Sanity Check (RIP, Committed Software)
• accès objets développement / METHODE LIRE CODE
• Code Analysis Component (gratuit / Open Road Development)
• Inventive Toolkit 4D (commercial / Synectique)
4D Summit Europe 2013
• Paris
20. 4D Summit Europe 2013
• Paris
Pratiques
• TODO tag
• re-lecture de code
• programmation en binôme
21. 4D Summit Europe 2013
• Paris
Les outils
• IDE 4D
• compilateur / vérification de la syntaxe
• macros
• 4D Pop (éditeur de constantes, etc...)
• accès objets développement
• composants
22. Refactoring simple
• renommer une méthode (et mettre à jour les appelants)
• renommer un(e) table/champ (tokenisé, attention sql, html,
etc...)
• renommer une variable (chercher / remplacer)
• remplacer une expression littérale par une constante
• extraire un bloc de code et en faire une méthode/fonction
• extraire un module et en faire un composant
• etc...
4D Summit Europe 2013
• Paris
23. 4D Summit Europe 2013
• Paris
Conseils
• déclaration des variables locales (haut vs bloc)
• recopier les paramètres dans des variables locales
• utiliser des variables locales si possible (les pointeurs sur
des variables comme paramètres)
24. Adopter le changement
• 4D apporte des nouvelles fonctionnalités
• Composants, Unicode, SQL, SVG, Listbox, Expression régulières,
Séparateur de dossier, WebArea, LPE, “r”, “n”, “t”, Executer sur
serveur, etc... (v11)
• PHP, Texte enrichi, UUID, ASSERT, Wigdets, PDFCreator (v12)
• Client HTTP, progress bar, Constantes XLIFF (v13)
• Objets / json (v14)
4D Summit Europe 2013
• Paris
25. Accepter le changement
• les nouvelles versions de 4D nécessitent parfois des
adaptations
• Sous-tables, Unicode, Resources, Extras, AP Sublaunch, 4D Draw,
4D open, 4D for Oracle (v11)
• Scrollable areas (v13)
• 4D Chart (v14)
• remplacer des plug-ins (manque de support ?, coût ?)
• aussi vrai pour 4D (QuickTime, Carbon, Altura)
4D Summit Europe 2013
• Paris
26. 4D Summit Europe 2013
• Paris
API
• interfaces
• fonction/méthode de composants (noms et paramètres)
• webservice (SOAP/REST)
• modèle de données (ODBC), couche d’abstraction avec
les vues
• formats de fichier
• notion public/private
27. Modèle de données
• il faut démystifier la modification du modèle de données
• ce n’est pas simple, mais la pratique aide
• le fichier de données doit contenir un numéro de version
(dans une table)
• la structure doit contenir un numéro de version et les
méthodes de mise à niveau
• exécution automatique des méthodes de mise à niveau
• on doit pouvoir exécuter plusieurs mises à niveau
séquentiellement
4D Summit Europe 2013
• Paris
28. Refactor vs Ré-écriture
• ça dépend
• le refactoring n’est envisageable que sur un produit qui
marche (à peu près)
• diviser pour mieux régner
4D Summit Europe 2013
• Paris
30. Pas de panique
• le refactoring engendre des risques
• écrire des tests automatisés
• petites étapes validées par des tests automatisés
4D Summit Europe 2013
• Paris
31. Prendre le l’assurance
• ASSERT (exprBooléenne {;messageTexte})
• Asserted (exprBooléenne {; messageTexte}) -> booléen
• FIXER ACTIVATION ASSERTIONS (active {;*})
• désactive l’évaluation des expression booléenne d’ASSERT !!!
• Lire activation assertions -> booléen
• APPELER SUR ERREUR (erreur -10518, error, error method,
error line)
• dans la méthode (tester pré-conditions et post-conditions cf “programmation par
contrat”)
• en dehors de la méthode (“test unitaires” allégés)
4D Summit Europe 2013
• Paris
32. Programmation par
4D Summit Europe 2013
• Paris
contrat
• ASSERT dans la méthode
• échouer tout de suite vs échouer doucement
• pré-conditions / post-conditions
• nombre de paramètres, enregistrement courant,
enregistrement verrouillé, pointeur nil, type de pointeur,
valeurs attendues, valeurs vide, plage de valeur
• une autre façon de documenter les “limites opérationnelles”
33. Test unitaires
• ASSERT en dehors de la méthode
• valider le fonctionnement d’une méthode/fonction
• tester an une valeur attendue en sortie avec une valeur
connue en entrée
4D Summit Europe 2013
• Paris
34. Test unitaire
où commencer ?
• robots test vs test unitaire
• pas d’excuse pour ne pas commencer
• commencer par ce qui est facile a tester et fragile
• tester aux limites
• essayer de couvrir tous les chemins
• tester les formulaires
• adapter son code pour qu’il soit testable
• métadonnées de test
4D Summit Europe 2013
• Paris
35. Outils de tests unitaires
• 4DUnitTest de Rob Laveaux/pluggers.nl (gratuit, open-source)
• UnitTester4D de Mark Schaake (commercial, abandonné,
open source)
4D Summit Europe 2013
• Paris
36. 4D Summit Europe 2013
• Paris
Jeu
• Objectif : écrire une fonction qui calcule l’âge (en années)
46. 4D Summit Europe 2013
• Paris
Résumé
• écrire le code pour les humains
• faire du refactoring de manière régulière
• rendre le code testable
• écrire des tests automatisés
47. Bibliographie
Refactoring: Improving the Design of Existing Code
de Martin Fowler, Kent Beck (http://www.refactoring.com/)
4D Summit Europe 2013
• Paris
Clean Code: A Handbook of Agile Software
Craftsmanship
de Robert C. Martin
48. Bibliographie
Test Driven Development: By Example
4D Summit Europe 2013
• Paris
de Kent Beck
The Pragmatic Programmer: From Journeyman to
Master
de Andrew Hunt, David Thomas
49. Bibliographie
WardCunningham explains tehcnical dept :
http://c2.com/cgi/wiki?WardExplainsDebtMetaphor
Unit Tester 4D (Mark Schaake) :
https://github.com/markschaake/UnitTester4D
4D Unit Test (Rob Laveaux / pluggers.nl) :
http://www.pluggers.nl/downloads/4DUnitTest.zip
Code analysis component (Open Road Development) :
http://openroaddevelopment.com/projects_4dComponent_CodeAnalysis.html
Inventive Toolkit 4D (Synectique) :
http://www.synectique.eu/
Don't be a White Rabbit anymore !
presentation by Christophe Keromen, october 2010, San Diego 2010
Refactoring datatbases
http://www.agiledata.org/essays/databaseRefactoring.html
Cyclomatic complexity
http://www.literateprogramming.com/mccabe.pdf
4D Summit Europe 2013
• Paris
50. 4D Summit Europe 2013
• Paris
Merci !
Bon code, refactoring (et tests) !