UE LI314 : Programmation Orientée Objet - JAVA
Ludovic DENOYER (d’après les cours de Frédéric Peschanski)[email protected] – 17h15
Introduction
Présentation et prérequisIntroduction à la P.O.O
HistoriqueP.O.O et Java
Anatomie d'une classeEncapsulationProtection de l'informationDe la classe à l'objet/instance (instantiation)
Environnement de développement (JDK)
Qu’est ce qu’il va se passer ?
Cours : Apprentissage des concepts de la POO
Un/Deux concepts par coursAttention :
Pour ceux qui ne connaissent pas : difficile à digérerPour ceux qui connaissent : difficile à digérer aussi
TD : Mise en application
TME : Les mains dans le cambouis
Plan Du Cours
10 Cours de 2h + 10 TDs/TMES
Cours 1 : Introduction à la POOCours 2 : Cycle de vieCours 3 et 4 : HéritageCours 5 : InterfacesCours 6 : Exceptions
Plan Du Cours
Cours 7 : Interfaces graphiquesCours 8 : CollectionsCours 9 : Design Patterns 1Cours 10 : Design Patterns 2
RemarquesCours orientés Ingénierie
Pas un cours « syntaxique » !!!
Prérequis : programmation en C et initiation Java (sinon tutoriaux sur Internet ou livre à la bibliothèque, etc.) + se débrouiller avec les API Java
Centré sur les concepts fondamentaux
Encapsulation, Héritage, polymorphisme
…
Remarques
Utilisation de diagrammes UML simples
Pas un cours d’analyse/conception mais de conception/implémentation
Importance des tests unitaires !
Remarques
La présence en cours est vivement conseillée:
Accès au tutorat
La présence en TD/TMEs est obligatoire
Interros suprises !
Un site Web
http://www-connex.lip6.fr/~denoyer/Courses/2006-2007/LI314-eleves/pmwiki.php
Accès aux transparents Accès aux enoncés de TDAccès aux enoncés de TME Inscriptions au tutoratEn construction…
[email protected] en place dans la semaineDébut dès la semaine 3Limité à quelques étudiants chaque semainePrincipe
Chaque semaine, je renseigne sur ma présence à Jussieu pour la semaine suivanteInscription individuelle en coursSi présence en coursTutorat <> TD !!!!!!!
Evaluation
CC : 30 %Examen : 70 %
PAS DE PARTIEL =>Note de présence/participation TD/TMENote de TMEInterros surprises (entre 2 et 4)Mini projet (début en semaine 3 ou 4)
Soyez prévoyants (et autonomes) !!!
Un peu d’histoire
Histoire de la POO
Bases de la POO dans les années 60Simula-67 : Langage pour la simulation
Années 70/80Bases de la POOCommunauté de l’Intelligence Artificielle
Langage smalltalk 72 et 80
Histoire de la POO
Années 80Apparition des premiers langages OO
Objective CC++EiffelLisp Object
Années 90 : Passage à l’industrieEmergence du génie logiciel: modélisation (UML)
Essort des langages objet : C++, Java (95), C#, Python, Ruby, etc.
Histoire de la POOA la base d’autres reflexions
l’analyse objet (AOO ou OOA en anglais), la conception objet (COO ou OOD en anglais), les banques de données objet (SGBDOO), les langages objets avec les langages àprototypes, ou encore la méthodologie avec MDA (Model Driven Architecture).
Années 2000Paradigme (et non technique)méthodologies/outils/évolutions
prog. générique, tests unitaires (eXtreme ...), etc.
Histoire de JAVALangage de Sun Microsystems
Combler les lacunes de c++PortableEssor avec le Web
1995 : naissance de Java 1.0langage impératif, à classes, fortement typé, packages
Nouveautés: Machine virtuelle, Garbage collector, Multithreading, API riche et portable
1997 : Java 1.1 (1998: JFC Javabeans/Swing)
Rationalisation du langage, Collections API, nio, etc.
1999 : Java 2 (jdk 1.2) : la maturité
Intégration des JFC (Swing, Collections, etc.)2004 : Java 2 édition 5 (jdk 1.5 « tiger »)
Les génériques, auto-boxing, boucles for-each, etc.Améliorations multi-threading
Pourquoi la POOComment comprendre et réutiliser les programmes faits par d’autres Comment réutiliser les programmes que vous avez écrits il y’a six mois et dont vous avez oubliéle fonctionnementComment "cloner" rapidement des programmes déjà fait pour des applications légèrement différentes ?Comment programmer simplement des actions simples sur des éléments variés et complexes ?Comment ajouter des fonctions sans tout réécrire et tout retester ?
Modèle de programmation et modèle objet
Modèle de programmation:faciliter la compréhension du programme étudié, en réduisant la complexitépermettre de simuler le comportement du programme
Modèle objetCalqué sur une réalitéLes caractéristiques fondamentales d’un objet sont :
une identité (ne pas confondre "voiture" et la voiture 2345 FGT 75)un comportement (freinage)un état (elle est rouge, le réservoir est plein)
La POOL’intérêt de la POO par rapport au procédural et au fonctionnel
Le code est plus sûrLes programmes sont plus clairsLa maintenance des applications est facilitéeLe code est facilement réutilisableIl est facile de créer de nouveaux programmes légèrement différents par clonage d’un programme existantIl est facile de faire évoluer des programmesLa POO rend possible le développement de gros programmes
Les inconvénientsLa POO oblige à réfléchir et à modéliser avant de programmer (est-ce réellement un inconvénient)La notation POO n’est pas toujours intuitive (mais toujours verbeuse !)
POO et Java
Langage à 99% objetTypes de base non-objets ... mais autoboxingLangage à classes
Définition des classes (=> déclaration d'un type)Objet = instance d'une classe
Compilation et exécution séparéesjavac: vérificateur de types, compilateur
les variables et les types
java: machine virtuelle (exécution)les références et les classes
Compilation / ExecutionCode source
Compréhensible par l’humain
Code MachineCode binaireSpécifique à un processeurInsupportable
Compilateur = Traducteur
Code Source
COMPILATEUR
Code Machine
Compilation / ExecutionCode source JAVA
Langage POO
ByteCode JAVACode machineD’une machine qui n’existe pas !Machine virtuelle
Quel interet ?
Code Source JAVA
COMPILATEURJAVAC
ByteCode JAVA
Compilation / Execution
Interet de la POO
Architecture de baseEncapsulationHéritage
Architecture de base
Encapsulation
Architecture de base
Objet = Données + Méthodes
Héritage, polymorphisme,…
Anatomie d'une classe (1)
// fichier upmc/pobj/geometrie/Point.javapackage upmc.pobj.geometrie;public class Point { // (1) Type + nom (de classe)
private double x; // (2) Attributsprivate double y;public Point(double x, double y) { // (3) Constructeursthis.x = x;this.y = y;
}public double getX() { // (4) Accesseursreturn x;
}public double getY() {return y;
}
// ça continue ...
// fichier upmc/pobj/geometrie/Point.javapackage upmc.pobj.geometrie;public class Point { // (1) Type + nom (de classe)
private double x; // (2) Attributsprivate double y;public Point(double x, double y) { // (3) Constructeursthis.x = x;this.y = y;
}public double getX() { // (4) Accesseursreturn x;
}public double getY() {return y;
}
// ça continue ...
Anatomie d'une classe (2)
// (4) méthodes (traitements)public double calculeDistance(Point p2) {double dx = Math.abs(p2.getX() - getX());double dy = Math.abs(p2.getY() - getY());return Math.sqrt(dx*dx+dy*dy);
}
public void translater(double tx, double ty) {deplace(x+tx,y+ty);
}// (4) méthodes privéesprivate void deplace(double x, double y) {
this.x=x; this.y=y;}// (5) méthodes standards (ici seulement l'affichage)public String toString() {
return "("+x+","+y+")";}}
// (4) méthodes (traitements)public double calculeDistance(Point p2) {double dx = Math.abs(p2.getX() - getX());double dy = Math.abs(p2.getY() - getY());return Math.sqrt(dx*dx+dy*dy);
}
public void translater(double tx, double ty) {deplace(x+tx,y+ty);
}// (4) méthodes privéesprivate void deplace(double x, double y) {
this.x=x; this.y=y;}// (5) méthodes standards (ici seulement l'affichage)public String toString() {
return "("+x+","+y+")";}}
Classe de programme principal : Point d’entrée// fichier upmc/pobj/geometrie/PointMain.javapackage upmc.pobj.geometrie;
public class PointMain {public static void main(String[] args) {
Point a = new Point(2,1);Point b = new Point(4,4);System.out.println("Point a="+a); // ou
a.toString()System.out.println("Point b="+b);
b.translater(1,-1);System.out.println("Point b="+b);double dist = a.calculeDistance(b);System.out.println("d(a,b)="+dist);
}
// fichier upmc/pobj/geometrie/PointMain.javapackage upmc.pobj.geometrie;
public class PointMain {public static void main(String[] args) {
Point a = new Point(2,1);Point b = new Point(4,4);System.out.println("Point a="+a); // ou
a.toString()System.out.println("Point b="+b);
b.translater(1,-1);System.out.println("Point b="+b);double dist = a.calculeDistance(b);System.out.println("d(a,b)="+dist);
}
Compilation
Commande de compilation: javacjavac <fichier source>.java<fichier source> : Point.java dans le répertoire upmc/pobj/geometrie
cd upmc/pobj/geometrie/javac Point.java
=> si tout se passe bien, création du fichier compilé
upmc/pobj/geometrie/Point.class
Compilation et exécution
Commande de compilationjavac upmc/pobj/geometrie/PointMain.java(création de PointMain.class)
Commande d'exécution : javajava <nom de la classe><nom de la classe> = upmc.pobj.PointMainjava upmc.pobj.PointMain
Principe OO (1) : Encapsulation
Dans la classe Point, on met ensemble:Les données associées à un point
Les attributs : mode d'accès private visibles uniquement dans les méthodes de la classe => protection de l'information (information hiding) vis-à-vis des clientsAccéder en lecture seule aux attributs est parfois nécessaire => accesseursAccéder directement en écriture est dangereux !
Les traitements que l'on peut effectuer sur les points
Les méthodes : mode d'accès public visibles depuis l'extérieur de la classe (accès client)on peut également ajouter des méthodes auxiliaires privées avec le mode d'accès private
Protection de l'informationZone Classe Protection Danger
Indépendance de la représentation
Attributs privés
Excellente AucunPas d'accesseurs directs publiques
Pas de modificateurs directs publiques
Information protégée
Attributs privés
Bonne Utiliser l'attribut accédéAccesseurs directs publiques si nécessaires
Pas de modificateurs directs publiques
Encapsulation minimale
Attributs privés
Moyenne Modification partielle depuis l'extérieurAccesseurs directs publiques si nécessaires
Modificateurs directs publiques si nécessaires
Encapsulation « trouée »
Attributs privés
Mauvaise Modification intégrale depuis l'extérieurAccesseurs directs publiques systématiques
Modificateurs directs publiques systématiques
Pas d'encapsulation Attributs publiques Insuffisante Accès direct aux données
Remarque: en POBJ, on s'en tiendra aux zones vertes (on essaiera)
Représentation des classes (UML)
Vision client (accès public)constructeurs et méthodes publiquespour les utilisateurs de la classe
Vision fournisseur (accès privé)tout ce que contient la classe (accès public+privé)
attributs, méthodes privées, etc.
Pour les autres concepteurs de la classe
IMPORTANT: On ne programme par pour soi, mais pour les autres.
Un mot sur UML
UML (en anglais Unified ModelingLanguage, « langage de modélisation unifié ») est un langage graphique de modélisation des données et des traitements.
Vision Client
Vision fournisseur
Principe OO(2)Agrégation
Attributs = variables (portée de la classe)types de base: int, long, short, float, double, char, bytetypes objet « standards »: String, ArrayList<Integer>, etc.Types objet « utilisateurs »: Point, etc.
Agrégation: attributs de type objet utilisateursRelation: « A UN »
<T1> « A – UN » <T2>
Exemple: Voiture « A UN » MoteurSegment « A UN » Point
Agrégation - exemple
// fichier upmc/pobj/geometrie/Segment.javapackage upmc.pobj.geometrie;public class Segment {
private Point a;private Point b;public Segment(Point a, Point b) {this.a = a; this.b = b;
}public Point getP1() {return a;
}public Point getP2() {return b;
}
// ça continue ...
// fichier upmc/pobj/geometrie/Segment.javapackage upmc.pobj.geometrie;public class Segment {
private Point a;private Point b;public Segment(Point a, Point b) {this.a = a; this.b = b;
}public Point getP1() {return a;
}public Point getP2() {return b;
}
// ça continue ...
Exemple:
Agrégation : suite
public double getLongueur() {return a.calculeDistance(b);
}
public void translater(double dx, double dy) {a.translater(dx,dy);b.translater(dx,dy);
}
public void translater(Point p2) {translater(p2.getX(),p2.getY());
}
public void toString() {return a.toString()+" --> "+b.toString();
}// etc.
}
public double getLongueur() {return a.calculeDistance(b);
}
public void translater(double dx, double dy) {a.translater(dx,dy);b.translater(dx,dy);
}
public void translater(Point p2) {translater(p2.getX(),p2.getY());
}
public void toString() {return a.toString()+" --> "+b.toString();
}// etc.
}
Agrégationreprésentation UML
Vision client (accès public)constructeurs et méthodes publiquespour les utilisateurs de la classe
Vision fournisseur (accès privé)tout ce que contient la classe (accès public+privé)
attributs, méthodes privées, etc.
Pour les autres concepteurs de la classe
RAPPEL: On ne programme par pour soi, mais pour les autres.
Vision client
IMPORTANT: uniquement si accesseurs disponibles (sinon Point est cachée)
Vision fournisseur
Principe OO(3)Liens d'association
Paramètres de méthodes = variables « locales »
types de base ou type objet standard ou utilisateur
Type de retour de méthodelien d'association:
Relation: « UTILISE » (ou « EST ASSOCIE A »)<T1> « UTILISE » <T2>
Exemple: Conducteur « UTILISE » VoitureSegment « UTILISE » Point (pour translation)
Lien d'association: exemple
Remarques: • liens d'association parfois difficile à caractériser (cf. cours UML)•A « UTILISE » B (et non l'inverse) : flèche de A vers B + commentaires• agrégation = cas particulier d'association
Conclusion
Encapsulationune classe = données (attributs) + traitements (méthodes)En Java: une classe définit un type du nom de la classe protection de l'information (attributs private, pas de modificateurs public sauf si vraiment nécessaire)
AgrégationOn peut utiliser des objets comme attributs
Liens d'associationOn peut utiliser des objets en argument ou valeurs de retour de méthodes, les « stocker » dans des attributs, etc.
Conclusion (suite)
En Objet, on programme pour les autresbien distinguer le point de vue client (accès public) du point de vue fournisseur (accès public+privé)importance de la documentation
diagrammes UMLdocumentation du code source (javadoc)
Environnement Java (cf. TME)rappels syntaxiquesassociation paquetage => répertoireAssociation classe public => fichier source .javaProgramme principal
Top Related