SlideShare une entreprise Scribd logo
Code Complete
Sébastien Combéfis
Lundi 29 février 2016
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
Contexte
W. Strunk et E. B. White
1918
B. W. Kernighan et P. J. Plauger
1974
3
Qualité de code
4
“Always code as if the guy who ends up maintaining
your code will be a violent psychopath who knows
where you live.” — Martin Golding
“Always code as if the guy who ends up maintaining
your code will be a violent psychopath who knows
where you live.” — Martin Golding
Cacher l’information
Deux catégories de secrets
Cacher la complexité pour le développeur
Cacher les sources de changement pour faciliter les modifs
Barrière au masquage d’information
Distribution excessive de l’information
Dépendance circulaire
Confondre variable de classe avec variables globales
6
Identifier le changement
Importance d’identifier le changement pour l’isoler
1 Identifier les éléments qui pourraient changer
2 Séparer les éléments identifiés dans une classe
3 Isoler les éléments identifiés du reste
Exemples communs qui peuvent changer
Règles business (facturation, taxe...)
Dépendances hardware
Entrée/sortie (format de fichiers produits)
Fonctionnalités non standards des langages
Zones avec des constructions difficiles
Variable statuts
7
Couplage
Il faut maintenir un couplage le plus faible possible
Critères de couplage
Minimiser le nombre de connexions vers d’autres modules
Rendre les connexions visibles
Pouvoir changer les connexions par flexibilité
Types de couplage
Simple-data-parameter (passage de paramètre primitif)
Simple-object (un objet instancie un autre objet)
Object-parameter
Semantic
8
Code de qualité
Focus sur la programmation orientée objet
Analyse top-down
Depuis la classe jusqu’aux instructions
Classe Méthode Instruction
9
Trouver les objets du monde réel
Identifier l’objet et ses attributs
Déterminer ce qui peut être fait avec l’objet
Identifier ce que l’objet peut faire à d’autre objets
Déterminer ce qui sera visible de l’objet
Définir l’interface publique de l’objet
10
Programmer avec des classes
Abstract Data Type
ADT
Cacher les détails
d’implémentation
Rendre les changements
indépendants du reste
du programme
Le programme est
auto-documenté
Le programme manipule
des entités qui modélisent
le monde réel
11
Manipuler les objets du monde
getFuelLevel
isOnGround
startEngine
startAutopilot
Abstraction
Créer une bonne abstraction de l’objet représenté
S’assurer que les détails d’implémentation soient bien cachés
L’abstraction doit former un tout cohérent et consistent
Le niveau d’abstraction doit être consistent
Abstraction — “Le fait de voir une opération complexe
sous une forme simplifiée”
13
Encapsulation
Minimiser l’accès aux classes et à leurs membres
Ne pas exposer les données de la classe
Ne pas exposer des détails d’implémentation
Diminuer au maximum le couplage entre classes
public class GradeReport
{
private Grade[] grades;
public double getGrade (String courseName) { /∗ ... ∗/ }
private static class Grade { /∗ ... ∗/ }
}
14
Composition ou héritage ? I
HAS-A
Une classe se compose à
partir d’autres
7 ± 2 (composants)
Surveillez le couplage
IS-A
Une classe est une
spécialisation d’une autre
6 (niveaux d’héritage)
Surveillez l’encapsulation
Liskov Substitution Principle (LSP)
Si q(x) est une propriété démontrable pour tout objet x de type T,
Alors q(y) est vraie pour tout objet y de type S
tel que S est un sous-type de T.
15
Composition ou héritage ? II
Vehicle
Car Wheel
is-a
has-a
16
Membres d’une classe
Limiter le nombre de méthodes
Limiter les appels de méthodes directs et indirects
En général : limiter la collaboration avec d’autres classes
Law of Demeter (LoD)
Une méthode M d’un objet O ne peut invoquer que :
1 ses propres méthodes ;
2 les méthodes de ses paramètres ;
3 les méthodes des objets qu’elle instance ;
4 et les méthodes de ses objets composants.
17
Constructeurs
Initialiser toutes les variables d’instance
Interdire la création d’instances avec un constructeur privé
Éviter les shallow copies des paramètres
public class BookStore
{
private Books[] books;
public BookStore (Books[] books)
{
this.books = books;
}
}
18
Deep or shallow copies ?
public class Exam
{
private Course course;
private Student[] students;
public Exam (Course course, Student[] students)
{
this.course = course;
this.students = students;
}
}
public class Test
{
public static void main (String[] args)
{
Student[] students = /∗ ... ∗/ ;
Exam exam = new Exam (/∗ ... ∗/, students);
Arrays.fill (students, null);
}
}
19
Pourquoi une classe ?
Modéliser un objet du monde réel
Modéliser des objets abstraits
Réduire ou isoler la complexité
Limiter les impacts lors de modifications
Cacher les données et détails d’implémentation
Faciliter la réutilisation de code
20
Avoid God classes
also known as The Blob
Toute puissante et qui sait tout
Passe son temps à appeler des get et set
Classes à éviter
Éviter les classes God
Éliminer les classes hors sujet
Classes avec seulement des données
Éviter les classes dont les noms sont des verbes
Classes avec seulement des comportements
22
Programmer avec des routines
Réduire la complexité
Introduit des abstractions intermédiaire et compréhensibles
Éviter la duplication de code
Faciliter la réutilisation de code
23
Pourquoi rassembler des instructions ?
Cohésion fonctionnelle
Une routine = une opération
Cohésion séquentielle
Séquence d’instructions qui partagent des données
Cohésion communicationnelle
Opérations qui utilisent la même donnée
Cohésion temporelle
Opérations qui doivent avoir lieu en même temps
24
Choisir le bon nom
Décrire ce que fait la routine
Éviter les verbes vagues : process, handleOutput...
Ne pas différencier rien que par un numéro : test1, test2...
Ne pas hésiter sur la longueur du nom
Utiliser les opposés à bon escient : get/put, start/stop...
Fonction : décrire la valeur de retour
Procédure : verbe fort + sujet pour décrire l’action
25
Longueur d’une routine
Pas de convention globalement acceptée
Doit tenir sur un écran ou une/deux page/s (50–150 lignes)
Convention NASA pour développer un code critique
60 lignes de code maximum par routine
26
Paramètres d’une routine
39% des erreurs viennent de l’interface entre routines
Cette interface se fait lors des appels de routines
Bonnes pratiques par rapport aux paramètres
Ordre des paramètres : input/modify/output
Même ordre lorsque routines avec les mêmes paramètres
Utiliser tous les paramètres
Ne pas utiliser les paramètres comme variable de travail
Documenter les hypothèses sur les paramètres
Limiter le nombre de paramètres (environ 7)
27
Protégez-vous !
Données provenant de sources externes
Valeurs des paramètres des routines
Gestion des erreurs ou assertion ?
Gestion des erreurs
À utiliser pour des situations particulières qui pourraient se
produire
Assertion
À utiliser pour des situations qui ne surviendront jamais
public Book getBook (int bookid)
{
for (int i = 0; i < books.length; i++)
{
if (books[i].getId() == bookid) { return books[i]; }
}
assert false;
return null;
}
29
Assertion
Le code doit rester fonctionnel sans les assertions
Vérification des préconditions et postconditions
Peut être vu comme des commentaires exécutables
30
Gestion des erreurs
Renvoyer une valeur neutre
Passer la donnée erronée
Renvoyer la même valeur que lors du dernier appel
Afficher un message d’erreur
Mécanisme d’exception pour communiquer des erreurs
Correctness <> Robustness
31
One variable = One purposeOne variable = One purpose
Déclaration
Initialisation lors de la déclaration
... dans le constructeur pour les variables d’instance
Déclaration le plus proche de l’utilisation
Utilisez les constantes
33
Span et durée de vie
Le « span » mesure l’espacement de l’utilisation de la variable
La durée de vie mesure le nombre d’instructions pour
lesquelles la variable existe
public void test()
{
int a = 0;
int b = 0;
int c = 0;
b = a + 1;
b = b / c;
}
Variable b
Average span : (1 + 0)/2 = 0.5
Live time : 4
(les deux valeurs sont à minimiser)
34
Minimiser la portée
Initialiser les variables utilisée dans une boucle juste avant
Ne pas retarder l’initialisation d’une variable
Grouper les instructions liées (avec les mêmes variables)
Séparer les groupes d’instructions liées en routines
Toujours commencer avec la visibilité la plus faible
35
Variable
Le nom décrit contenu de la variable et la documente
Longueur optimale entre 9 et 15 caractères
Une variable utilisée pour une seule raison
Éviter les variables avec plusieurs significations selon la valeur
S’assurer que toutes les variables sont utilisées
36
Choisir les noms
Noms avec signification proche : input et inputVal
Noms similaires : clientRec et clientRep
Éviter les nombres : total1 et total2
Attention à l’orthographe !
Éviter de mélanger les langues
Éviter des caractères difficiles à lire : char1 et chartl, cOnf et
c0nf, GREAT et 6REAT, tex2html et texZhtml...
37
Nom pour types de données spécifiques
Compteur des boucles i, j, k (sauf si utilisée hors boucle)
Sauf pour les longues boucles, où un nom parlant est mieux
Ne pas mettre flag dans le nom des variables de statut
Les variables temporaires sont à éviter (temp...)
Nommer les variables booléennes (done, error, found, ok,
success...) avec nom qui implique true ou false
38
Data types
Nombre (1)
Éviter les nombres magiques
Hardcoder les valeurs 0 et 1 ne pose pas problème
Anticiper les divisions par zéro
Rendre les conversions de type explicite
Éviter les comparaisons de types différents
40
Nombre (2)
Nombre entier
Vérifier les divisions par zéro
Vérifier les dépassements de capacité
Diviser avant de multiplier (1e6 * 1e6 / 1e6)
Nombre flottant
Éviter addition et soustraction de nombres de magnitudes =
Éviter les comparaisons pour l’égalité
Anticiper les erreurs d’arrondi
41
Chaine de caractères
Éviter les caractères et chaines magiques
Attention à l’accès par indice avec les méthodes utilisées
Attention au support ou non d’Unicode
Penser à la politique d’internationalisation de l’application
42
Autres types
Booléen
Utiliser les booléens pour documenter son programme
En nommant des expressions booléennes pour les conditions
Simplifier les tests complexes avec des booléens
Tableau/Liste
S’assurer que les indices restent dans les bornes
Attention aux indices lorsque plusieurs dimensions
43
Writing programs is like writing books
Code séquentiel
Respecter l’ordre lorsqu’il a de l’importance
Rendre visible les dépendances (noms des routines, arguments)
Grouper les instructions de manière logique
45
Instructions conditionnelles
Traiter les cas normaux d’abord (avec le if) ensuite les cas
d’erreur (avec le else)
Faire attention à bien utiliser < ou <=
Simplifier les conditions complexes par un appel de fonction
Ordonner les cas en commençant par le plus fréquent
46
Instructions répétitives (1)
Boucles while, for et foreach
Un seul point d’entrée par boucle
Code d’initialisation juste avant la boucle
Boucle infinie avec while(true){}
Éviter les boucles vides
Mise à jour des variables de contrôle en début ou fin du corps
Une boucle = une fonction
47
Instructions répétitives (2)
S’assurer que la boucle se termine et rendre la condition de
terminaison claire et limpide
Ne pas faire le singe en changeant les variables de contrôle
pour quitter la boucle
Ne pas dépendre de la valeur des variables de contrôle après la
boucle
Utiliser les break, mais avec modération
48
Imbriquer des boucles
Attention aux noms des variables de contrôle
Limiter la portée des variables de contrôle à la boucle
Au grand maximum trois niveaux d’imbrication de boucles
On doit pouvoir lire la boucle de manière globale
49
Expressions booléennes
Comparer implicitement des booléens avec true et false
Casser des conditions trop complexes en utilisant des variables
booléennes intermédiaires ou dans une routine
Inverser la logique pour avoir la condition du if positive
Simplifier les expression booléennes avec la loi de De Morgan
! (A || B) ≡ ( !A) && ( !B)
! (A && B) ≡ ( !A) || ( !B)
50
Fundamental Theorem of Formatting
“A good visual layout
shows the logical
structure of a program”
“Any fool can write code that a computer can
understand. Good programmers write code that
humans can understand.” — Martin Fowler
“Any fool can write code that a computer can
understand. Good programmers write code that
humans can understand.” — Martin Fowler
Bon layout
Représenter la structure logique du code de manière précise et
consistante
Augmenter la lisibilité
Supporter et faciliter les modifications
En utilisant les blancs pour regrouper, et pour indenter et les
parenthèses pour clarifier les expressions
52
Quelques règles de layout
Une ligne de code ne devrait pas dépasser 80 caractères
Une déclaration de variable par ligne
Dans une classe : commentaire d’entête, données, méthodes
public, protected puis private
53
Les commentaires
Répétition du code
Explication du code
Marqueurs dans le code
Résumé du code (focus sur le pourquoi, et pas sur le comment)
Explication de l’intention du code (niveau problème et pas solution)
Information additionnelle non présente dans le code
“Good code is its own best documentation.” — Steve McConnell
54
Do not comment tricky code, rewrite it!Do not comment tricky code, rewrite it!
56
57
En résumé
Réduire la complexité
Écrire ses programmes pour des humains, pas pour la machine
Consistance et cohérence
Garder les éléments proches de leurs utilisations
Penser et coder au niveau du problème, pas de la solution
58
À suivre
http://geek-and-poke.com/
http://www.codinghorror.com/blog/
59
Livres de référence I
ISBN 978-0-735-61967-8 ISBN 978-0-132-35088-4 ISBN 978-0-596-51004-6
60
Livres de référence II
ISBN 978-0-201-61622-4 ISBN 978-0-321-35668-0 ISBN 978-0-201-48567-7
61
Crédits
https://www.flickr.com/photos/toolmantim/2887927385
https://www.flickr.com/photos/smitty/2245445147
http://www.flickr.com/photos/tetezinharomana/7152072635/
http://www.flickr.com/photos/jetstarairways/6769120131/
http://www.flickr.com/photos/47104521@N08/4332849715/
http://www.flickr.com/photos/dunechaser/2936384313/
http://www.flickr.com/photos/sillydog/287354869/
https://www.flickr.com/photos/small_realm/15375289074
http://www.flickr.com/photos/j1x4r/4313734090/
http://www.flickr.com/photos/focx/5485671820/
http://www.flickr.com/photos/cyberslayer/952153409/
http://geek-and-poke.com/geekandpoke/2014/7/17/simply-explained
Photos des livres depuis Amazon
62

Contenu connexe

Tendances

Cours java script
Cours java scriptCours java script
Cours java script
AdelThaljaoui
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA
Asmaa BENGUEDDACH
 
Logique floue application
Logique floue application Logique floue application
Logique floue application Arrow Arrow
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
Abdoulaye Dieng
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
Abdoulaye Dieng
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
ECAM Brussels Engineering School
 
JAVA
JAVAJAVA
Logique floue - Implication de Mamdani
Logique floue - Implication de MamdaniLogique floue - Implication de Mamdani
Logique floue - Implication de MamdaniYassine Zahraoui
 
Cours algorithme: structures répétitives
Cours algorithme: structures répétitivesCours algorithme: structures répétitives
Cours algorithme: structures répétitives
InforMatica34
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
abdelkhalek benhoumine
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
Microsoft
 
Erlang
ErlangErlang
Erlang
kamar MEDDAH
 
Exceptions
ExceptionsExceptions
Exceptions
Axel KAMALAK
 
Apprendre vba excel(1)
Apprendre vba excel(1)Apprendre vba excel(1)
Apprendre vba excel(1)
FIDEL Wisly
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
TheBest Icanbe
 
XML Avancé : DTD, XSD, XPATH, XSLT, XQuery
XML Avancé : DTD, XSD, XPATH, XSLT, XQueryXML Avancé : DTD, XSD, XPATH, XSLT, XQuery
XML Avancé : DTD, XSD, XPATH, XSLT, XQuery
Rachid NID SAID
 
Introspection reflection
Introspection reflectionIntrospection reflection
Introspection reflectionEric Toguem
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
Wiki Info Systeme
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
ECAM Brussels Engineering School
 

Tendances (20)

Cours java script
Cours java scriptCours java script
Cours java script
 
Les bases de la programmation en JAVA
Les bases de la programmation  en JAVA   Les bases de la programmation  en JAVA
Les bases de la programmation en JAVA
 
Logique floue application
Logique floue application Logique floue application
Logique floue application
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
JAVA
JAVAJAVA
JAVA
 
Logique floue - Implication de Mamdani
Logique floue - Implication de MamdaniLogique floue - Implication de Mamdani
Logique floue - Implication de Mamdani
 
Cours algorithme: structures répétitives
Cours algorithme: structures répétitivesCours algorithme: structures répétitives
Cours algorithme: structures répétitives
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Erlang
ErlangErlang
Erlang
 
Exceptions
ExceptionsExceptions
Exceptions
 
Apprendre vba excel(1)
Apprendre vba excel(1)Apprendre vba excel(1)
Apprendre vba excel(1)
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
 
Cours java
Cours javaCours java
Cours java
 
XML Avancé : DTD, XSD, XPATH, XSLT, XQuery
XML Avancé : DTD, XSD, XPATH, XSLT, XQueryXML Avancé : DTD, XSD, XPATH, XSLT, XQuery
XML Avancé : DTD, XSD, XPATH, XSLT, XQuery
 
Introspection reflection
Introspection reflectionIntrospection reflection
Introspection reflection
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 

En vedette

Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for EducationPythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
ECAM Brussels Engineering School
 
程序员实践之路
程序员实践之路程序员实践之路
程序员实践之路
Horky Chen
 
代码大全(内训)
代码大全(内训)代码大全(内训)
代码大全(内训)
Horky Chen
 
MOST_OpenFoundry_version control system_Git
MOST_OpenFoundry_version control system_GitMOST_OpenFoundry_version control system_Git
MOST_OpenFoundry_version control system_Git
Su Jan
 
程序员发展漫谈
程序员发展漫谈程序员发展漫谈
程序员发展漫谈Horky Chen
 
Coding Style
Coding StyleCoding Style
Coding Style
Hung-Wei Liu
 
Defencive programming
Defencive programmingDefencive programming
Defencive programming
Asha Sari
 
Code tuning techniques
Code tuning techniquesCode tuning techniques
Code tuning techniques
Asha Sari
 
Java scriptcore brief introduction
Java scriptcore brief introductionJava scriptcore brief introduction
Java scriptcore brief introduction
Horky Chen
 
高品質軟體的基本動作 101 + 102 for NUU
高品質軟體的基本動作 101 + 102 for NUU高品質軟體的基本動作 101 + 102 for NUU
高品質軟體的基本動作 101 + 102 for NUU
Su Jan
 
A Guideline to Test Your Own Code - Developer Testing
A Guideline to Test Your Own Code - Developer TestingA Guideline to Test Your Own Code - Developer Testing
A Guideline to Test Your Own Code - Developer Testing
Folio3 Software
 
Integration
IntegrationIntegration
Integration
Asha Sari
 
Variables
VariablesVariables
Variables
Maha Saad
 
Design in construction
Design in constructionDesign in construction
Design in construction
Asha Sari
 
Design in construction
Design in constructionDesign in construction
Design in construction
Asha Sari
 
Code tuning strategies
Code tuning strategiesCode tuning strategies
Code tuning strategies
Asha Sari
 
高品質軟體的基本動作 101 for NTHU
高品質軟體的基本動作 101 for NTHU高品質軟體的基本動作 101 for NTHU
高品質軟體的基本動作 101 for NTHU
Su Jan
 
Code Tuning
Code TuningCode Tuning
Code Tuning
bgtraghu
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
ECAM Brussels Engineering School
 
The pseudocode
The pseudocodeThe pseudocode
The pseudocode
Asha Sari
 

En vedette (20)

Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for EducationPythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
Pythia Reloaded: An Intelligent Unit Testing-Based Code Grader for Education
 
程序员实践之路
程序员实践之路程序员实践之路
程序员实践之路
 
代码大全(内训)
代码大全(内训)代码大全(内训)
代码大全(内训)
 
MOST_OpenFoundry_version control system_Git
MOST_OpenFoundry_version control system_GitMOST_OpenFoundry_version control system_Git
MOST_OpenFoundry_version control system_Git
 
程序员发展漫谈
程序员发展漫谈程序员发展漫谈
程序员发展漫谈
 
Coding Style
Coding StyleCoding Style
Coding Style
 
Defencive programming
Defencive programmingDefencive programming
Defencive programming
 
Code tuning techniques
Code tuning techniquesCode tuning techniques
Code tuning techniques
 
Java scriptcore brief introduction
Java scriptcore brief introductionJava scriptcore brief introduction
Java scriptcore brief introduction
 
高品質軟體的基本動作 101 + 102 for NUU
高品質軟體的基本動作 101 + 102 for NUU高品質軟體的基本動作 101 + 102 for NUU
高品質軟體的基本動作 101 + 102 for NUU
 
A Guideline to Test Your Own Code - Developer Testing
A Guideline to Test Your Own Code - Developer TestingA Guideline to Test Your Own Code - Developer Testing
A Guideline to Test Your Own Code - Developer Testing
 
Integration
IntegrationIntegration
Integration
 
Variables
VariablesVariables
Variables
 
Design in construction
Design in constructionDesign in construction
Design in construction
 
Design in construction
Design in constructionDesign in construction
Design in construction
 
Code tuning strategies
Code tuning strategiesCode tuning strategies
Code tuning strategies
 
高品質軟體的基本動作 101 for NTHU
高品質軟體的基本動作 101 for NTHU高品質軟體的基本動作 101 for NTHU
高品質軟體的基本動作 101 for NTHU
 
Code Tuning
Code TuningCode Tuning
Code Tuning
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
The pseudocode
The pseudocodeThe pseudocode
The pseudocode
 

Similaire à Code Complete

Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel
lauraty3204
 
05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...
Hamza SAID
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
Sana Aroussi
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
Sana Aroussi
 
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
MSDEVMTL
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
Duchess France
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
agnes_crepet
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
Asmaa BENGUEDDACH
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
neuros
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
Pascal Laurin
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
MSDEVMTL
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
ECAM Brussels Engineering School
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
Aziz Darouichi
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
M2 INAE introduction python.pdf
M2 INAE introduction python.pdfM2 INAE introduction python.pdf
M2 INAE introduction python.pdf
Hajer Amdouni
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
Jean-Michel Doudoux
 

Similaire à Code Complete (20)

Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel
 
Csharp2014
Csharp2014Csharp2014
Csharp2014
 
05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...05 visual basic .net - variables, procedures, arguments et structures de cont...
05 visual basic .net - variables, procedures, arguments et structures de cont...
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
Kevin Olivier Avignon: Une introduction à la pensée fonctionnelle avec F#
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
 
L'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoringL'amélioration des tests unitaires par le refactoring
L'amélioration des tests unitaires par le refactoring
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
M2 INAE introduction python.pdf
M2 INAE introduction python.pdfM2 INAE introduction python.pdf
M2 INAE introduction python.pdf
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 

Plus de ECAM Brussels Engineering School

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
ECAM Brussels Engineering School
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projet
ECAM Brussels Engineering School
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
ECAM Brussels Engineering School
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
ECAM Brussels Engineering School
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
ECAM Brussels Engineering School
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
ECAM Brussels Engineering School
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
ECAM Brussels Engineering School
 
Intelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielleIntelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielle
ECAM Brussels Engineering School
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
ECAM Brussels Engineering School
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
ECAM Brussels Engineering School
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
ECAM Brussels Engineering School
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
ECAM Brussels Engineering School
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
ECAM Brussels Engineering School
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
ECAM Brussels Engineering School
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
ECAM Brussels Engineering School
 

Plus de ECAM Brussels Engineering School (20)

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
 
Laboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projetLaboratoire de transmission numérique : Présentation du projet
Laboratoire de transmission numérique : Présentation du projet
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...Développement informatique : Algorithmique II : Techniques de recherche en in...
Développement informatique : Algorithmique II : Techniques de recherche en in...
 
Intelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielleIntelligence Artificielle : Introduction à l'intelligence artificielle
Intelligence Artificielle : Introduction à l'intelligence artificielle
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
 

Dernier

Comment aborder le changement climatique dans son métier, volet adaptation
Comment aborder le changement climatique dans son métier, volet adaptationComment aborder le changement climatique dans son métier, volet adaptation
Comment aborder le changement climatique dans son métier, volet adaptation
Institut de l'Elevage - Idele
 
1er webinaire INOSYS Réseaux d’élevage Ovins Viande
1er webinaire INOSYS Réseaux d’élevage Ovins Viande1er webinaire INOSYS Réseaux d’élevage Ovins Viande
1er webinaire INOSYS Réseaux d’élevage Ovins Viande
Institut de l'Elevage - Idele
 
Presentation d'esquisse route juin 2023.pptx
Presentation d'esquisse route juin 2023.pptxPresentation d'esquisse route juin 2023.pptx
Presentation d'esquisse route juin 2023.pptx
imed53
 
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdfCOURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
sieousse95
 
Présentation PFE (MOUAD LAZRAK) (2).pptx
Présentation PFE (MOUAD LAZRAK) (2).pptxPrésentation PFE (MOUAD LAZRAK) (2).pptx
Présentation PFE (MOUAD LAZRAK) (2).pptx
khalilbatariagro
 
Alternative - Complément au Tramway et 3ème lien de la ville de Québec
Alternative - Complément  au Tramway et 3ème lien de la ville de Québec  Alternative - Complément  au Tramway et 3ème lien de la ville de Québec
Alternative - Complément au Tramway et 3ème lien de la ville de Québec
Daniel Bedard
 
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
Institut de l'Elevage - Idele
 

Dernier (7)

Comment aborder le changement climatique dans son métier, volet adaptation
Comment aborder le changement climatique dans son métier, volet adaptationComment aborder le changement climatique dans son métier, volet adaptation
Comment aborder le changement climatique dans son métier, volet adaptation
 
1er webinaire INOSYS Réseaux d’élevage Ovins Viande
1er webinaire INOSYS Réseaux d’élevage Ovins Viande1er webinaire INOSYS Réseaux d’élevage Ovins Viande
1er webinaire INOSYS Réseaux d’élevage Ovins Viande
 
Presentation d'esquisse route juin 2023.pptx
Presentation d'esquisse route juin 2023.pptxPresentation d'esquisse route juin 2023.pptx
Presentation d'esquisse route juin 2023.pptx
 
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdfCOURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
COURS ANALYSE FINANCIERE-NOGLO Méthodes d’analyses financières.pdf
 
Présentation PFE (MOUAD LAZRAK) (2).pptx
Présentation PFE (MOUAD LAZRAK) (2).pptxPrésentation PFE (MOUAD LAZRAK) (2).pptx
Présentation PFE (MOUAD LAZRAK) (2).pptx
 
Alternative - Complément au Tramway et 3ème lien de la ville de Québec
Alternative - Complément  au Tramway et 3ème lien de la ville de Québec  Alternative - Complément  au Tramway et 3ème lien de la ville de Québec
Alternative - Complément au Tramway et 3ème lien de la ville de Québec
 
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
Quelles rotations dans les systèmes caprins de Nouvelle-Aquitaine et Pays de ...
 

Code Complete

  • 2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
  • 3. Contexte W. Strunk et E. B. White 1918 B. W. Kernighan et P. J. Plauger 1974 3
  • 5. “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” — Martin Golding “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” — Martin Golding
  • 6. Cacher l’information Deux catégories de secrets Cacher la complexité pour le développeur Cacher les sources de changement pour faciliter les modifs Barrière au masquage d’information Distribution excessive de l’information Dépendance circulaire Confondre variable de classe avec variables globales 6
  • 7. Identifier le changement Importance d’identifier le changement pour l’isoler 1 Identifier les éléments qui pourraient changer 2 Séparer les éléments identifiés dans une classe 3 Isoler les éléments identifiés du reste Exemples communs qui peuvent changer Règles business (facturation, taxe...) Dépendances hardware Entrée/sortie (format de fichiers produits) Fonctionnalités non standards des langages Zones avec des constructions difficiles Variable statuts 7
  • 8. Couplage Il faut maintenir un couplage le plus faible possible Critères de couplage Minimiser le nombre de connexions vers d’autres modules Rendre les connexions visibles Pouvoir changer les connexions par flexibilité Types de couplage Simple-data-parameter (passage de paramètre primitif) Simple-object (un objet instancie un autre objet) Object-parameter Semantic 8
  • 9. Code de qualité Focus sur la programmation orientée objet Analyse top-down Depuis la classe jusqu’aux instructions Classe Méthode Instruction 9
  • 10. Trouver les objets du monde réel Identifier l’objet et ses attributs Déterminer ce qui peut être fait avec l’objet Identifier ce que l’objet peut faire à d’autre objets Déterminer ce qui sera visible de l’objet Définir l’interface publique de l’objet 10
  • 11. Programmer avec des classes Abstract Data Type ADT Cacher les détails d’implémentation Rendre les changements indépendants du reste du programme Le programme est auto-documenté Le programme manipule des entités qui modélisent le monde réel 11
  • 12. Manipuler les objets du monde getFuelLevel isOnGround startEngine startAutopilot
  • 13. Abstraction Créer une bonne abstraction de l’objet représenté S’assurer que les détails d’implémentation soient bien cachés L’abstraction doit former un tout cohérent et consistent Le niveau d’abstraction doit être consistent Abstraction — “Le fait de voir une opération complexe sous une forme simplifiée” 13
  • 14. Encapsulation Minimiser l’accès aux classes et à leurs membres Ne pas exposer les données de la classe Ne pas exposer des détails d’implémentation Diminuer au maximum le couplage entre classes public class GradeReport { private Grade[] grades; public double getGrade (String courseName) { /∗ ... ∗/ } private static class Grade { /∗ ... ∗/ } } 14
  • 15. Composition ou héritage ? I HAS-A Une classe se compose à partir d’autres 7 ± 2 (composants) Surveillez le couplage IS-A Une classe est une spécialisation d’une autre 6 (niveaux d’héritage) Surveillez l’encapsulation Liskov Substitution Principle (LSP) Si q(x) est une propriété démontrable pour tout objet x de type T, Alors q(y) est vraie pour tout objet y de type S tel que S est un sous-type de T. 15
  • 16. Composition ou héritage ? II Vehicle Car Wheel is-a has-a 16
  • 17. Membres d’une classe Limiter le nombre de méthodes Limiter les appels de méthodes directs et indirects En général : limiter la collaboration avec d’autres classes Law of Demeter (LoD) Une méthode M d’un objet O ne peut invoquer que : 1 ses propres méthodes ; 2 les méthodes de ses paramètres ; 3 les méthodes des objets qu’elle instance ; 4 et les méthodes de ses objets composants. 17
  • 18. Constructeurs Initialiser toutes les variables d’instance Interdire la création d’instances avec un constructeur privé Éviter les shallow copies des paramètres public class BookStore { private Books[] books; public BookStore (Books[] books) { this.books = books; } } 18
  • 19. Deep or shallow copies ? public class Exam { private Course course; private Student[] students; public Exam (Course course, Student[] students) { this.course = course; this.students = students; } } public class Test { public static void main (String[] args) { Student[] students = /∗ ... ∗/ ; Exam exam = new Exam (/∗ ... ∗/, students); Arrays.fill (students, null); } } 19
  • 20. Pourquoi une classe ? Modéliser un objet du monde réel Modéliser des objets abstraits Réduire ou isoler la complexité Limiter les impacts lors de modifications Cacher les données et détails d’implémentation Faciliter la réutilisation de code 20
  • 21. Avoid God classes also known as The Blob Toute puissante et qui sait tout Passe son temps à appeler des get et set
  • 22. Classes à éviter Éviter les classes God Éliminer les classes hors sujet Classes avec seulement des données Éviter les classes dont les noms sont des verbes Classes avec seulement des comportements 22
  • 23. Programmer avec des routines Réduire la complexité Introduit des abstractions intermédiaire et compréhensibles Éviter la duplication de code Faciliter la réutilisation de code 23
  • 24. Pourquoi rassembler des instructions ? Cohésion fonctionnelle Une routine = une opération Cohésion séquentielle Séquence d’instructions qui partagent des données Cohésion communicationnelle Opérations qui utilisent la même donnée Cohésion temporelle Opérations qui doivent avoir lieu en même temps 24
  • 25. Choisir le bon nom Décrire ce que fait la routine Éviter les verbes vagues : process, handleOutput... Ne pas différencier rien que par un numéro : test1, test2... Ne pas hésiter sur la longueur du nom Utiliser les opposés à bon escient : get/put, start/stop... Fonction : décrire la valeur de retour Procédure : verbe fort + sujet pour décrire l’action 25
  • 26. Longueur d’une routine Pas de convention globalement acceptée Doit tenir sur un écran ou une/deux page/s (50–150 lignes) Convention NASA pour développer un code critique 60 lignes de code maximum par routine 26
  • 27. Paramètres d’une routine 39% des erreurs viennent de l’interface entre routines Cette interface se fait lors des appels de routines Bonnes pratiques par rapport aux paramètres Ordre des paramètres : input/modify/output Même ordre lorsque routines avec les mêmes paramètres Utiliser tous les paramètres Ne pas utiliser les paramètres comme variable de travail Documenter les hypothèses sur les paramètres Limiter le nombre de paramètres (environ 7) 27
  • 28. Protégez-vous ! Données provenant de sources externes Valeurs des paramètres des routines
  • 29. Gestion des erreurs ou assertion ? Gestion des erreurs À utiliser pour des situations particulières qui pourraient se produire Assertion À utiliser pour des situations qui ne surviendront jamais public Book getBook (int bookid) { for (int i = 0; i < books.length; i++) { if (books[i].getId() == bookid) { return books[i]; } } assert false; return null; } 29
  • 30. Assertion Le code doit rester fonctionnel sans les assertions Vérification des préconditions et postconditions Peut être vu comme des commentaires exécutables 30
  • 31. Gestion des erreurs Renvoyer une valeur neutre Passer la donnée erronée Renvoyer la même valeur que lors du dernier appel Afficher un message d’erreur Mécanisme d’exception pour communiquer des erreurs Correctness <> Robustness 31
  • 32. One variable = One purposeOne variable = One purpose
  • 33. Déclaration Initialisation lors de la déclaration ... dans le constructeur pour les variables d’instance Déclaration le plus proche de l’utilisation Utilisez les constantes 33
  • 34. Span et durée de vie Le « span » mesure l’espacement de l’utilisation de la variable La durée de vie mesure le nombre d’instructions pour lesquelles la variable existe public void test() { int a = 0; int b = 0; int c = 0; b = a + 1; b = b / c; } Variable b Average span : (1 + 0)/2 = 0.5 Live time : 4 (les deux valeurs sont à minimiser) 34
  • 35. Minimiser la portée Initialiser les variables utilisée dans une boucle juste avant Ne pas retarder l’initialisation d’une variable Grouper les instructions liées (avec les mêmes variables) Séparer les groupes d’instructions liées en routines Toujours commencer avec la visibilité la plus faible 35
  • 36. Variable Le nom décrit contenu de la variable et la documente Longueur optimale entre 9 et 15 caractères Une variable utilisée pour une seule raison Éviter les variables avec plusieurs significations selon la valeur S’assurer que toutes les variables sont utilisées 36
  • 37. Choisir les noms Noms avec signification proche : input et inputVal Noms similaires : clientRec et clientRep Éviter les nombres : total1 et total2 Attention à l’orthographe ! Éviter de mélanger les langues Éviter des caractères difficiles à lire : char1 et chartl, cOnf et c0nf, GREAT et 6REAT, tex2html et texZhtml... 37
  • 38. Nom pour types de données spécifiques Compteur des boucles i, j, k (sauf si utilisée hors boucle) Sauf pour les longues boucles, où un nom parlant est mieux Ne pas mettre flag dans le nom des variables de statut Les variables temporaires sont à éviter (temp...) Nommer les variables booléennes (done, error, found, ok, success...) avec nom qui implique true ou false 38
  • 40. Nombre (1) Éviter les nombres magiques Hardcoder les valeurs 0 et 1 ne pose pas problème Anticiper les divisions par zéro Rendre les conversions de type explicite Éviter les comparaisons de types différents 40
  • 41. Nombre (2) Nombre entier Vérifier les divisions par zéro Vérifier les dépassements de capacité Diviser avant de multiplier (1e6 * 1e6 / 1e6) Nombre flottant Éviter addition et soustraction de nombres de magnitudes = Éviter les comparaisons pour l’égalité Anticiper les erreurs d’arrondi 41
  • 42. Chaine de caractères Éviter les caractères et chaines magiques Attention à l’accès par indice avec les méthodes utilisées Attention au support ou non d’Unicode Penser à la politique d’internationalisation de l’application 42
  • 43. Autres types Booléen Utiliser les booléens pour documenter son programme En nommant des expressions booléennes pour les conditions Simplifier les tests complexes avec des booléens Tableau/Liste S’assurer que les indices restent dans les bornes Attention aux indices lorsque plusieurs dimensions 43
  • 44. Writing programs is like writing books
  • 45. Code séquentiel Respecter l’ordre lorsqu’il a de l’importance Rendre visible les dépendances (noms des routines, arguments) Grouper les instructions de manière logique 45
  • 46. Instructions conditionnelles Traiter les cas normaux d’abord (avec le if) ensuite les cas d’erreur (avec le else) Faire attention à bien utiliser < ou <= Simplifier les conditions complexes par un appel de fonction Ordonner les cas en commençant par le plus fréquent 46
  • 47. Instructions répétitives (1) Boucles while, for et foreach Un seul point d’entrée par boucle Code d’initialisation juste avant la boucle Boucle infinie avec while(true){} Éviter les boucles vides Mise à jour des variables de contrôle en début ou fin du corps Une boucle = une fonction 47
  • 48. Instructions répétitives (2) S’assurer que la boucle se termine et rendre la condition de terminaison claire et limpide Ne pas faire le singe en changeant les variables de contrôle pour quitter la boucle Ne pas dépendre de la valeur des variables de contrôle après la boucle Utiliser les break, mais avec modération 48
  • 49. Imbriquer des boucles Attention aux noms des variables de contrôle Limiter la portée des variables de contrôle à la boucle Au grand maximum trois niveaux d’imbrication de boucles On doit pouvoir lire la boucle de manière globale 49
  • 50. Expressions booléennes Comparer implicitement des booléens avec true et false Casser des conditions trop complexes en utilisant des variables booléennes intermédiaires ou dans une routine Inverser la logique pour avoir la condition du if positive Simplifier les expression booléennes avec la loi de De Morgan ! (A || B) ≡ ( !A) && ( !B) ! (A && B) ≡ ( !A) || ( !B) 50
  • 51. Fundamental Theorem of Formatting “A good visual layout shows the logical structure of a program” “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler
  • 52. Bon layout Représenter la structure logique du code de manière précise et consistante Augmenter la lisibilité Supporter et faciliter les modifications En utilisant les blancs pour regrouper, et pour indenter et les parenthèses pour clarifier les expressions 52
  • 53. Quelques règles de layout Une ligne de code ne devrait pas dépasser 80 caractères Une déclaration de variable par ligne Dans une classe : commentaire d’entête, données, méthodes public, protected puis private 53
  • 54. Les commentaires Répétition du code Explication du code Marqueurs dans le code Résumé du code (focus sur le pourquoi, et pas sur le comment) Explication de l’intention du code (niveau problème et pas solution) Information additionnelle non présente dans le code “Good code is its own best documentation.” — Steve McConnell 54
  • 55. Do not comment tricky code, rewrite it!Do not comment tricky code, rewrite it!
  • 56. 56
  • 57. 57
  • 58. En résumé Réduire la complexité Écrire ses programmes pour des humains, pas pour la machine Consistance et cohérence Garder les éléments proches de leurs utilisations Penser et coder au niveau du problème, pas de la solution 58
  • 60. Livres de référence I ISBN 978-0-735-61967-8 ISBN 978-0-132-35088-4 ISBN 978-0-596-51004-6 60
  • 61. Livres de référence II ISBN 978-0-201-61622-4 ISBN 978-0-321-35668-0 ISBN 978-0-201-48567-7 61