SlideShare a Scribd company logo
1 of 37
Download to read offline
IN20 Informatique
Séance 10
Qualité de code et
convention de codage
Sébastien Combéfis, Quentin Lurkin lundi 7 décembre 2015
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.
Rappels
Librairie standard Python
Traitement de texte
Types de données
Mathématique
Fichiers et répertoires
Réseau et communication par Internet
Socket et communication entre processus
Manipulation de données sur Internet
3
Objectifs
Qualité de code
Refactoring
Bonne pratique
Convention de codage
Règle de style Pythonique
Mise en forme du code
4
Qualité de code
Qualité de code
Différence entre code fonctionnel et code de qualité
Un code peut être audité pour évaluer sa qualité
Plusieurs avantages
Facilité de lecture du code
Mise à jour plus aisée
Moins de bug
Ensemble de règles de bonne pratique
6
Outil Pylint (1)
Vérification automatisée de nombreuses règles de style
Convention de codage (PEP 0008)
Détection d’erreurs (interface, import modules...)
Aide au refactoring (code dupliqué...)
Suggestion d’amélioration du code
Interface graphique simple en Tkinter
7
Outil Pylint (2)
8
Outil Pylint (2)
8
Writing programs is like writing books
Nom de variable
Un nom de variable doit expliquer sa raison d’être
Le nom décrit la variable et la documente
Longueur optimale du nom entre 9 à 15 caractères
Nom plus court que 9 caractères autorisé pour certains cas
1 # Pas bien
2 My_AgE = 27
3 istheavatardeadornot = False
4 the_price_of_the_item = 8.99
5
6 # Bien
7 age = 25
8 dead = True
9 price = 12.99
10
Choisir le nom
Préférer les noms de variables en anglais
Attention à l’orthographe dans les noms !
Attention aux noms difficilement lisibles
char1 et charl, C0nf et COnf, GREAT et 6REAT...
Quelques situations à éviter
Noms proches : input et inputVal
Noms similaires : clientRec et clientRep
Éviter les nombres : total1 et total2
Ne pas mélanger les langues
11
Utilisation de variable
Une variable est utilisée pour une seule raison
Éviter les variables avec plusieurs signification selon la valeur
Éviter les nombres magiques avec des constantes
Variable dont on ne change pas la valeur (et nom majuscule)
Utiliser une variable pour éviter de la duplication de code
1 # Pas bien
2 for beer in database[’food ’][’beers ’]:
3 print(database[’food ’][’beers ’][ beer ][’name ’])
4
5 # Bien
6 beers = database[’food ’][’beers ’]
7 for beer in beers:
8 print(beers[beer ][’name ’])
12
Expression booléenne (1)
Une condition est une expression booléenne
if-else pas nécessaire pour affecter une variable booléenne
1 # Pas bien
2 if x > 170:
3 accepted = True
4 else:
5 accepted = False
Affectation directe d’une expression booléenne
1 # Bien
2 accepted = x > 170
13
Expression booléenne (2)
Pas comparer une variable booléenne avec True/False
Une variable booléenne est déjà une condition
1 # Pas bien
2 if hasmoney == True:
3 print("Je peux acheter")
4
5 if forbidden == False:
6 print("Ne pas entrer")
Utilisation directe de la variable booléenne
1 # Bien
2 if hasmoney:
3 print("Je peux acheter")
4
5 if not forbidden:
6 print("Ne pas entrer")
14
Simplification d’expressions booléennes
Simplification avec les opérateurs logiques
Utilisation des règles logiques sur les expressions booléennes
Règles d’équivalence logique
not x > 0 ≡ x <= 0
not (x and y) ≡ not x or not y (De Morgan)
1 # Pas bien
2 success = not grade < 10
3 result = not (temperature > 15 and temperature <= 32)
4
5 # Bien
6 success = grade >= 10
7 result = temperature <= 15 or temperature > 32
15
Variable inutile
Ne pas déclarer une variable qui n’est utilisée qu’une seule fois
Sauf pour augmenter la lisibilité ou éviter un nombre magique
1 # Pas bien
2 def totalprice(price , quantity):
3 taxrate = 21
4 return (price * quantity) * (1 + taxrate / 100)
5
6 sentence = "Prix total : "
7 print(sentence + str(totalprice (7.99 , 5)) + " euros")
8
9 # Bien
10 TAX_RATE = 21
11
12 def totalprice(price , quantity):
13 return (price * quantity) * (1 + TAX_RATE / 100)
14
15 print("Prix total : " + str(totalprice (7.99 , 5)) + " euros")
16
Variable indexée (1)
Utiliser à bon escient les listes pour avoir plusieurs variables
Éviter les variables nommées avec des nombres
1 # Pas bien
2 grade1 = 12.5
3 grade2 = 7.5
4 grade3 = 18.5
5
6 # ...
7
8 # Bien
9 grade = [12.5 , 7.5, 18.5]
10
11 # ...
17
Variable indexée (2)
Utiliser les boucles pour parcourir une liste
Permet d’effectuer le même traitement sur plusieurs données
1 # Pas bien
2 # ...
3
4 print(grade1)
5 print(grade2)
6 print(grade3)
7
8 # Bien
9 # ...
10
11 for i in range (3):
12 print(grade[i])
18
Variable indexée (3)
Utiliser à bon escient les listes pour avoir plusieurs variables
Éviter les variables nommées avec des nombres
1 # Pas bien
2 grade_louis_python = 18.5
3 grade_louis_proba = 8.5
4 grade_valerian_python = 2.5
5 grade_boucquey_python = 10
6 grade_cousin_proba = 11.5
7
8 # Bien
9 grade = {
10 ’louis ’: {’python ’: 18.5 , ’proba ’: 8.5} ,
11 ’valerian ’: {’python ’: 2.5} ,
12 ’boucquey ’: {’python ’: 10},
13 ’cousin ’: {’proba ’: 11.5} ,
14 }
15
16 # ...
19
Bloc else inutile
Contrôler le niveau d’indentation en évitant des blocs else
Affecter une valeur par défaut avant l’instruction if
1 # Pas bien
2 if grade < 10:
3 verdict = "Raté"
4 else:
5 verdict = "Réussi"
6
7 # Bien
8 verdict = "Raté"
9 if grade >= 10:
10 verdict = "Réussi"
20
Instruction return
L’instruction return quitte la fonction en cours d’exécution
Possibilité d’éviter une instruction else inutile
1 # Pas bien
2 def verdict(grade):
3 if grade < 10:
4 return "Raté"
5 else:
6 return "Réussi"
7
8 # Bien
9 def verdict(grade):
10 if grade < 10:
11 return "Raté"
12 return "Réussi"
21
Duplication de code
Éviter la duplication de code (exacte ou quasi-exacte)
Une mise à jour du code doit se faire partout
Des erreurs de copier-coller sont possibles
Le code est lourd
1 # Pas bien
2 dvd = 17.50
3 coca = 0.70
4 print("Prix : ", dvd * 1.21)
5 print("Prix : ", coca * 1.21)
6
7 # Bien
8 def price(item):
9 return item * 1.21
10
11 items = {’dvd ’: 17.50 , ’coca ’: 0.70}
12 for item in items:
13 print("Prix : ", price[item ])
22
Découpe en fonctions
Éviter des codes trop longs en créant des fonctions
Simplifier la lisibilité et la réutilisabilité
1 # Pas bien
2 data = (12, 7)
3 if data [0] < data [1]:
4 sorted = data
5 else:
6 sorted = (data [1], data [0])
7
8 # Bien
9 def sort(data):
10 if data [0] > data [1]:
11 return (data [1], data [0])
12 return data
13
14 sorted = sort ((12 , 7))
23
Layout de code
Un layout correct de code fait ressortir la logique
Utilisation de blancs, lignes vides, parenthèses pour expressions...
Une ligne de code ne devrait pas dépasser 80 caractères
Dans une classe, d’abord les constructeurs puis les méthodes
1 # Pas bien
2 x=12+3*y
3 if x >=0: print("Hello , it’s me")
4 else:print("Heeeeey macarena!")
5
6 # Bien
7 x = 12 + 3 * y
8 if x >= 0:
9 print("Hello , it’s me")
10 else:
11 print("Heeeeey macarena!")
24
Commentaire (1)
On retrouve plusieurs types de commentaires
Répétition du code
Explication du code
Marqueur dans le code
Un bon commentaire peut servir plusieurs buts
Résumé du code (focus sur le pourquoi, pas le comment)
Expliquer l’intention du code (niveau problème, pas solution)
Information additionnelle non présente dans le code
“Good code is its own documentation” — Steve McConnell
25
Commentaire (2)
26
Convention de codage
Convention de codage
Ensemble de règles de style de codage
Conventions établies pour une société, un langage, un projet...
Plusieurs avantages
Un développeur rentre plus vite dans le code d’un autre
Uniformité pour un projet avec plusieurs développeurs
Augmentation de la lisibilité et de la productivité
Consistence accrue au sein d’un projet
28
Code pythonique
PEP 0008 — Style Guide for Python Code
https://www.python.org/dev/peps/pep-0008/
Un code est plus souvent lu qu’écrit (Guido van Rossum)
Ensemble de conventions pour améliorer la lisibilité
Il s’agit d’un guide et pas d’une Bible
À ne pas suivre aveuglément, faire confiance à son jugement
29
Mise en page (1)
Indentation du code avec quatre espaces
Alignement des éléments imbriqués en cas de coupure de ligne
1 def createperson (firstname , lastname , birthdate ,
2 sex , address , weight , height):
3 if (sex == ’F’ or
4 sex == ’M’):
5 # ...
Déclaration de liste, ensemble... sur plusieurs lignes
1 data = [
2 1, 2, 3,
3 4, 5, 6
4 ]
30
Mise en page (2)
Longueur maximale d’une ligne de code limitée à 79 caractères
Et 72 pour des longs blocs de texte (commentaire, docstring...)
Continuation de ligne avec le caractère backslash
1 with open(’/Users/combefis/Desktop/video -ole -ole.mp4 ’), 
2 open(’/Users/combefis/Desktop/marchand -brouette.jpg ’):
3 # ...
Lignes vides avant les définitions de fonction et classe
Deux lignes vides pour celles dans le fichier
Une ligne vide avant les méthodes
Et séparation de parties logiques
31
Importation
Un import par ligne pour les modules
Éviter les from ... import *
1 # Pas bien
2 import os , sys
3
4 # Bien
5 import os
6 import sys
Après commentaires de module, avant constantes globales
1 d’abord librairie standard
2 puis librairies 3rd party
3 et enfin spécifique à l’application
32
Espace et blanc
Éviter les espaces dans les situations suivantes
Juste dans les parenthèses, crochets, accolades
Avant une virgule ou un deux-points (sauf slices)
Avant une parenthèse d’appel de fonction, crochet d’accès
Pas plus d’un espace autour opérateur (sauf param. nommé)
1 # Pas bien
2 def func(name = ’MAR ’):
3 preferences = { name : [’CBF ’ , ’FLE’ ]}
4 values = data [2 :4]
5 verdict = getresult (’LUR’)
6
7 # Bien
8 def func(name=’MAR ’):
9 preferences = {name: [’CBF ’, ’FLE ’]}
10 values = data [2:4]
11 verdict = getresult(’LUR ’)
33
Commentaire
Mettre à jour les commentaires en même temps que le code
Écrire les commentaires en anglais
Faire une phrase complète qui finit par un point
Éviter les commentaires sur la même ligne
Distrait le lecteur du code
1 # Pas bien
2 x += 1 # Incrémente la variable x de une unité
3
4 # Bien
5 # Compensation pour la largeur de la bordure
6 x += 1
34
Choisir ses noms
Nom de variables et de fonctions en minuscule
Nom de constante en majuscule
Nom de classe en majuscule en casse chameau
1 class ComplexNumber :
2 def __init__(self , real , imag):
3 self.__real = real
4 self.__imag = imag
5
6 def norm(self):
7 return math.sqrt(self.__real ** 2 + self.__imag ** 2)
8
9 ZERO = ComplexNumber (0, 0)
35
Crédits
https://www.flickr.com/photos/dreamsjung/12613244714
https://www.flickr.com/photos/alixia88/6777232356
https://www.flickr.com/photos/roadsidepictures/2222477980
36

More Related Content

What's hot

Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en pythonMariem ZAOUALI
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielleECAM Brussels Engineering School
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDBMongoDB
 
POO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetPOO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetMouna Torjmen
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Exercice 2 java Héritage
Exercice 2  java HéritageExercice 2  java Héritage
Exercice 2 java HéritageNadaBenLatifa
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objetAmir Souissi
 
chap2 algorithme de recherche.pdf
chap2 algorithme de recherche.pdfchap2 algorithme de recherche.pdf
chap2 algorithme de recherche.pdfdonixwm
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Formation python
Formation pythonFormation python
Formation pythonj_lipaz
 
POO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismePOO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismeMouna Torjmen
 
Dba oracle-v1
Dba oracle-v1Dba oracle-v1
Dba oracle-v1infcom
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétudeSana Aroussi
 

What's hot (20)

Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en python
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDB
 
POO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetPOO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & Objet
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Exercice 2 java Héritage
Exercice 2  java HéritageExercice 2  java Héritage
Exercice 2 java Héritage
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
chap2 algorithme de recherche.pdf
chap2 algorithme de recherche.pdfchap2 algorithme de recherche.pdf
chap2 algorithme de recherche.pdf
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Ch7 memoires
Ch7 memoiresCh7 memoires
Ch7 memoires
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Formation python
Formation pythonFormation python
Formation python
 
POO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismePOO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et Polymorphisme
 
Dba oracle-v1
Dba oracle-v1Dba oracle-v1
Dba oracle-v1
 
Récursivité
RécursivitéRécursivité
Récursivité
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétude
 

Viewers also liked

Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé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 PRUSSECAM 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 communicationECAM 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
 
la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...najwa sabouk
 
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 professionnelECAM Brussels Engineering School
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileECAM 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 projetECAM 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
 
Réseaux des neurones
Réseaux des neuronesRéseaux des neurones
Réseaux des neuronesMed Zaibi
 
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
 
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ésECAM 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èresECAM Brussels Engineering School
 

Viewers also liked (20)

Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
 
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
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
 
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
 
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 : 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...
 
la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 
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
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
 
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
 
UKO-JAVA1001-slides
UKO-JAVA1001-slidesUKO-JAVA1001-slides
UKO-JAVA1001-slides
 
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 : 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...
 
Réseaux des neurones
Réseaux des neuronesRéseaux des neurones
Réseaux des neurones
 
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...
 
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
 
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 graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 

Similar to Python avancé : Qualité de code et convention de codage

Cours c#
Cours c#Cours c#
Cours c#zan
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winformsChristophe Zome
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Chap 1 Initiation.pptx
Chap 1 Initiation.pptxChap 1 Initiation.pptx
Chap 1 Initiation.pptxolfaharrabi2
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Laurent BUNIET
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)ISIG
 
Test unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeTest unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeHadrien Blanc
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage CAbdoulaye Dieng
 
initiation au javascript
initiation au javascriptinitiation au javascript
initiation au javascriptAbdoulaye Dieng
 

Similar to Python avancé : Qualité de code et convention de codage (20)

Cours c#
Cours c#Cours c#
Cours c#
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Formation python
Formation pythonFormation python
Formation python
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winforms
 
Theme 6
Theme 6Theme 6
Theme 6
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Chap 1 Initiation.pptx
Chap 1 Initiation.pptxChap 1 Initiation.pptx
Chap 1 Initiation.pptx
 
langage C++
langage C++langage C++
langage C++
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Tp1 matlab
Tp1 matlab Tp1 matlab
Tp1 matlab
 
Ns algo 2
Ns algo 2Ns algo 2
Ns algo 2
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Test unitaires - refactoring - clean code
Test unitaires - refactoring - clean codeTest unitaires - refactoring - clean code
Test unitaires - refactoring - clean code
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
 
initiation au javascript
initiation au javascriptinitiation au javascript
initiation au javascript
 

More from ECAM Brussels Engineering School

More from ECAM Brussels Engineering School (10)

Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
 
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é
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
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 : 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
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 

Python avancé : Qualité de code et convention de codage

  • 1. IN20 Informatique Séance 10 Qualité de code et convention de codage Sébastien Combéfis, Quentin Lurkin lundi 7 décembre 2015
  • 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. Rappels Librairie standard Python Traitement de texte Types de données Mathématique Fichiers et répertoires Réseau et communication par Internet Socket et communication entre processus Manipulation de données sur Internet 3
  • 4. Objectifs Qualité de code Refactoring Bonne pratique Convention de codage Règle de style Pythonique Mise en forme du code 4
  • 6. Qualité de code Différence entre code fonctionnel et code de qualité Un code peut être audité pour évaluer sa qualité Plusieurs avantages Facilité de lecture du code Mise à jour plus aisée Moins de bug Ensemble de règles de bonne pratique 6
  • 7. Outil Pylint (1) Vérification automatisée de nombreuses règles de style Convention de codage (PEP 0008) Détection d’erreurs (interface, import modules...) Aide au refactoring (code dupliqué...) Suggestion d’amélioration du code Interface graphique simple en Tkinter 7
  • 10. Writing programs is like writing books
  • 11. Nom de variable Un nom de variable doit expliquer sa raison d’être Le nom décrit la variable et la documente Longueur optimale du nom entre 9 à 15 caractères Nom plus court que 9 caractères autorisé pour certains cas 1 # Pas bien 2 My_AgE = 27 3 istheavatardeadornot = False 4 the_price_of_the_item = 8.99 5 6 # Bien 7 age = 25 8 dead = True 9 price = 12.99 10
  • 12. Choisir le nom Préférer les noms de variables en anglais Attention à l’orthographe dans les noms ! Attention aux noms difficilement lisibles char1 et charl, C0nf et COnf, GREAT et 6REAT... Quelques situations à éviter Noms proches : input et inputVal Noms similaires : clientRec et clientRep Éviter les nombres : total1 et total2 Ne pas mélanger les langues 11
  • 13. Utilisation de variable Une variable est utilisée pour une seule raison Éviter les variables avec plusieurs signification selon la valeur Éviter les nombres magiques avec des constantes Variable dont on ne change pas la valeur (et nom majuscule) Utiliser une variable pour éviter de la duplication de code 1 # Pas bien 2 for beer in database[’food ’][’beers ’]: 3 print(database[’food ’][’beers ’][ beer ][’name ’]) 4 5 # Bien 6 beers = database[’food ’][’beers ’] 7 for beer in beers: 8 print(beers[beer ][’name ’]) 12
  • 14. Expression booléenne (1) Une condition est une expression booléenne if-else pas nécessaire pour affecter une variable booléenne 1 # Pas bien 2 if x > 170: 3 accepted = True 4 else: 5 accepted = False Affectation directe d’une expression booléenne 1 # Bien 2 accepted = x > 170 13
  • 15. Expression booléenne (2) Pas comparer une variable booléenne avec True/False Une variable booléenne est déjà une condition 1 # Pas bien 2 if hasmoney == True: 3 print("Je peux acheter") 4 5 if forbidden == False: 6 print("Ne pas entrer") Utilisation directe de la variable booléenne 1 # Bien 2 if hasmoney: 3 print("Je peux acheter") 4 5 if not forbidden: 6 print("Ne pas entrer") 14
  • 16. Simplification d’expressions booléennes Simplification avec les opérateurs logiques Utilisation des règles logiques sur les expressions booléennes Règles d’équivalence logique not x > 0 ≡ x <= 0 not (x and y) ≡ not x or not y (De Morgan) 1 # Pas bien 2 success = not grade < 10 3 result = not (temperature > 15 and temperature <= 32) 4 5 # Bien 6 success = grade >= 10 7 result = temperature <= 15 or temperature > 32 15
  • 17. Variable inutile Ne pas déclarer une variable qui n’est utilisée qu’une seule fois Sauf pour augmenter la lisibilité ou éviter un nombre magique 1 # Pas bien 2 def totalprice(price , quantity): 3 taxrate = 21 4 return (price * quantity) * (1 + taxrate / 100) 5 6 sentence = "Prix total : " 7 print(sentence + str(totalprice (7.99 , 5)) + " euros") 8 9 # Bien 10 TAX_RATE = 21 11 12 def totalprice(price , quantity): 13 return (price * quantity) * (1 + TAX_RATE / 100) 14 15 print("Prix total : " + str(totalprice (7.99 , 5)) + " euros") 16
  • 18. Variable indexée (1) Utiliser à bon escient les listes pour avoir plusieurs variables Éviter les variables nommées avec des nombres 1 # Pas bien 2 grade1 = 12.5 3 grade2 = 7.5 4 grade3 = 18.5 5 6 # ... 7 8 # Bien 9 grade = [12.5 , 7.5, 18.5] 10 11 # ... 17
  • 19. Variable indexée (2) Utiliser les boucles pour parcourir une liste Permet d’effectuer le même traitement sur plusieurs données 1 # Pas bien 2 # ... 3 4 print(grade1) 5 print(grade2) 6 print(grade3) 7 8 # Bien 9 # ... 10 11 for i in range (3): 12 print(grade[i]) 18
  • 20. Variable indexée (3) Utiliser à bon escient les listes pour avoir plusieurs variables Éviter les variables nommées avec des nombres 1 # Pas bien 2 grade_louis_python = 18.5 3 grade_louis_proba = 8.5 4 grade_valerian_python = 2.5 5 grade_boucquey_python = 10 6 grade_cousin_proba = 11.5 7 8 # Bien 9 grade = { 10 ’louis ’: {’python ’: 18.5 , ’proba ’: 8.5} , 11 ’valerian ’: {’python ’: 2.5} , 12 ’boucquey ’: {’python ’: 10}, 13 ’cousin ’: {’proba ’: 11.5} , 14 } 15 16 # ... 19
  • 21. Bloc else inutile Contrôler le niveau d’indentation en évitant des blocs else Affecter une valeur par défaut avant l’instruction if 1 # Pas bien 2 if grade < 10: 3 verdict = "Raté" 4 else: 5 verdict = "Réussi" 6 7 # Bien 8 verdict = "Raté" 9 if grade >= 10: 10 verdict = "Réussi" 20
  • 22. Instruction return L’instruction return quitte la fonction en cours d’exécution Possibilité d’éviter une instruction else inutile 1 # Pas bien 2 def verdict(grade): 3 if grade < 10: 4 return "Raté" 5 else: 6 return "Réussi" 7 8 # Bien 9 def verdict(grade): 10 if grade < 10: 11 return "Raté" 12 return "Réussi" 21
  • 23. Duplication de code Éviter la duplication de code (exacte ou quasi-exacte) Une mise à jour du code doit se faire partout Des erreurs de copier-coller sont possibles Le code est lourd 1 # Pas bien 2 dvd = 17.50 3 coca = 0.70 4 print("Prix : ", dvd * 1.21) 5 print("Prix : ", coca * 1.21) 6 7 # Bien 8 def price(item): 9 return item * 1.21 10 11 items = {’dvd ’: 17.50 , ’coca ’: 0.70} 12 for item in items: 13 print("Prix : ", price[item ]) 22
  • 24. Découpe en fonctions Éviter des codes trop longs en créant des fonctions Simplifier la lisibilité et la réutilisabilité 1 # Pas bien 2 data = (12, 7) 3 if data [0] < data [1]: 4 sorted = data 5 else: 6 sorted = (data [1], data [0]) 7 8 # Bien 9 def sort(data): 10 if data [0] > data [1]: 11 return (data [1], data [0]) 12 return data 13 14 sorted = sort ((12 , 7)) 23
  • 25. Layout de code Un layout correct de code fait ressortir la logique Utilisation de blancs, lignes vides, parenthèses pour expressions... Une ligne de code ne devrait pas dépasser 80 caractères Dans une classe, d’abord les constructeurs puis les méthodes 1 # Pas bien 2 x=12+3*y 3 if x >=0: print("Hello , it’s me") 4 else:print("Heeeeey macarena!") 5 6 # Bien 7 x = 12 + 3 * y 8 if x >= 0: 9 print("Hello , it’s me") 10 else: 11 print("Heeeeey macarena!") 24
  • 26. Commentaire (1) On retrouve plusieurs types de commentaires Répétition du code Explication du code Marqueur dans le code Un bon commentaire peut servir plusieurs buts Résumé du code (focus sur le pourquoi, pas le comment) Expliquer l’intention du code (niveau problème, pas solution) Information additionnelle non présente dans le code “Good code is its own documentation” — Steve McConnell 25
  • 29. Convention de codage Ensemble de règles de style de codage Conventions établies pour une société, un langage, un projet... Plusieurs avantages Un développeur rentre plus vite dans le code d’un autre Uniformité pour un projet avec plusieurs développeurs Augmentation de la lisibilité et de la productivité Consistence accrue au sein d’un projet 28
  • 30. Code pythonique PEP 0008 — Style Guide for Python Code https://www.python.org/dev/peps/pep-0008/ Un code est plus souvent lu qu’écrit (Guido van Rossum) Ensemble de conventions pour améliorer la lisibilité Il s’agit d’un guide et pas d’une Bible À ne pas suivre aveuglément, faire confiance à son jugement 29
  • 31. Mise en page (1) Indentation du code avec quatre espaces Alignement des éléments imbriqués en cas de coupure de ligne 1 def createperson (firstname , lastname , birthdate , 2 sex , address , weight , height): 3 if (sex == ’F’ or 4 sex == ’M’): 5 # ... Déclaration de liste, ensemble... sur plusieurs lignes 1 data = [ 2 1, 2, 3, 3 4, 5, 6 4 ] 30
  • 32. Mise en page (2) Longueur maximale d’une ligne de code limitée à 79 caractères Et 72 pour des longs blocs de texte (commentaire, docstring...) Continuation de ligne avec le caractère backslash 1 with open(’/Users/combefis/Desktop/video -ole -ole.mp4 ’), 2 open(’/Users/combefis/Desktop/marchand -brouette.jpg ’): 3 # ... Lignes vides avant les définitions de fonction et classe Deux lignes vides pour celles dans le fichier Une ligne vide avant les méthodes Et séparation de parties logiques 31
  • 33. Importation Un import par ligne pour les modules Éviter les from ... import * 1 # Pas bien 2 import os , sys 3 4 # Bien 5 import os 6 import sys Après commentaires de module, avant constantes globales 1 d’abord librairie standard 2 puis librairies 3rd party 3 et enfin spécifique à l’application 32
  • 34. Espace et blanc Éviter les espaces dans les situations suivantes Juste dans les parenthèses, crochets, accolades Avant une virgule ou un deux-points (sauf slices) Avant une parenthèse d’appel de fonction, crochet d’accès Pas plus d’un espace autour opérateur (sauf param. nommé) 1 # Pas bien 2 def func(name = ’MAR ’): 3 preferences = { name : [’CBF ’ , ’FLE’ ]} 4 values = data [2 :4] 5 verdict = getresult (’LUR’) 6 7 # Bien 8 def func(name=’MAR ’): 9 preferences = {name: [’CBF ’, ’FLE ’]} 10 values = data [2:4] 11 verdict = getresult(’LUR ’) 33
  • 35. Commentaire Mettre à jour les commentaires en même temps que le code Écrire les commentaires en anglais Faire une phrase complète qui finit par un point Éviter les commentaires sur la même ligne Distrait le lecteur du code 1 # Pas bien 2 x += 1 # Incrémente la variable x de une unité 3 4 # Bien 5 # Compensation pour la largeur de la bordure 6 x += 1 34
  • 36. Choisir ses noms Nom de variables et de fonctions en minuscule Nom de constante en majuscule Nom de classe en majuscule en casse chameau 1 class ComplexNumber : 2 def __init__(self , real , imag): 3 self.__real = real 4 self.__imag = imag 5 6 def norm(self): 7 return math.sqrt(self.__real ** 2 + self.__imag ** 2) 8 9 ZERO = ComplexNumber (0, 0) 35