imprimable - imagecomputing.net

publicité
Erreur programmeurs
Les erreurs utilisateurs ne sont pas les + courantes
=> Erreurs du programmeurs
Les assertions
Ne devrait accepter
que des nombres
entre [0,4]
001
Erreur utilisateur
003
Erreur programmeurs
Prévient de l'erreur
du programmeur
Vous connaissez déjà les erreurs utilisateurs
(saisies protégées)
Dialogue
avec
l'utilisateur
002
004
Erreur programmeurs
Erreur programmeurs
Prévient de l'erreur
du programmeur
Mais
3 lignes de debug pour
une ligne d'action
Pas d'information sur
l'origine de l'erreur
- fonction?
- !chier?
- quel indice?
+ Court
+ Précis
assert(condition)
<=> certi!e que (condition est vraie)
005
007
Erreur programmeurs
Erreur programmeurs
Précis
Ingérable pour un
grand code
+ Court
+ Précis
erreur.c:8: accede: Assertion `k>=0 && k<=5' failed.
!chier
006
ligne
fonction
condition
008
Fonction Assert
Fonction Assert
assert(condition)
assert(condition)
Condition uniquement véri!ée
en mode "developement"
Certi!cation d'un paramètre du code
gcc mon_pgm.c
assert véri!é
gcc mon_pgm.c -DNDEBUG
assert non véri!é
Détection d'erreur de code
Aide pour le programmeur
+ Pas de perte de temps: ne vous limitez pas
sur les assert()
- Non utilisable pour les erreurs "runtime"
> Utiliser les if
009
Fonction Assert
011
Utilisation Assert
assert(condition)
Mon paramètre doit-il véri!er certains critères ?
Condition uniquement véri!ée
en mode "developement"
Oui
Non
Pas de véri!cations
gcc mon_pgm.c
assert véri!é
gcc mon_pgm.c -DNDEBUG
assert non véri!é
Le paramètre dépend-il de l'utilisateur/système
lors de l'execution ?
Oui
Assert(condition)
010
Non
If(condition)
012
Developpement par hack
On écrit le code
Méthodologies de conception
On tente de compiler
Développement par contrat
Développement par algorithmes
Développement par tests
si KO
Patch
si OK
On execute
si KO
si OK
013
Comment écrire un bon code ?
Fonction suivante
015
Developpement par hack
On écrit le code
Plusieurs méthodologies de conception:
On tente de compiler
si KO
Patch
si OK
-
Developpement
Developpement
Developpement
Developpement
par
par
par
par
On execute
contrats
tests
algorithmes
hack
si KO
si OK
Fonction suivante
Avantages:
Minimise e!ort intellectuel à court terme
Inconvénients:
Patch dès le début
=> Di"cile à lire (machine qui guide)
=> Ingérable pour des gros projets
014
016
Developpement par contrats
Avant d'écrire l'implémentation d'une fonction
entrées
On dé ni:
Méthodologies de conception
contrat avec le programmeur
1- Les suppositions sur les arguments d'entrées
(ou état d'un système)
sorties
Fonction
+
+
certi cation garanties
suppositions
2- Les certi cations après execution de la fonction
Développement par contrat
Développement par algorithmes
Développement par tests
Avantages:
- On empèche les cas particuliers/e!ets de bords
=> on le les oublies pas
- Auto-documente la fonction
- Aide au tests, garantie la validité
=> réduction des bugs
Inconvénients:
- Travail supplémentaire en amont
019
017
Developpement par contrats
Developpement par contrats
entrées
Exemple:
Avant d'écrire l'implémentation d'une fonction
On dé!ni:
sorties
Fonction
+
+
certi cation garanties
suppositions
contrat avec le programmeur
1- Les suppositions sur les arguments d'entrées
(ou état d'un système)
R*(z2-z1);
Fonction OK?
z
2- Les certi!cations après execution de la fonction
z2
entrées
+
suppositions
R
sorties
Fonction
z1
+
certi!cation garanties
018
020
Developpement par contrats
entrées
Fonction
+
+
certi cation garanties
suppositions
Exemple:
*R
Developpement par contrats
sorties
sorties
Fonction
+
+
certi cation garanties
suppositions
+ Auto-documentation:
contrat
avec le programmeur
z
si non véri ée:
quitte en indiquant la ligne
entrées
Synthèse:
z2
(le code est
la documentation)
+ Cas particuliers gérés:
(pas d'oublis)
R
R*(z2-z1);
- de debug
- explications, +lisible
=> gain de temps au nal
z1
021
Developpement par contrats
entrées
Exemple:
Developpement par contrats
entrées
sorties
Fonction
+
+
certi cation garanties
suppositions
023
Exemple 2:
+
suppositions
sorties
Fonction
+
certi cation garanties
*R
autre contrat possible
avec le programmeur
z
z2
R*(z2-z1);
contrat
à mettre dans l'en-tête
R
z1
implémentation
022
024
entrées
! ! No
tio
sentielle
!!
T
N
RTA
A Sa v
o
sorties
Fonction
+
+
suppositions
Es
ir
Developpement par contrats
n
O
IMP
certi cation garanties
Méthodologies de conception
Proposition de syntaxe:
Développement par contrat
Développement par algorithmes
Développement par tests
A mettre dans le chier d'en-tête : documentation
025
Programmation défensive?
027
Programmation par algorithme
Avant d'écrire l'implémentation d'une fonction
Passer un contrat avec le programmeur?
Mais programmeur = vous?
On écrit:
L'algorithme dans un language humain
Vous êtes la 1ère source d'erreur / bugs
Protégez vous contre vous même!
Attention: algorithme != code
assert()
if(){}
...
026
028
Programmation par algorithme
Programmation par algorithme
Exemple:
Exemple:
??
029
Programmation par algorithme
031
Programmation par algorithme
Exemple:
Exemple:
>
<
complétion
030
032
Programmation par algorithme
Programmation par algorithme
Exemple:
Ne pas confondre algorithme et code
ex.
033
A NE PAS FAIRE!
réécriture mots pour mots
les commentaires n'apportent aucune amélioration de
lisibilité au code
035
Programmation par algorithme
Synthèse
Méthodologies de conception
+ Documentation du code automatique
Développement par contrat
Développement par algorithmes
Développement par tests
+ Aide à l'écriture du code
+ lisible
+ code meilleur qualité
034
036
Programmation par tests
Programmation par tests
Exemple:
Avant d'écrire l'implémentation d'une fonction
On écrit:
Les tests que doivent satisfaire la fonction
En général:
On connait ce que doit faire la fonction
avant de connaitre son code
var_1
var_2
sortie attendue
implémentation
possible
Fonction
valide
039
037
Programmation par tests
Programmation par tests
Exemple:
Exemple:
pile
courante
??
tests di!érents cas:
valides + invalides
valeur
Empile
pile
modi!ée
"xe entrée
=> attend sortie spéci"que
038
a"chage
040
Programmation par tests
Programmation par tests
pile
courante
valeur
Empile
Exemple:
Synthèse:
??
pile
modi!ée
a"chage
+ Aide à dé!nir l'interface de la fonction (paramètres, entrées/sorties)
(pas d'ajout de paramètres une fois le corps écrit)
+ Gère les cas particuliers
(pas d'oublis)
+ Debug de la fonction immédiate: plus besoin de réécrire des tests
=> Assure la validité de la fonction
+ Gagne du temps sur l'écriture des tests
(qui doivent avoir lieu plus tard sinon)
+ Valider les fonctionnalitées à tout moment.
Code qui ne régresse pas
041
043
Programmation par tests
pile
courante
valeur
Empile
Exemple:
??
pile
modi!ée
a"chage
Organisation des données
pile
courante
Pointeurs/Structs
valeur
Declaration
Passage de paramètres
Mot clé const
pile
modifée
a"chage
042
044
Déclaration structs
Importance struct+fonctions
Importance des structs + fonctions
explicite
struct anonyme
fonctions
agissants sur une struct
Implémentation
047
045
Bonne pratique: documentation
Importance struct+fonctions
Documentez un maximum vos déclarations de structs
Modélise une abstraction
vecteur
voiture / roues, ...
+ Cache la complexité
+ Manipulation aisée des données
n
Es
sentielle
!!
IMP
T
TAN
OR
ir
!! No
tio
roles,
plage de variations,
valeurs typiques,
explications, ...
A Sa v
o
046
048
Passage de paramètres
Organisation des données
Passage par copie
Pointeurs/Structs
Declaration
Passage de paramètres
Mot clé const
049
Passage de paramètres
051
Passage de paramètres
Passage de paramètres
Copie réellement
nécessaire ?
copie
copie: struct a=b
Pour tout les champs <k>
a.<k>=b.<k>
Fin Pour
050
052
Passage de paramètres
Passage de paramètres
Mot clé const
Passage par pointeur
= 8 octets < sizeof(v8)
32 octets
Assure que a n'est pas modi!é
Pas besoin de regarder l'implémentation
055
053
Passage de paramètres
Passage de paramètres
Passage de paramètres
Mot clé const
Pointeur
=>danger d'intégrité
Comment détecter/éviter?
Assure que a n'est pas modi!é
Pas besoin de regarder l'implémentation
implémentation identique
054
056
Mot clé const: utilisation
const se propage
Organisation des données
Pointeurs/Structs
Declaration
Passage de paramètres
Mot clé
const
057
Mot clé const
059
Mot clé const: utilisation
const se propage
En cas d'erreur:
compilation
Evite de mal coder!!
058
060
Mot clé const: placement
Mot clé const: utilisation
const se propage
Identique:
const int a;
int const a;
const int *a;
int const *a;
Attention au placement de *
modi!able
constant
int const *a;
int *const a;
ne sont pas équivalents!
063
061
Mot clé const: Synthèse
Mot clé const: placement
- Passer les structs par pointeurs
(choix)
- pointeur lui même constant
- pointeur vers valeur constante
- Tous pointeurs passés en const !
(bonne programmation)
=> Enlever le const uniquement si nécessaire
//erreur
//OK
véri cation du compilateur
code n'est pas impacté
(aucun désavantage)
- on peut cumuler:
- pointeurs mulitples:
062
=> Trop complexe
=> Utiliser des structs
intermédiaires
064
Téléchargement