Pôle Informatique 2005/2006 École Nationale Supérieure des Mines de Saint-Étienne
Langage et Concepts de Programmation Orientée-Objet Laurent Vercouter
[email protected]
8h15 18 mai
Déroulement du cours 9h45 10h
COURS
11h30 13h30
15h 15h15
TD
19 mai
TP
6 juin
TP
8 juin
TP
TD TP
13 juin 15 juin
TD
TP
21 juin
TD
TP
22 juin
TP
TP
29 juin
EXAMEN
TP
– –
16h45
2 TP à envoyer à la fin des séances (15/6 et 29/6) Évaluation sur un de ces 2 TPs et l'examen écrit
note = 0,5*examen + 0,5*TP
TP
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 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, …
Données Traitement 1 Traitement 2 Traitement 3
Langages OrientésObjet 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, …
D T D
D
T
T
D
D
T
T
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
Germinal E. Zola Le Monde
Le seigneur des anneaux J.R.R.Tolkien
Alice 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 Classe Lecteur Classe Livre -titre, auteur
Classe Journal -titre
Classe Employé -nom, prénom, statut
-nom, prénom
Germinal E. Zola Le Monde
Le seigneur des anneaux J.R.R.Tolkien
Alice Dupont Directrice
Michel Martin Bibliothécaire
Anne Durand Lectrice Arsène Deschamps Lecteur
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; Attributs double solde; double getSolde() { return solde; }
Méthodes
}
void credite(double val) { solde = solde + val; }
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 <nom de la classe> {
}
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 Une méthode est composée de sa signature et d'un traitement associé. 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. <nom de méthode> ( <arguments> * ) { }
Exemple : classe Livre
class Livre { String titre; Lecteur emprunteur;
Attributs
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
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
Interception
public String initialesAuteur(Livre l) public String initialesAuteur(Livre l) { throws IndexOutOfBoundsException { String titre, initiales; String titre, initiales; try { titre = l.getTitre(); titre = l.getTitre(); initiales = titre.substring(0,2); initiales = titre.substring(0,2); return initiales; return initiales; } } catch (IndexOutOfBoundsException ex) { return new String("???"); } }
L'exception est renvoyée à la méthode ayant invoquée initialesAuteur
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 : 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