Algorithmique Programmation FIP - Techniques de Programmation
Transcription
Algorithmique Programmation FIP - Techniques de Programmation
Algorithmique Programmation FIP Algorithmique Programmation FIP Techniques de Programmation en Java ING39 Septembre 2016 Cours 1 : Introduction Algorithmique Programmation FIP 1. Objectifs & organisation Algorithmique Programmation FIP Objectifs I Capacité à écrire des programmes Java de taille conséquente I Fluidité dans la conceptions de programmes : I I I développement guidé par les tests (eXtreme programming). décomposition modulaire et objet. travailler avec différents paradigmes de la programmation : orienté objet, impératif, événementiel, web I Utiliser les bibliothèques Java. I Travailler avec un IDE et un gestionnaire de versions. Algorithmique Programmation FIP Enseignants I Pierre Courtieu I Serge Rosmorduc I M.V Aponte (responsable du module) Algorithmique Programmation FIP Pré-requis I Connaissance d’un langage de programmation de haut niveau (pas forcément Java) ; I Vous êtes capables d’écrire un programme simple avec boucles (entre 10 et 100 lignes). Algorithmique Programmation FIP Organisation I Cours : les matins, ≈ 1h30 à 2 heures (salle change selon semaines). I TPs : les après-midi, parfois débutent en fin de matinée (salle des Marchés). I Environnement de programmation : Netbeans + JUnit4. I Gestion de ressources : I I I serveur distant + logiciel gestionnaires des versions cette année sera Git. Attention : Pas de machine autorisée pendant les cours. Algorithmique Programmation FIP Evaluation I 1 ou 2 TPs notés par semaine. I Un examen final. I Note du module : somme pondérée notes de TP & d’examen. I Les Tps notés porteront souvent sur une extension/ modification du sujet de TP de la veille ou de la semaine. I ⇒ vous avez intérêt à programmer de manière suffisamment générale pour faciliter les modifications ! Algorithmique Programmation FIP Les Tps I I pas de rattrape, pas de corrigés, mais un debiefring après chaque TP noté. Majoritairement notés par tests automatiques : I I I note dépend du % de tests réussis. on vous en donnera quelques uns avec l’énoncé. vous devrez écrire les autres. I Soumission sur le serveur distant (via Netbeans + gestionnaires des versions). Pas de soumission en retard. I Tps notés + examens → individuels. Copie interdite. Algorithmique Programmation FIP 2. Approche de développement adoptée dans ce cours Algorithmique Programmation FIP Pratiques de développement Nous adoptons quelques principes de l’eXtreme Programming 1. communication ⇒ programmation en binôme ; 2. simplicité ⇒ la méthode la plus simple d’arriver au résultat est retenue à priori ; 3. le feed-back via les tests ⇒ programmation guidé par les tests ; 4. la qualité du code ⇒ meilleure assurance de la robustesse, diminution de coûts de maintenance ; 5. les tests sont effectués au plus tôt ; Algorithmique Programmation FIP Tests unitaires & programmation guidée par les tests Avant de coder une fonctionnalité : I le programmeur écrit un jeu de tests pour tester son comportement comme prévu ; I ces test sont conservées jusqu’à la fin du développement ; I ils sont ré-jouées à chaque chaque évolution du code : I I très importan ⇒ assurer que la fonctionnalité reste correcte au cors des changements, cela s’appelle : tests de non régression Nous utiliserons JUnit 4 pour réaliser des tests unitaires. Algorithmique Programmation FIP Notre méthode de conception 1. Comprendre le problème : Concepts caractéristiques du problème, leur inter-dépendances ? 2. Formaliser les fonctionnalités : Interactions programme / son environnement ? Type de réponses attendues (fonctionnalités) ? 3. Écrire un jeu de tests : Réponses concrètes sur des entrées typiques (ou érronées) ? 4. Implanter fonctionnalités : Décomposer problème en sous-problèmes plus simples et itérer dessus cette méthode. 5. Jouer les tests + corriger code : jusqu’à obtenir comportement correct du programme. Algorithmique Programmation FIP Illustration (un exemple vraiment trivial !) Calculer la date du lendemain . . . en partant d’une date : numéro de jour , mois et année. Cette illustration a pour but de mettre l’accent dur le développement guidé par les cas de test. Algorithmique Programmation FIP Pas 1 : Comprendre le problème I Concepts caractéristiques : I I I I I I date : numéro de jour + mois + année ; la date tombe en fin de mois et/ou en fin d’année ? fin d’année : 31 décembre ; fin d mois : dépend du mois (30 ou 31), sauf pour février ; si année bissextile : la fin février tombe le 29, sinon le 28 ; But : déterminer le numéro du jour, mois et année du lendemain de la date donnée. Algorithmique Programmation FIP Pas 2 : Formaliser les fonctionnalités I Comment représenter les données ? I jour, mois et année ⇒ entiers I contraintes/hypothèses : I I on suppose que la date de départ est bien formée ⇒ donc, pas de tests sur des dates fantaisistes. Quelles fonctionnalités ? I 3 fonctions : I I I test (booléan) si une année est bissextile ; calcul du nombre de jours d’un mois ET une année ; calcul de la date du lendemain ⇒ un tableau dentiers ; Algorithmique Programmation FIP Pas 2 : Formaliser fonctionnalités en Java Nous utilisons : I des méthodes Java (sous-programmes) pour écrire les fonctions I ce seront des méthodes statiques (sans objets), I Important : I nous leurs donnons un corps vide ou presque pour permettre la compilation. I Pourquoi ? Nous écrirons le vrai code (corps de la méthode) après avoir conçu tous les tests. Algorithmique Programmation FIP Pas 2 : exemple 1 Fonctionnalité → ”tester si année bissextile” : I les commentaires décrivent le rôle des paramètres (format javadoc). I le corps contient le minimum pour que cela compile. /** * @param annee: l’annee d’une date * contrainte: annee est une annee correcte * @return true si a est bissextile */ static boolean isBissextile(int annee) { return true; } Remarque : l’implantation correcte reste à écrire !. Algorithmique Programmation FIP Pas 2 : exemple 2 Fonctionnalité → «calculer nbe jours mois dans une année» : /** * @param mois: le no. de mois d’une date * @param annee: l’annee d’une date * contrainte: @param mois et * @param annee sont corrects * @return nombre de jours de @param mois pour l’ann */ static int nbeJours(int mois, int annee){ return 0; } Remarque : l’implantation correcte reste à écrire !. Algorithmique Programmation FIP Pas 3 : Écrire un jeu de test (fonction isBissextile) Elaborer une liste de résultats pour des valeurs typiques des entrées. année 2000 2001 2100 1400 1600 2004 résultat attendu true false false false true true (∗) les exemples pourront nous alerter sur des cas non compris : une année est bissextile si elle divisible par 4 mais pas par 100, ou si elle divisible par 400. Algorithmique Programmation FIP Qu’est-ce qu’un cas de test ? Cas simple : tester une fonction f qui prend 2 paramètres x, y ; I un cas de test pour f est une ligne de la forme : : x vx I I y vy résultat attendu result vx et vy : valeurs concrètes à tester en paramètre de f , result : résultat attendu en retour de l’appel f (vx , vy ). Jeu de tests pour f Table contenant plusieurs cas de test pour f (1 par ligne). Algorithmique Programmation FIP Jouer un cas de test (à la main) Juons un seul cas de test : x vx y vy résultat attendu result 1. Invoquer f sur les entrées données pour ce cas... 2. ... tout en récupérant le résultat retourné : result = f (vx , vy ); 3. comparer résultat obtenu result avec résultat attendu result ; 4. signaler un rapport d’échec si différents. Appliquer cette méthode pour chaque cas de test du tableau. Algorithmique Programmation FIP Pas 3 : Écrire un jeu de test (fonction nbeJours) Ici, la fonction prend 2 paramètres : le tableau contient 3 colonnes. mois 12 2 3 2 2 année 2000 2000 2001 2001 1400 résultat attendu 31 29 30 28 28 (∗) les exemples pourront nous alerter sur des cas non compris. Algorithmique Programmation FIP Pas 3 (suite) : automatiser les tests Plusieurs cas de tests × plusieurs fonctions ⇒ écrire des programmes qui réalisent ces tests. I Solution : une méthode pour chaque cas de test I I qui invoque la méthode à tester sur entrées du cas de test ; et compare le résultat retourné avec celui attendu . I Très fastidieux à faire à la main et pour chaque méthode à tester ! I Alternative : JUNIT4 I I I Nous écrivons les jeux de tests ; la plateforme invoque la méthode à tester sur entrées de chaque cas de test, compare le résultat retourné avec celui attendu. et produit un rapport de succès/échec. Algorithmique Programmation FIP Pas 3 : Écrire les cas de test en JUnit4 @Test public void testIsBissext1() { System.out.println("isBissext"); int annee = 2001; boolean expResult = false; boolean result = SampleStaticDate.isBissext(annee); assertEquals(expResult, result); } 1. fixe les valeurs des entrées : annee = 2001 2. fixe le résultat attendu pour ces entrées : expResult=false 3. obtenir le résultat calculé par la méthode ( result) 4. tester si ( expResult == result), donner un rapport d’erreur sinon. Algorithmique Programmation FIP Pas 3 (fin) Nous jouns ce cas de test sur notre implantation "vide” : elle doit échouer. Algorithmique Programmation FIP Pas 4 : Implanter le comportement des méthodes Important Écrire les cas de tests avant d’écrire le code des méthodes ! Algorithmique Programmation FIP Pas 5 : Jouer les tests sur le code implanté ... puis modifier le code si nécessaire... Algorithmique Programmation FIP Répeter 1. Appliquer cette recette sur toutes les méthodes du programme ; 2. Jouer les cas de test. 3. S’assurer qu’il ne manque pas de fonctionnalités (méthodes). 4. Ajouter des tests pour les nouvelles fonctionnalités, mais ne jamais enlever ceux pour les + anciennes : I toujours ré-jouer les tests pour les anciennes fonctionnalités (tests de non-régression) ; 5. Itérer autant que nécessaire . . .