Introduction à l Informatique (INF 311) Amphi 4 : programmer avec des objets. Amphi 4 : programmer avec des objets



Documents pareils
Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Utilisation d objets : String et ArrayList

Chapitre VI- La validation de la composition.

Objets et Programmation. origine des langages orientés-objet

Corrigé des exercices sur les références

Programmer en JAVA. par Tama

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TP1 : Initiation à Java et Eclipse

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Généralités sur le Langage Java et éléments syntaxiques.

as Architecture des Systèmes d Information

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Une introduction à Java

Bases Java - Eclipse / Netbeans

Programmation en Java IUT GEII (MC-II1) 1

Auto-évaluation Programmation en Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Environnements de développement (intégrés)

Java Licence Professionnelle CISII,

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cours 1: Java et les objets

Tp 1 correction. Structures de données (IF2)

Initiation à JAVA et à la programmation objet.

Corrigés des premiers exercices sur les classes

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Chapitre 10. Les interfaces Comparable et Comparator 1

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Utiliser Java sans BlueJ

Cours 1 : La compilation

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

ACTIVITÉ DE PROGRAMMATION

Plan du cours. Historique du langage Nouveautés de Java 7

Langage Java. Classe de première SI

Programmation avec des objets : Cours 7. Menu du jour

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Classes et Objets en Ocaml.

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

TD/TP PAC - Programmation n 3

Java - la plateforme

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Objet Java Correction

Programmation par les Objets en Java

Projet de programmation (IK3) : TP n 1 Correction

UE Programmation Impérative Licence 2ème Année

Remote Method Invocation Les classes implémentant Serializable

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

PROGRAMMATION PAR OBJETS

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Anne Tasso. Java. Le livre de. premier langage. 6 e édition. Groupe Eyrolles, 2000, 2002, 2005, 2006, 2008, 2010, ISBN :

TP1 : Initiation à Java et Eclipse

INITIATION AU LANGAGE JAVA

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Java Licence Professionnelle CISII,

Traduction des Langages : Le Compilateur Micro Java

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Les bases de l informatique et de la programmation. École polytechnique

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Programmation Par Objets

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Cours d initiation à la programmation en C++ Johann Cuenin

TD3: tableaux avancées, première classe et chaînes

Héritage presque multiple en Java (1/2)

Génie Logiciel avec Ada. 4 février 2013

Bases de programmation. Cours 5. Structurer les données


ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Quatrième partie IV. Test. Test 15 février / 71

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Développement Logiciel

GESTION DE PROJET SÉANCE 2 : LES CYCLE DE VIE D'UN PROJET

Apprendre Java en 154 minutes

Design patterns. Design patterns - définition. Design patterns - avantages

Machines virtuelles fonctionnelles (suite) Compilation ML Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

LOG4430 : Architecture logicielle et conception avancée

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Eclipse atelier Java

Exercices sur les interfaces

TD/TP PAC - Programmation n 3

UE C avancé cours 1: introduction et révisions

Introduction au langage Java

4. Groupement d objets

Manuel d installation de Business Objects Web Intelligence Rich Client.

Classe Interne, Anonyme & Enumération

Gestion distribuée (par sockets) de banque en Java

Conversion d un entier. Méthode par soustraction

Transcription:

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 3/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 4/61 Introduction à l Informatique (INF 311) Modéliser, Abstraire, Programmer F. Morain Amphi 4 : programmer avec des objets 5 mai 2014 Amphi 4 : programmer avec des objets I. Préambule. II. La programmation par objets. III. Polymorphisme : interfaces. IV. Modularité. V. Étude de cas: le jour d après. A1: introduction A6 : données A2: tableaux A7 : listes chaînées A3: classes, objets A8 : arbres A4 : modularité A9 : stockage efficace de l information A5 : récursivité A10 : algorithmes semi-numériques F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 1/61 I. Préambule F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 2/61 Actualités : le bug d Internet Explorer La programmation est une des activités les plus complexes jamais entreprises par l homme. Navette spatiale: 1200 hommes années, 2200 Kisl (Kilo Instructions Source Livrées), 6 ans. B777: 4000 Kisl, 7 ans. Quelques systèmes Windows Date Produit # éq. dév. # éq. test LOC Juillet-93 NT 1.0 200 140 4-5 millions Déc-99 NT 5.0 1,400 1,700 29+ millions Oct-01 NT 5.1 1,800 2,200 40 millions Avril-03 NT 5.2 2,000 2,400 50 millions Vista?? > 50 millions (Sources : FireEye blog + MSR, Microsoft Security Advisory 2963983, 26/04/2014) IE: 26.5 % des navigateurs dans le monde Bug dans les versions IE6 à IE11 : contournement des mécanismes de protection de la mémoire (Heap Feng Shui). Bugs dans beaucoup de versions, dont certaines tournant dans XP et ne seront pas patchées (obsolescence programmée?). BIO-DIVERSITÉ

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 7/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 8/61 Mais encore? Un programme ressemble à un pont Génie logiciel (Software engineering): Spécification Programmation Correction Question primordiale: comment passe-t-on à l échelle? Grands principes : concision ; modularité interne et externe ; réutilisation. Plus le projet est grand, plus il faut soigner l architecture et le planning. Les problèmes humains ne peuvent être négligés. Découvrir les erreurs très vite est essentiel (la découverte tardive est catastrophique). Les erreurs peuvent être désastreuses (Ariane 5 1 milliard de dollars). Utiliser des préfabriqués permet de gagner du temps. Cf. The mythical Man-Month de F. P. Brooks (OS de l IBM 360, au début des années 1970). F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 5/61 Un programme n est pas un pont F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 6/61 La chaîne de production logicielle Le logiciel est purement abstrait; il est invisible, car il n est vu que par son action sur un matériel physique. Il est difficile de le faire voir à autrui. Le logiciel est écrit pour être changé, amélioré. Le logiciel est en partie réutilisable. Spécification du produit Architecture du programme Planification du travail Division en sous-systèmes Structures de données et algorithmes Découpage en modules Le logiciel peut/doit être testé à tout moment de sa création. Architecture détaillée Programmation Débogage Validation/Tests Maintenance

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 11/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 12/61 Planification du travail II. La programmation par objets Répartition du temps : 1/3 de spécification; 1/6 de programmation; 1/4 de test (alpha par les développeurs); 1/4 d intégration et test (beta par des extérieurs). Turing award 2001 pour Nygaard et Dahl: For ideas fundamental to the emergence of object oriented programming, through their design of the programming languages Simula I and Simula 67. Fonctionnalité 90% 100% Langages avec des objets: C++, Eiffel, Java, Ocaml,... 50% Temps F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 9/61 Pourquoi la programmation par objets? F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 10/61 Objets en Java Modularité: les objets favorisent le regroupement des fonctions et des données structuration. Les objets sont les instances d une classe. Ils ont un état (la valeur de leurs champs de données) et un ensemble de méthodes attachées. Rem. Modularité programmation par objets (cf. Modula, ML). Programmation incrémentale: on définit des classes qu on peut étendre par héritage a posteriori (e.g. AWT), cf. INF411, INF441. très populaire dans l industrie. données méthodes données méthodes données méthodes Très utilisée dans les boîtes à outils graphiques (look commun à toutes les fenêtres) et réseau (données et méthodes se déplacent simultanément). code données statiques

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 15/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 16/61 Objets en Java: exemple public class Rationnel{ public long num, den; public Rationnel(long n, long d){ this.num = n; this.den = d; public static Rationnel mult(rationnel r1, Rationnel r2){... public Rationnel multiplierpar(rationnel r){... Le compilateur différencie une méthode de classe, identifiée par static, d une méthode d objet sans static. On explique plus loin la raison de ces noms. F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 13/61 Pour des classes quelconques? II. Polymorphisme : interfaces Ex. Écrire une fonction qui retourne le minimum d un tableau. public static int minimum(int[] t){ int mini = 0; for(int i = 1; i < t.length; i++) if(t[i] <= t[mini]) mini = i; return t[mini]; public static double minimum(double[] t){ int mini = 0; for(int i = 1; i < t.length; i++) if(t[i] <= t[mini]) mini = i; return t[mini]; F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 14/61 L interface ELEMENT Idéalement: la fonction public static ELEMENT minimum(element[] t){ int mini = 0; for(int i = 1; i < t.length; i++) if(t[i].estpluspetit(t[mini])) mini = i; return t[mini]; devrait pouvoir marcher pour toute classe ELEMENT possédant une méthode estpluspetit. En Java, on utilise une interface. C est un exemple de polymorphisme ad hoc. On verra le polymorphisme générique plus tard. Dans le fichier ELEMENT.java: public interface ELEMENT{ public String tostring(); public boolean estpluspetit(element v); Une interface peut contenir: des méthodes d objets, des variables de classe final; mais ne peut pas contenir: des champs; des méthodes de classes.

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 19/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 20/61 Utilisation immédiate public class Tableau{ public static ELEMENT minimum(element[] t){ int mini = 0; for(int i = 1; i < t.length; i++) if(t[i].estpluspetit(t[mini])) mini = i; return t[mini]; (dans Tableau.java). Exemple 1 public class IntegerElt implements ELEMENT{ private int clef; // non requis public IntegerElt(int n){ // non requis this.clef = n; public String tostring(){ // requis return "" + this.clef; // interface + compilation public boolean estpluspetit(element w){ return this.clef <= ((IntegerElt)w).clef; (dans IntegerElt.java). F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 17/61 Exemple 1 (suite) F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 18/61 Exemple 2 import tc.tc; public class TestTableau{ public static void main(string[] args){ IntegerElt[] t = new IntegerElt[10]; for(int i = 0; i < t.length; i++){ t[i] = new IntegerElt((int)(Math.random()*10)); TC.println(t[i]); TC.println("min="+Tableau.minimum(t)); public class ChaineElt implements ELEMENT{ private String clef; // non requis public ChaineElt(String s){ // non requis this.clef = s; public String tostring(){ // requis return this.clef; public boolean estpluspetit(element w){ int cmp = this.clef.compareto(((chaineelt) w).clef); return cmp <= 0; (dans ChaineElt.java).

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 23/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 24/61 Exemple 2 (suite) import tc.tc; public class TestTableau{ Comment ça marche (1/2) interface ELEMENT public static void Test(ELEMENT[] t){ TC.println("min="+Tableau.minimum(t)); public static void main(string[] args){ ChaineElt[] u = new ChaineElt[10]; for(int i = 0; i < u.length; i++){ u[i] = new ChaineElt("a"+(int)(Math.random()*10)); TC.println(u[i]); Test(u); public class Tableau{ public static ELEMENT minimum(...) public class TestTableau public static void Test(ELEMENT[] t){ public class IntegerElt implements ELEMENT F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 21/61 Comment ça marche (2/2) F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 22/61 Intérêt des interfaces Le compilateur se satisfait de cela (grâce à interface/implements). Le choix de la méthode est faite à l exécution: liaison retardée. static: connu à la compilation. Le reste est connu à l exécution (de façon non statique). Interface = super-type = norme Souplesse: contrats entre modules. On peut changer d implantation sans perturber le programme principal. Prévoir le futur (programme évolutif) : si une nouvelle classe apparaît, on n a pas besoin de tout recompiler, grâce à la liaison retardée. Rem. C est comme cela qu on implante/utilise des plug-in(s).

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 27/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 28/61 IV. Modularité Vous avez dit modularité? (2/2) Airbus : Déf. Découper une tâche en sous-tâches les plus indépendantes possible. ailes au Royaume-Uni ; avant et arrière des fuselages en Allemagne ; nez et partie centrale des fuselages en France ; empennages verticaux en Allemagne ; mâts et nacelles des réacteurs en France ; stabilisateurs horizontaux et certaines sections de l A380 en Espagne. Desktop (bureau) : le système s occupe de la gestion des fichiers; le système de fenêtrage de l affichage. F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 25/61 Software city (1/2) F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 26/61 Software city (2/2) Vue d eclipse (Source: ERCIM NEWS, no 88, janvier 2012). 4 10 6 lignes de Java; 1,900 packages (les quartiers), 29,000 classes (immeubles: hauteur = nombre de méthodes, base = nombres de variables).

Vous l avez déjà pratiquée! Un exemple plus compliqué Math String Promotion tc.tc cie1 cie2 cie3 cie4 section natation MaClasse personnel élève A B: B utilise A. F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 29/61 A) Modularité: comment? Le découpage d un problème fait intervenir des tâches distinctes, comme dans le cas de Promotion. Classiquement, chaque tâche est appelée module. Un module a une partie publique et une partie privée. Le programmeur/utilisateur doit s attacher à ne voir des modules que la partie publique. Permet le travail collaboratif. Le programmeur de module peut se concentrer sur son module et des tests unitaires associés. En Java 1, un module est une classe. Un ensemble de classes peut former un paquetage (package) une bibliothèque (ex. MacLib). F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 30/61 Contrôle d accès Pour les membres d une classe, il y a 4 types d accès: public pour permettre l accès depuis toutes les classes. private pour restreindre l accès aux seules expressions ou fonctions de la classe courante, ainsi qu aux champs/méthodes d autres instances de la même classe: encapsulation : cacher et protéger les composantes intérieures (le type) de l objet, et forcer les accès par des méthodes. protected pour restreindre l accès aux sous-classes, cf. cours d année 2. par défaut pour autoriser l accès depuis toutes les classes du même paquetage. 1. comme en C++ F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 31/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 32/61

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 35/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 36/61 Exemple: la classe String Complément sur le type char: les constantes s écrivent a, A, 0, +,.... Il existe des caractères spéciaux :, \n, \r, \t, \. Unicode : codage des caractères sur 16 bits (vs. 8 bits en ASCII) qui permet le codage de tous les types d alphabet. Les caractères utiles pour le français sont de code compris entre \u0020 (pour espace) et \u00fc (pour ü), le tout en hexadécimal. Comment créer une String : String s = "Bonjour!"; par concaténation : s = "Bonjour" + "!"; par conversion : s = String.valueOf(i); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 33/61 Exemple : émulons la classe String public class Chaine{ // inaccessible depuis l extérieur private char[] s; public Chaine(char[] t){ this.s = new char[t.length]; for(int i = 0; i < t.length; i++) this.s[i] = t[i]; // s.length() public int longueur(){ return this.s.length; // encapsulation // s.charat(i) public char caractere(int i){ return this.s[i]; // encapsulation On ne veut pas de c.setcharat(int i). String s char[] s s.length() retourne la longueur de s (au lieu de t.length pour un tableau) ; s.charat(i) retourne le i-ième caractère de s (compté à partir de 0) ; s.equals(t) : retourne true si s et t contiennent les mêmes caractères; plus précis s.compareto(t); Immutable : on ne peut pas écrire String s = "Bonjour!"; s.charat(0) = S ; Bug.java:4: unexpected type required: variable found : value s.charat(0) = S ; ^ 1 error F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 34/61 public class TestChaine{ public static void main(string[] args){ char[] t = new char[]{ a, b, c ; Chaine str = new Chaine(t); TC.println(str.longueur()); // affiche 3 t[0] = z ; TC.println(str.caractere(0)); // affiche a TC.println(str.s[0]); // erreur à la // compilation Chaine.java:33: s has private access in Chaine System.out.println(str.s[0]); ^ 1 error Chaine est bien non mutable, comme String.

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 39/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 40/61 B) Package Règles d accès dans les paquetages Math String Pour les membres d un paquetage, il y a 2 types d accès: une classe publique peut être accédée de l extérieur de son paquetage ; tc TC TestTC une classe sans qualificatif n est accessible que depuis son paquetage; de l extérieur du paquetage, double-protection: classe + méthodes doivent être publics (pas de champs public de préférence encapsulation). MaClasse tc est un package; il contient par exemple la classe TC. F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 37/61 V. Étude de cas: le jour d après F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 38/61 Valider et tester Problème : à partir d une date donnée sous forme jj/mm/aaaa, afficher la date du lendemain. Remarques préliminaires : calendrier grégorien. quelles entrées? quelles sorties? Organisation : package le plus ouvert possible; traitement le plus précis des erreurs (utilisation d exceptions). G. J. Myers : tester, c est exécuter le programme dans l intention d y trouver des anomalies ou des défauts. Rem. Dans certaines branches de l industrie (aviation par ex.), les tests représentent 70% à 80% du coût du logiciel. Règle d or : il faut penser à écrire son programme de façon qu il soit facile à tester. écrire des tests avant d écrire le programme principal, ce qui permet de les réutiliser à chaque modification. Première décision : au moins une fonction jourplusun donnant la réponse sous la forme "jj/mm/aaaa".

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 43/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 44/61 A) Les données du problème On écrit d abord le programme de test Combien de jours m a-t-il? 1 2 3 4 5 6 31 28/29 31 30 31 30 7 8 9 10 11 12 31 31 30 31 30 31 Quand l année est-elle bissextile? si elle divisible par 4, sauf les années séculaires (divisibles par 100), qui ne sont bissextiles que si divisibles par 400. On veut tester (la future fonction) jourplusun. La fonction testaux(string jour, String attendu) devra comparer le résultat du calcul avec celui attendu. package calendrier; // modularité public class TestsLendemain{ public static void main(string[] args){ recette(); public static void recette(){ // cas normal testaux("11/01/2014", "12/01/2014"); // on change de mois testaux("31/01/2014", "01/02/2014"); // on change d année testaux("31/12/2013", "01/01/2014"); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 41/61 Tests (suite) F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 42/61 B) Définition de la classe // année non bissextile testaux("28/02/2011", "01/03/2011"); testaux("28/02/2014", "01/03/2014"); testaux("28/02/2100", "01/03/2100"); // année bissextile testaux("28/02/2000", "29/02/2000"); testaux("28/02/2012", "29/02/2012"); // erreurs de format testaux("12/12", "Il manque des informations"); // erreurs en entrée testaux("29/02/2011", "Date invalide"); // date fausse testaux("35/01/2011", "Date invalide"); package calendrier; // modularité public class Gregorien{ private int jour, mois, annee; public int getjour(){ return this.jour; public int getmois(){ return this.mois; public int getannee(){ return this.annee; public boolean equals(gregorien g){ return (this.jour == g.jour) && (this.mois == g.mois) && (this.annee == g.annee); etc., etc.

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 47/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 48/61 Vérifiez les données d entrées! Principe : on doit vérifier les données avant de les passer à des fonctions qui s en servent. public static boolean estdatevalide(int j, int m, int a){ if(a < 1600) // très conservateur return false; if((m < 1) (m > 12)) return false; if((j < 1) (j > nbjoursdansmois(m, a))) return false; return true; Combien de jours dans le mois? final public static int[] JOURS_DANS_MOIS = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; public static boolean estbissextile(int a){ if((a % 4)!= 0) return false; if((a % 100)!= 0) return true; return ((a % 400) == 0); public static int nbjoursdansmois(int m, int a){ if((m!= 2)!estBissextile(a)) return JOURS_DANS_MOIS[m-1]; else return 29; F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 45/61 Un constructeur renforcé F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 46/61 Entrée depuis une chaîne public Gregorien(int j, int m, int a) throws Exception{ // on avertit les appelants if(!estdatevalide(j, m, a)) // on lève une exception throw new Exception("Date invalide"); this.jour = j; this.mois = m; this.annee = a; Une exception est une façon propre de contrôler les cas exceptionnels (compléments dans le poly). toute fonction appelant le constructeur doit également avertir les autres (avec throws Exception), ou bien doit traiter l exception localement. // str doit etre de la forme "jj/mm/aaaa" public Gregorien(String str) throws Exception{ String[] tmp = TC.decoupage(str, / ); if(tmp.length!= 3) throw new Exception("Il manque des informations"); int j = Integer.parseInt(tmp[0]); int m = Integer.parseInt(tmp[1]); int a = Integer.parseInt(tmp[2]); if(!estdatevalide(j, m, a)) throw new Exception("Date invalide"); this.jour = j; this.mois = m; this.annee = a; TC.decoupage généralise TC.motsDeChaine().

C) Fonction de test Fonction de test suite public static void testaux(string s, String sp1){ try{ // on protège les appels Gregorien d = new Gregorien(s); Gregorien dp1 = new Gregorien(sp1); Gregorien dd = d.jourplusun(); if(dd.equals(dp1)) TC.println("OK : " + sp1); else TC.println("Erreur : " + dd + " au lieu de " + sp1); // si besoin on rattrape l exception catch(exception e){... public static void testaux(string s, String sp1){ try{... // si besoin on rattrape l exception catch(exception e){ // on compare l erreur avec celle attendue if(e.getmessage().equals(sp1)) TC.println("OK : " + sp1); else TC.println("J ai attrapé " + e); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 49/61 Conversion en chaîne public String tostring(){ String s = nombreverschaine(this.jour) + "/"; s += nombreverschaine(this.mois) + "/"; return s + this.annee; // retourne une chaine correspondant à // l entier n < 100 avec un // "0" en tête si nécessaire // aucun intérêt à être objet private static String nombreverschaine(int n){ if(n > 9) return "" + n; else return "0" + n; F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 51/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 50/61 La programmation par bouchons On écrit des fonctions simplistes, qui permettent de tester ce qu on a déjà écrit : public Gregorien jourplusun() throws Exception{ // contagion return new Gregorien(12, 1, 2014); Fournira seulement: OK : 12/01/2014 Erreur : 12/01/2014 au lieu de 01/02/2014 Erreur : 12/01/2014 au lieu de 01/01/2014 Erreur : 12/01/2014 au lieu de 01/03/2011 Erreur : 12/01/2014 au lieu de 01/03/2014 Erreur : 12/01/2014 au lieu de 01/03/2100 Erreur : 12/01/2014 au lieu de 29/02/2000 Erreur : 12/01/2014 au lieu de 29/02/2012... F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 52/61

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 55/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 56/61 D) Les entrées package calendrier; public class Lendemain{ public static void action(){ TC.print("Entrez la date sous "); TC.println("la forme jj/mm/aaaa"); try{ String ligne = TC.lireLigne(); Gregorien d = new Gregorien(ligne); Gregorien dp1 = d.jourplusun(); TC.println("Date d+1=" + dp1.tostring()); catch(exception e){ TC.println("J ai attrapé l exception " + e); public static void main(string[] args){ action(); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 53/61 Quelques améliorations possibles E) Principe du calcul (enfin?) public Gregorien jourplusun() throws Exception{ // contagion à cause du new int j=this.jour, m=this.mois, a=this.annee; int njours = nbjoursdansmois(m, a); if(j < njours) j++; else{ j = 1; // on doit incrémenter le mois if(m < 12) m++; else{ // on doit incrémenter l annee m = 1; a++; return new Gregorien(j, m, a); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 54/61 F) internationalisation Plusieurs classes de sortie : forme simple; forme littéraire: le 4 juin 2012; dessin;... Différents modèles de sortie: console d eclipse; ANDROID (émulateur ou vrai téléphone... );... Calendriers différents (révolutionnaire, autres civilisations, etc.). Internationalisation. Pb. La façon d afficher les dates sous forme littéraire dépend du langage : 3 juin 2013 June 3rd, 2013 den 3. Juni 2013 On peut aussi vouloir rajouter sa propre langue! Solution: on utilise une interface. import calendrier.gregorien; public interface LANGAGE{ public String getmois(int i); public String getmessage(int i); public String chainedegregorien(gregorien g);

F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 59/61 F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 60/61 La classe Francais (1/2) La classe Francais (2/2) import calendrier.gregorien; public class Francais implements LANGAGE{ private static String[] mois = { "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" ; public String getmois(int m){ return this.mois[m-1]; private static String[] messages = { "Entrer la date sous la forme jj/mm/aaaa", "J ai attrapé l exception" ; public String getmessage(int i){ return this.messages[i]; // l algorithme d affichage en français public String chainedegregorien(gregorien g){ return g.getjour() + " " + this.mois[g.getmois()-1] + " " + g.getannee(); F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 57/61 Aperçu de la classe English F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 58/61 Utilisation import calendrier.gregorien; public class English implements LANGAGE{ private static String[] mois = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ; // affichage de la date en anglais public String chainedegregorien(gregorien g){ return this.mois[g.getmois()-1] + " " + g.getjour() + " " + g.getannee(); import tc.tc; import calendrier.*; // toutes les classes public class Lendemain2{ public static void action(langage lg){ TC.println(lg.getMessage(0)); try{ String ligne = TC.lireLigne(); Gregorien d = new Gregorien(ligne); Gregorien dp1 = d.jourplusun(); TC.println("Date d+1=" + lg.chainedegregorien(dp1)); catch(exception e){ TC.println(lg.getMessage(1)+" "+e); public static void main(string[] args){ action(new Francais());

Derniers mots Résumé du cours : objets, interfaces, modularité. Prochains rendez-vous : Groupes aujourd hui demain 9 14 13h30 15h30 1 6 15h45 17h45 15 16 13h30 15h30 7 8 15h45 17h45 Prochain amphi : lundi 12 mai à 10h30; pale machine le 19 mai (sujets d entraînement sur le web). Aujourd hui: rencontre profs élèves (13h30 15h30 et 15h45 17h45), Amphi Poisson. F. Morain École polytechnique Introduction à l Informatique (INF 311) Promo X2013 61/61