Langage et Concepts de Programmation Orientée-Objet Pôle Informatique 2007/2008 École Nationale Supérieure des Mines de Saint-Étienne Laurent Vercouter
Déroulement du cours – 2 TP à envoyer à la fin des séances (24/1 et 7/2) – Évaluation sur un de ces 2 TPs et l'examen écrit note = 0,5*examen + 0,5*TP 8h159h4510h11h30 COURSTD TP 9 janvier 10 janvier 17 janvier 23 janvier 30 janvier 6 février 24 janvier 7 février TP TD TP TD TP TD TP EXAMEN
Modèle en cascade pour le développement logiciel Analyse Conception Implémentation Tests Maintenance SADT, SA-RT, MERISE, OMT, UML, … Fortran, Cobol, C, SmallTalk, Ada, C++, Java, …
Langages procéduraux et fonctionnels Traitement 1 Données Traitement 2 Traitement 3 Un programme est composé de plusieurs procédures (ou fonctions) : qui effectuent un traitement sur des données (procédure) qui retournent une valeur après leur invocation (fonction) Certains langages ne distinguent pas procédures et fonctions. Exemples de langages procéduraux ou fonctionnels : Fortran, Lisp, C, …
Langages Orientés-Objet D D D D D T T T T T Un programme est composé de plusieurs objets qui contiennent : des données "internes" des traitements manipulant ces données internes ou d'autres données Les données d'un objet sont appelés ses attributs et ses traitements sont ses méthodes (ou opérations). Exemples de langages orientés-objet : SmallTalk, C++, Java, …
UML & Java Analyse Conception Implémentation Tests Maintenance Unified Modeling Language (UML) : notation standard pour l'analyse et la conception construite par l'Object Management Group Première version standard en 1997 Java : pas un standard mais un langage très largement utilisé développé par SUN microsystems en 1995 dernière version stable : JDK 1.5.0
Objet Approche procédurale : "Que doit faire mon programme ?" Approche orientée-objet : "De quoi doit être composé mon programme ?" Cette composition est conséquence d'un choix de modélisation fait pendant la conception Exemple: Gestion d'une bibliothèque Le seigneur des anneaux J.R.R.Tolkien Germinal E. Zola Le MondeAlice Dupont Directrice Michel Martin Bibliothécaire Anne Durand Lectrice Arsène Deschamps Lecteur
Classe Des objets similaires peuvent être informatiquement décrits par une même abstraction : une classe même structure de données et méthodes de traitement valeurs différentes pour chaque objet Le seigneur des anneaux J.R.R.Tolkien Germinal E. Zola Le MondeAlice Dupont Directrice Michel Martin Bibliothécaire Anne Durand Lectrice Arsène Deschamps Lecteur Classe Livre -titre, auteur Classe Journal -titre Classe Employé -nom, prénom, statut Classe Lecteur -nom, prénom
Contenu d'une classe Une classe est composée de plusieurs membres dont chacun est soit : un attribut : variable typée une méthode (ou opération) : ensemble d'instructions de traitement class CompteBancaire { String proprietaire; double solde; double getSolde() { return solde; } void credite(double val) { solde = solde + val; } Attributs Méthodes
Encapsulation L'encapsulation est la pratique consistant à regrouper des attributs au sein d'une même classe. Exemple : la classe Livre encapsule les attributs titre et emprunteur Pour améliorer la lisibilité des programmes, les attributs encapsulés sont souvent privés (inaccessibles aux autres classes). Les données et méthodes accessibles sont dites publiques.
Syntaxe Java Le code source d'un programme Java est contenu dans plusieurs fichiers d'extension.java Une seule classe publique par fichier; Le nom du fichier doit être le même que celui de la classe; Par convention, le nom d'une classe commence toujours par une majuscule. Le code source d'une classe commence par le mot-clé class suivi de son contenu : class { }
Types primitifs de données Même types qu'en C: int float double short long char void Plus deux nouveaux types : boolean byte Plus la classe : String Déclaration : int monEntier; String chaine; boolean test;
Écriture des méthodes La signature d'une méthode contient notamment : un nom de méthode; un type de données de retour; des types de données pour ses arguments; … Par convention le nom des méthodes et attributs commencent toujours par une minuscule. Une méthode est composée de sa signature et d'un traitement associé. ( * ) { }
Exemple : classe Livre class Livre { String titre; Lecteur emprunteur; void setTitre(String t) { titre = t; } String getTitre() { return titre; } Date emprunte(Lecteur lec) { if (emprunteur = = null) { emprunteur = lec; return new Date(); } else return null; } Méthodes Attributs
Portée d'une variable public class Portee { int a; public void test(int b) { if (a > b) { int c = b; b = a; a = b; } afficher(b); } l'entier a est visible dans toute la classe
Portée d'une variable public class Portee { int a; public void test(int b) { if (a > b) { int c = b; b = a; a = b; } afficher(b); } l'entier b est visible à l'intérieur de la méthode test
Portée d'une variable public class Portee { int a; public void test(int b) { if (a > b) { int c = b; b = a; a = b; } afficher(b); } l'entier c est visible dans le bloc du if
Instanciation L'instanciation est l'opération qui consiste à créer un objet à partir d'une classe. En Java, le mot-clé new provoque une instanciation en faisant appel à un constructeur de la classe instanciée. Un constructeur est une méthode qui a le même nom que la classe Un constructeur n'a pas de valeur de retour Plusieurs constructeurs peuvent exister dans une même classe (avec des arguments différents) Il faut au moins un constructeur dans une classe pour en instancier des objets
Constructeur de la classe Livre class Livre { String titre; Lecteur emprunteur; Livre(String t) { titre = t; emprunteur = null; } void setTitre(String t) { titre = t;} String getTitre() { return titre;} Date emprunte(Lecteur lec) { … } Constructeur
Instanciation de la classe Livre class InterfaceBibliothecaire { void enregistreLivre(String nom) { Livre nouveauLivre; nouveauLivre = new Livre(nom); ajouteEnBibliotheque(nouveauLivre); } void ajouteEnBibliotheque(Livre li) { … }
Invocation de méthodes En Java, une méthode ne peut pas être invoquée seule, elle est toujours appelée sur un objet. Un point. sépare le nom de la méthode de l'objet sur lequel elle est invoquée. … Livre monLivre = new Livre("Germinal"); String titreDuLivre = monLivre.getTitre(); … Le mot-clé this désigne, en cours d'exécution d'une méthode, l'objet sur lequel elle est appelée. La syntaxe pour accéder aux attributs d'un objet est la même.
Exemple class Livre { String titre; Lecteur emprunteur; … boolean estEmprunte() { if (emprunteur == null) return false; else return true; } Date emprunte(Lecteur lec) { if ( this.estEmprunte() == true) return null; if ( lec.empruntPossible() ) { emprunteur = lec; lec.ajouteEmprunt( this ); return new Date(); } else return null; } class Lecteur { Livre[ ] emprunts; int nbEmprunts; … boolean empruntePossible() { if (nbEmprunts < 5) return true; else return false; } void ajouteEmprunt(Livre liv) { emprunts[nbEmprunts] = liv; nbEmprunts ++; }
Visibilité des membres La visibilité d'une classe et de ses membres définit quelles autres classes y ont accès. Ces contraintes portent sur : la référence fait à une classe l'invocation d'une méthode sur un objet l'accès en lecture et écriture à un attribut d'un objet 4 niveaux de visibilité en Java : public : visible tous les objets private : uniquement visible par les instances de la classe protected : expliqué ultérieurement par défaut : expliqué ultérieurement
Exemple de visibilité public class Livre { private String titre; private Lecteur emprunteur; … private boolean estEmprunte() { if (emprunteur == null) return false; else return true; } public Date emprunte(Lecteur lec) { if ( this.estEmprunte() == true) return null; if ( lec.empruntPossible() ) { emprunteur = lec; lec.ajouteEmprunt( this ); return new Date(); } else return null; } public class Lecteur { private Livre[ ] emprunts; private int nbEmprunts; … public boolean empruntePossible() { if (nbEmprunts < 5) return true; else return false; } public void ajouteEmprunt(Livre liv) { emprunts[nbEmprunts] = liv; nbEmprunts ++; }
Exceptions En Java, les erreurs se produisent lors d'une exécution sous la forme d'exceptions. Une exception : est un objet, instance d'une classe d'exceptions. peut provoquer la sortie d'une méthode correspond à un type d'erreur contient des informations sur cette erreur
Déclaration des exceptions possibles Une méthode déclare, par le mot-clé throws, dans sa signature les classes d'exception qu'elle peut envoyer. Exemple de la méthode substring de la classe String: public class String { … public String substring( int beginIndex, int endIndex ) throws IndexOutOfBoundsException { … } … }
Traitement des exceptions Il y a deux manières de traiter une exception reçue : Propagation public String initialesAuteur(Livre l) throws IndexOutOfBoundsException { String titre, initiales; titre = l.getTitre(); initiales = titre.substring(0,2); return initiales; } L'exception est renvoyée à la méthode ayant invoquée initialesAuteur Interception public String initialesAuteur(Livre l) { String titre, initiales; try { titre = l.getTitre(); initiales = titre.substring(0,2); return initiales; } catch (IndexOutOfBoundsException ex) { return new String("???"); } L'exception est traitée dans la méthode initialesAuteur et "disparaît"
Émission & création d'exceptions Vous devez prévoir tous les cas d'erreurs des méthodes que vous écrivez en émettant les exceptions appropriées: 1.Créer un objet d'une classe d'exception 2.Émettre l'exception public Date emprunte(Lecteur lec) throws Exception { if ( this.estEmprunte() = = true) { Exception excep = new Exception("Livre deja emprunte"); throw excep; } if ( lec.empruntPossible() ) { emprunteur = lec; lec.ajouteEmprunt( this ); return new Date(); } else { throw new Exception("Le lecteur a trop d'emprunts"); }
Compléments de syntaxe Instruction conditionnelle if {bloc_si_vrai} else {bloc_si_faux} Exemple : if ( emprunteur.getStatut() = = "employe") { unLivre.setDateRetour(30); } else { unLivre.setDateRetour(15); }
Compléments de syntaxe Instruction itérative while {bloc} Exemple : while ( i < biblio.nbLivres() ) { Livre l = biblio.getLivre(i); l.setDisponible(true); i++; }
Compléments de syntaxe Instruction itérative for ( ; ; ) {bloc} Exemple : for (int i = 0; i < biblio.nbLivres(); i++ ) { Livre l = biblio.getLivre(i); l.setDisponible(true); }
Compléments de syntaxe Instruction de choix multiple switch ( ) { case : … default: } Exemple : switch (l.getCategorie()) { case 1: l.setDuree(15); break; case 2: l.setDuree(20); break; default: l.setDuree(30); }
Autres particularités de syntaxe On peut utiliser l'opérateur + sur les objets de classe String String s1 = "hello ", s2 = "world"; String s3 = s1 + s2; s3 vaut "hello world" La variable length donne la taille d'un tableau; char[] tab = new char[25]; int a = tab.length; a vaut 25