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