Fondements de l’approche objet
Adel KHALFALLAH Institut Supérieur D’informatique – El Manar [email protected] [email protected]
Motivations
Quels problèmes
Gérer la complexité
Augmenter la réutilisation
Faciliter la maintenance
Adel Khalfallah – Programmation objet avec C++ et Java 2
Complexité du logiciel
Crise du logiciel (Fin Années 60) :
Etude sur 9 projets de l’administration
américaine d’une valeurs de 6.8 Millions de $ – 29 % Payés mais jamais livrés – 47 %Livrés mais jamais utilisés avec succès – 23 % Logiciel utilisé mais avec modifications – 1 % Utilisés tels quels
Adel Khalfallah – Programmation objet avec C++ et Java 3
Complexité du logiciel
• Taille 1 Million de LOC Impossible à appréhender par une seule personne
• Complexité des problèmes à résoudre
– Diversité et complexité des systèmes (Systèmes
d’information, Systèmes Temps Réel, Système Experts,..)
– Exigences contradictoires – Problèmes de communication (DéveloppeurUtilisateur et
Développeur Développeur)
– Le problème change « en cours de résolution » (l’expression
de la solution modifie le problème)
– Technologies changeantes en cours d’utilisation
Adel Khalfallah – Programmation objet avec C++ et Java 4
Complexité du logiciel Interdépendances : Logiciel MIKADO
Adel Khalfallah – Programmation objet avec C++ et Java 5
Complexité du logiciel Exemple : Recherche d’un élément dans une collection:
Recherche (X : Elément; C : Collection): Booleen Pos : Position Début Pos:=Position_Initiale(X,C) tant que non Fin(Pos,C) et non Trouve(Pos,X,C) faire
Pos:=Suivant(Pos,X,C)
ftque retourner non Fin(Pos,C) fin
Adel Khalfallah – Programmation objet avec C++ et Java 6
Complexité du logiciel
Elément
Collection
Position
Fin
Position_Initiale
Trouve
Suivant
Adel Khalfallah – Programmation objet avec C++ et Java 7
Réutilisation
• Impression de « déjà vu » (Exemple Tri)
• Les projets qui atteignent un haut niveau de
réutilisation sont l’exception plutôt que la règle
• Intérêts de la réutilisation
– Augmentation de la productivité
– Baisse des coûts
– Amélioration de la qualité
Adel Khalfallah – Programmation objet avec C++ et Java 8
Réutilisation
La réutilisation concerne : • Les produits – Code source – Données et pilotes de test – Modèles de spécification et de conception – …
• Les processus
– Tâches répétitives ( Nécessité de définitions formelles des
activités)
– Personnes et leurs connaissances – …
Adel Khalfallah – Programmation objet avec C++ et Java 9
Réutilisation
Autres Aspects limitatifs : • Economiques : pas de formule juridique
satisfaisante
• Outils : absence d’outils de recherche et de techniques de classification appropriées
Adel Khalfallah – Programmation objet avec C++ et Java 10
Maintenance
Importance Enquête (1986) auprès de 55 sociétés de service en Informatique :
Environ 53 % des coûts du logiciel sont liés à la maintenance
Adel Khalfallah – Programmation objet avec C++ et Java 11
Maintenance
Types de maintenance : • Corrective : correction d’erreurs • Adaptative : adapter le logiciel aux évolutions
de son environnement
• Perfective : Améliorer le logiciel ou prendre en
compte de nouveaux besoins
• Préventive : améliorer la maintenabilité du
logiciel
Adel Khalfallah – Programmation objet avec C++ et Java 12
Concepts de base
Abstraction
Encapsulation
Modularité
Types Abstrait de données
Adel Khalfallah – Programmation objet avec C++ et Java 13
Abstraction
Définition : Une abstraction fait ressortir
les caractéristiques essentielles d’une structure qui la distinguent de tous les autres types de structures du domaine et donc procure des rigoureusement frontières conceptuelles définies par rapport au point de vue de l’observateur
Adel Khalfallah – Programmation objet avec C++ et Java 14
Abstraction
Caractéristiques :
Le fait d’avoir les mêmes caractéristiques est le fruit du hasard
Atomes de carbones : 9.684 106
Nom : Tom Cruise Nom : Cindy Crawford Couleur des yeux : Noir Couleur des yeux : Marron Atomes de carbones : 9.987 106 Nombre de poils : 10 752 634 434 Nombre de poils : 11 233 122 110 Taille : 1.70 Taille : 1.76 Globules rouges : 7 840 656 Globules rouges : 7 541 553 Groupe sanguin : A + Groupe sanguin : B+ Sexe : Masculin Sexe : Féminin Globules blancs : 9 540 786 Globules blancs : 9 760 956 Date de naissance : 3 Juillet 1962 Date de naissance : 20 Février 1966
Adel Khalfallah – Programmation objet avec C++ et Java 15
Abstraction
Caractéristiques essentielles :
Atomes de carbones : 9.684 106
Nom : Tom Cruise Nom : Cindy Crawford Couleur des yeux : Noir Couleur des yeux : Marron Atomes de carbones : 9.987 106 Nombre de poils : 10 752 634 434 Nombre de poils : 11 233 122 110 Taille : 1.70 Taille : 1.76 Globules rouges : 7 840 656 Globules rouges : 7 541 553 Groupe sanguin : A + Groupe sanguin : B+ Sexe : Masculin Sexe : Féminin Globules blancs : 9 540 786 Globules blancs : 9 760 956 Date de naissance : 3 Juillet 1962 Date de naissance : 20 Février 1966
Adel Khalfallah – Programmation objet avec C++ et Java 16
Abstraction
Caractéristiques essentielles (Point de vue de l’hématologue) :
Atomes de carbones : 9.684 106
Nom : Tom Cruise Nom : Cindy Crawford Couleur des yeux : Noir Couleur des yeux : Marron Atomes de carbones : 9.987 106 Nombre de poils : 10 752 634 434 Nombre de poils : 11 233 122 110 Taille : 1.70 Taille : 1.76 Globules rouges : 7 840 656 Globules rouges : 7 541 553 Groupe sanguin : A + Groupe sanguin : B+ Sexe : Masculin Sexe : Féminin Globules blancs : 9 540 786 Globules blancs : 9 760 956 Date de naissance : 3 Juillet 1962 Date de naissance : 20 Février 1966
Adel Khalfallah – Programmation objet avec C++ et Java 17
Abstraction Caractéristiques essentielles porte sur : • Des données • Des comportements Exemple Voiture Immatriculée 96 TU 5475 • Données :
• Marque : Peugeot 106 • Couleur : Rouge • …
• Comportements
• Lorsqu’on tourne le volant à la gauche la voiture tourne à gauche • Lorsqu’on appuie sur le frein la voiture s’arrête • …
Adel Khalfallah – Programmation objet avec C++ et Java 18
Abstraction L’abstraction du comportement doit être sans surprise
Exemples de surprises : • Comportement contre intuitif : On tourne le volant à gauche la
voiture tourne à droite
• Comportement avec effet de bord : On tourne le volant à gauche
la voiture tourne à gauche et le clignotant gauche s’allume
• Comportement masquant un cheval de Troyes : On tourne le volant à gauche la voiture tourne à gauche mais une partie de l’huile moteur est vidangée
Adel Khalfallah – Programmation objet avec C++ et Java 19
Abstraction Un exemple de bonne abstraction
la télécommande
• Système qui présente des propriétés émergentes
• Interface explicite : le spectateur manipule un ensemble de boutons situé sur la face avant
• Chaque bouton à un rôle unique
• Chaque bouton garantit le bon fonctionnement du
système même en cas de distractions de l’utilisateur
Adel Khalfallah – Programmation objet avec C++ et Java 20
Concepts de base
Abstraction
Encapsulation
Modularité
Types Abstrait de données
Adel Khalfallah – Programmation objet avec C++ et Java 21
Encapsulation (Data Hiding)
Définition : L’encapsulation est le procédé de
séparation des éléments d’une abstraction qui constituent sa structure et son comportement. Elle permet de dissocier l’interface contractuelle de la mise en œuvre d’une structure
Adel Khalfallah – Programmation objet avec C++ et Java 22
Encapsulation (Data Hiding)
Interface Réalisation
Adel Khalfallah – Programmation objet avec C++ et Java 23
Encapsulation (Data Hiding)
2 Rôles :
• Utilisateur : manipule les éléments de l’abstraction qui constituent l’interface
•
Implanteur : réalise ce qui est encapsulé
Adel Khalfallah – Programmation objet avec C++ et Java 24
Concepts de base
Abstraction
Encapsulation
Modularité
Types Abstrait de données
Adel Khalfallah – Programmation objet avec C++ et Java 25
Modularité Module : Brique de base à l’échelle architecturale
Système
Modules
Adel Khalfallah – Programmation objet avec C++ et Java 26
Modularité
• Décomposition (Top down) : Réduction
Publicité
itérative du problème en sous problèmes de moindre complexité.
• Composition (Bottom up) : Création itérative de la solution par composition de modules.
Adel Khalfallah – Programmation objet avec C++ et Java 27
Modularité
Autonomie
• Un module peut être appréhendé en isolation
• Induit une localité des modifications
• Compartimentalisation : Une condition anormale lors
de l’exécution reste confinée au module
Adel Khalfallah – Programmation objet avec C++ et Java 28
Modularité
Module = Interface + Implantation • Interface
– Point de communication obéissant à des règles de repérage – Décrit les rapports entre le module et le reste du système – Définit les responsabilités du module
• Implantation
– Inaccessible au reste du système – Réalise les responsabilités définies dans l’interface – Encapsule les informations sensibles liés à la réalisation
Adel Khalfallah – Programmation objet avec C++ et Java 29
Modularité
Caractéristiques de l’interface
• Abstraction des détails. Exemple : Télécommande
• Permettre l’indépendance de l’utilisateur vis à vis de la réalisation. Exemple style de conduite d’une voiture
• Fournir une représentation fidèle. Exemple : Compteur
Adel Khalfallah – Programmation objet avec C++ et Java 30
Modularité
Caractéristiques de l’interface
Indépendance par rapport à l’implantation :
La modification de l’implantation ne change ni
l’interface ni ses utilisations
Promouvoir l’interchangeabilité des
implantations
Adel Khalfallah – Programmation objet avec C++ et Java 31
Modularité
Caractéristiques de l’interface
L’interface doit être suffisante
– Offrir un ensemble de services suffisants pour être
exploitable
– Non suffisance Incitation à la violation de
l’encapsulation par les utilisateurs
Adel Khalfallah – Programmation objet avec C++ et Java 32
Modularité Caractéristiques de l’implantation
L’implantation doit être protégée pour maintenir l’intégralité du module. Exemple : Machine à laver
L’encapsulation sert à prévenir les accidents pas les fraudes
Adel Khalfallah – Programmation objet avec C++ et Java 33
Modularité
Interface Implantation
• Une interface pourra correspondre à plusieurs
implantations
• Plusieurs interfaces pourront avoir la même
implantation
Adel Khalfallah – Programmation objet avec C++ et Java 34
Modularité
Qualités d’une structuration modulaire • Minimalité des interfaces
– Minimiser les communications inter-modules – Minimiser les échanges au sein d’une communication
Couplage Faible
• Maximalité de l’unité
– Les informations au sein d’un module ont une forte unité
logique
Cohésion Forte
Adel Khalfallah – Programmation objet avec C++ et Java 35
Modularité
Quelles informations doivent être encapsulée ? • Tous ce qui n’est pas utile au client : données et
fonctions de service,…
• Tous ce qui présente un aspect sécurité : Numéro de
compte,…
• Tous ce qui présente des contraintes d’intégrité qui doivent être renforcées (Numéro de téléphone,…)
• Tous ce qui est susceptible de changer dans le futur
Adel Khalfallah – Programmation objet avec C++ et Java 36
Concepts de base
Abstraction
Encapsulation
Modularité
Types Abstrait de données
Adel Khalfallah – Programmation objet avec C++ et Java 37
Types Abstraits de donnée
Piles : variations sur un thème
. . .
N
1
Sommet
Base
Empile( P : Pile; E : Elément) Début Si P.Sommet < N Alors Sommet:=Sommet+1 P.LesElements[Sommet]:=E
sinon Erreur Fin
Adel Khalfallah – Programmation objet avec C++ et Java 38
Types Abstraits de donnée
Piles : variations sur un thème
Base
Sommet
. . .
N
1
Empile( P : Pile; E : Elément) Début Si P.Sommet > 0 Alors Sommet:=Sommet-1 P.LesElements[Sommet]:=E
sinon Erreur Fin
Adel Khalfallah – Programmation objet avec C++ et Java 39
Types Abstraits de donnée
Piles : variations sur un thème
Sommet
Empile( P : Pile; E : Elément) Début
Tmp=Créer(Elément) Tmp.Valeur:=E Tmp.Suivant=P.Sommet P.Sommet:=Tmp
Fin
Définir la pile par son implantation n’est pas approprié
Adel Khalfallah – Programmation objet avec C++ et Java 40
Types Abstraits de donnée
• Disposer d’un mécanisme pour étendre les
types existants du langage de programmation utilisé
• Les types ne sont pas défini par leurs structures
mais par les opérations qu’ils offrent
Adel Khalfallah – Programmation objet avec C++ et Java 41
Spécifications algébriques des TAD Types
Pile[X] Fonctions
Vide : Pile[X] Booleen Créer : Pile[X] Empiler : X Pile[X] Pile[X] Dépiler : Pile[X] Pile[X] Sommet : Pile[X] X
Adel Khalfallah – Programmation objet avec C++ et Java 42
Spécifications algébriques des TAD Préconditions
Pré Dépiler(P : Pile[X]) = non Vide(P) Pré Sommet(P : Pile[X]) = non Vide(P)
Axiomes
x : X; P: Pile[X] Vide(Nouveau) non Vide(Empiler(x, P) Sommet(Empiler(x,P)= x Dépiler(Empiler(x,P)= P
Adel Khalfallah – Programmation objet avec C++ et Java 43
Spécifications algébriques des TAD Types
– Enumère les types manipulés par la définition – Un type peut être paramétré par un autre
Fonctions
– Fonction au sens mathématique ( Fonction
partielle) – 3 catégories :
• Constructeurs • Accesseurs (ou Sélecteurs) • Transformateurs
Adel Khalfallah – Programmation objet avec C++ et Java 44
Spécifications algébriques des TAD
Préconditions
Restreignent le domaine des fonctions partielles
Axiomes Définissent les propriétés sémantiques des fonctions
Adel Khalfallah – Programmation objet avec C++ et Java 45
Module # TAD • Réalisation de TAD nécessitent :
1. Exportations de types 2. Définitions d’opérations sur les instances de type 3. Encapsulation des données 4. Création de multiples instances du type
• Modules nécessitent
1. Définitions d’opérations sur les instances de type 2. Encapsulation des données
TAD Modules
Adel Khalfallah – Programmation objet avec C++ et Java 46
Langage Procéduraux
Pascal • Module = Fonction/procédure • Unique mécanisme : Localité des déclarations • => Détournement de l’imbrication qui supporte à l’origine l’approche de décomposition top down
• Sur utilisation de données globales • Notion de ‘unit’ introduite ultérieurement
Adel Khalfallah – Programmation objet avec C++ et Java 47
Langage Procéduraux
Langage C • Module = Fichier • static limite la visibilité au fichier • => La notion de module est implicite • => le mécanisme de masquage est rudimentaire: pas d’importation/exportation, pas de visibilité sélective
Adel Khalfallah – Programmation objet avec C++ et Java 48
Langage Procéduraux # Paradigme Objets
Adel Khalfallah – Programmation objet avec C++ et Java 49
Paradigme Objets
• Objets et classe
• Classification et héritage
• Polymorphisme
– Surcharge
– Généricité
– Liaison dynamique
Adel Khalfallah – Programmation objet avec C++ et Java 50
Publicité
Paradigme Objets
Objets et Classes • Transcription du réel • Au cœur de l’abstraction et des TAD • Unification des données et des traitements • En relation directe avec : – Gérer la complexité – Faciliter la maintenance
Adel Khalfallah – Programmation objet avec C++ et Java 51
Paradigme Objets
Hiérarchisation et héritage Idée répandue depuis le XIIXème siècle • • Classification des espèces vivantes selon le
genre et l’espèce :
Principe : factoriser des informations communes dans une catégories et introduire les spécificités dans des sous catégories
• Les sous catégories héritent des propriétés des
catégories parentes
Adel Khalfallah – Programmation objet avec C++ et Java 52
Paradigme Objets
Polymorphisme
• Poly = Multiple et Morphisme = Structure • Relatif à un traitement en mesure de s’adapter aux
données qu’il manipule
• Exemple
• A := ‘Bonjour’ • B := 123 • C := 1.23
Adel Khalfallah – Programmation objet avec C++ et Java 53
Paradigme Objets
Surcharge :
Donner plusieurs significations à un même Symbole
• Symbole Nom de traitement • Symbole Nom de variable
Adel Khalfallah – Programmation objet avec C++ et Java 54
Paradigme Objets
Généricité Paramétrer des traitements et des définitions de structure par des types
Liaison dynamique Etablir le lien entre le nom d’une opération et l’algorithme de l’opération lors de l’exécution
Adel Khalfallah – Programmation objet avec C++ et Java 55
Principaux langages Objet
• SmallTalk - Centre de recherche de Xerox -
1970
• Object Pascal - Apple 1986 • C++ - B. Stroustrup – Bell – 1986 • Eiffel – B. Meyer - 1987 • CLOS - ANSI – D. Bobrow –1988 • Java – J. Gosling - Sun Microsystems 1995 • C# - Microsoft - 2001
Adel Khalfallah – Programmation objet avec C++ et Java 56
Objets et Classes
Objet
• Etat
• Comportement
• Identité
Adel Khalfallah – Programmation objet avec C++ et Java 57
Objets
Etat • Mémorise le passé influence le futur • Caractérisation : Aspects Statiques • Valeur des caractérisation : Aspects statiques ou dynamiques Exemple : Chaise
Caractérisation statique
Valeurs de caractérisation statiques
Nombre de pieds : 4 Matière : ‘Bois’ Couleur : ‘Marron’ Position_X : 1,5 Position_Y : 1,5 Nombre Total : 10 valeur commune
Valeurs de caractérisation dynamique
Adel Khalfallah – Programmation objet avec C++ et Java 58
Objets
Comportement • Un objet agit sur d’autres objets en leur
demandant des services
• Un objet réagit a une demande de service par un
comportement spécifique • Communication par message ‘Mr Chakroun’ ‘Moi’ ‘Mohamed’ ‘la Chaise 1’
« Enseigner » « Chercher Chaise » « Déplacer »
Adel Khalfallah – Programmation objet avec C++ et Java 59
Objets
Comportement • Interroge l’état pour déterminer les demandes
admissibles • Agit sur l’état • Publie l’état • L’état mémorise les conséquences cumulées du
comportement
• Peut être indépendant de l’état. Exemple : Incrémenter le nombre total de chaises
Adel Khalfallah – Programmation objet avec C++ et Java 60
Objets
Communication par message
• Spécification de l’objet destinataire
• Spécification du service requis
• Spécification des informations transférées dans
les deux sens de la communication
Adel Khalfallah – Programmation objet avec C++ et Java 61
Identité
Etat :
Nom : ‘Ben Salah’ Prénom : ‘Ali’ Date de Naissance : 5/2/48
Comportement
Etudier SeMarier travailler Mourir
Etat :
Nom : ‘Ben Salah’ Prénom : ‘Ali’ Date de Naissance : 5/2/48
Comportement
Etudier SeMarier travailler Mourir
•Identité permet de distinguer systématiquement deux objets •Est souvent confondu avec l’adresse d’un objet dans les langages de programmation • Oracle : identité d’un objet = OID (Proche de la notion de clé)
Adel Khalfallah – Programmation objet avec C++ et Java 62
Terminologie
Etat Propriété Attribut Donnée Membre
Opération Message Méthode Fonction membre Service
Protocole : ensemble de services
Adel Khalfallah – Programmation objet avec C++ et Java 63
Classe • Abstraction qui permet de « condenser » un ensemble d’objets ayant des caractéristiques communes en un seul concept
• Abstraction relatives à la caractérisation d’un
ensemble d’objets – Fixer des informations de caractérisations
communes (Etat/Comportement) – Omettre les valeurs de caractérisation
Adel Khalfallah – Programmation objet avec C++ et Java 64
Classe
Caractéristiques :
Le fait d’avoir les mêmes caractéristiques était le fruit du hasard
Atomes de carbones : 9.684 1012
Nom : Tom Cruise Nom : Cindy Crawford Couleur des yeux : Noir Couleur des yeux : Marron Atomes de carbones : 9.987 1012 Nombre de poils : 10 752 634 434 Nombre de poils : 11 233 122 110 Taille : 1.70 Taille : 1.76 Globules rouges : 7 840 656 Globules rouges : 7 541 553 Groupe sanguin : A + Groupe sanguin : B+ Sexe : Masculin Sexe : Féminin Globules blancs : 9 540 786 Globules blancs : 9 760 956 Date de naissance : 3 Juillet 1962 Date de naissance : 20 Février 1966
Adel Khalfallah – Programmation objet avec C++ et Java 65
Classe
2
1
3
Première abstraction : Identifier un ensemble de caractéristiques communes à une population d’objets
Chaise 1 Etat
Nombre de pieds : 4 Matière : ‘Bois Couleur :‘Vert’ Position_X : 1,5 Position_Y : 1,5 Comportement
Déplacer
Chaise 2 Etat
Nombre de pieds : 4 Matière : ‘Bois Couleur :‘Bleu’ Position_X : 3,5 Position_Y : 2,5 Comportement
Déplacer
Adel Khalfallah – Programmation objet avec C++ et Java 66
Classe
Chaise 1 Etat
Nombre de pieds : 4 Matière : ‘Bois Couleur :‘Vert’ Position_X : 1,5 Position_Y : 1,5
Chaise 2 Etat
Nombre de pieds : 4 Matière : ‘Bois Couleur :‘Bleu’ Position_X : 3,5 Position_Y : 2,5
Comportement
Déplacer
Comportement
Déplacer
Classe Chaise Etat
Nombre de pieds Matière Couleur Position_X Position_Y
Comportement
Déplacer
Deuxième abstraction : Omettre les valeurs de caractérisation
Adel Khalfallah – Programmation objet avec C++ et Java 67
Classe
• Objet instance de classe
• Classe moule (usine) à objets
• Classe = Interface + Implantation
• Module = classe ou ensemble de classes
Adel Khalfallah – Programmation objet avec C++ et Java 68
Généricité
• Deux phases : – Instanciation – Exploitation
Adel Khalfallah – Programmation objet avec C++ et Java 69
Classification et héritage
• 3 Classes Articles/Textiles/Alimentaires • Redondance • Textiles et Alimentaires sont des articles • Différentes solutions en particulier dans Textile
un article
Adel Khalfallah – Programmation objet avec C++ et Java 70
Classification et héritage
Article Désignation Prix HT PrixTTC()
Textile Coloris
Luxe
PrixTTC()
Adel Khalfallah – Programmation objet avec C++ et Java 71
Héritage et liaison dynamique
• Principe de l’ouverture/fermeture
Adel Khalfallah – Programmation objet avec C++ et Java 72
Les langage Java
Adel KHALFALLAH Institut Supérieur D’informatique – El Manar [email protected] [email protected]
Objet et classe • Une classe est un type utilisateur • la machine virtuelle charge la classe
Adel Khalfallah – Programmation objet avec C++ et Java 74
Objets et classes en java
package main.java;
public class Pile {
//Sélecteurs public boolean EstPleine(){
public void Depiler(){
if (!EstVide()) Tete--;
Publicité
} public void Empiler(int Elt)
return Tete==MAX;
{
} public boolean EstVide(){
if (!EstPleine())
LesElements[++Tete]
return Tete==-1;
} public int Sommet(){ if (!EstVide())
return
LesElements[Tete];
else return -123;
}
=Elt;
} private final static int
MAX=10;
private int[] LesElements=new int[MAX]; private int Tete=-1;
}
Adel Khalfallah – Programmation objet avec C++ et Java 75
Objets et classes en java
package main.java; public class Main { public static void main(String[] args) {
Pile P1=new Pile(); P1.Empiler(10); int i=0; for (Pile P : LesPiles){LesPiles[i++]=P=new Pile();
P.Empiler(i);}
for (Pile P:LesPiles)System.out.println(P.Sommet()); }
LesPiles[15].Empiler(123); System.out.println(LesPiles[15].Sommet());
}
Adel Khalfallah – Programmation objet avec C++ et Java 76
Durée de vie (java)
• Un objet existe tant qu’il est référencé
• Le garbage collector (ramasse-miette) se charge
de libérer les objets non référencés, son déclenchement est – généralement – imprévisible
Adel Khalfallah – Programmation objet avec C++ et Java 77
Modes de passage de paramètres
• uniquement par valeur, pour les objets la
référence est passée par valeur, l’objet référencé est passé par référence
Adel Khalfallah – Programmation objet avec C++ et Java 78
Règles d’accès java • Java introduit 4 niveaux de visibilité :
– La classe (private) – Le paquetage (par défaut) s’applique à toute la
classe ou à un élément de l’état ou du comportement qui sera accessible à toutes les classes du paquetage
– La classe et ses descendants et le paquetage
(protected)
– Tout (public) la classe, les autres classe et
paquetages
Adel Khalfallah – Programmation objet avec C++ et Java 79
Règles d’accès
L’encapsulation fait que de préférence : class Toto { public
// méthodes du comportement uniquement
private //Informations sur l’état et éventuellement fonctions de service
}
Adel Khalfallah – Programmation objet avec C++ et Java 80
Règles d’accès
Getters et Setters class Toto { public int GetX() //Lecture contrôlée de X public void SetX(int Val) //Ecriture contrôlée
de X
private int X; }
Adel Khalfallah – Programmation objet avec C++ et Java 81
this
public bool EstPleine(){
return Tete==MAX;
} • Quelle valeur pour Tete ? Celle de l’objet sur lequel à été invoqué la méthode (P1);
On a implicitement public bool EstPleine(Pile *this){
return this->Tete==MAX;
}
Attention à la tentation d’écrire EstPleine(Pile P) {return P.Tete==MAX;}
Adel Khalfallah – Programmation objet avec C++ et Java 82
Préciser la portée java
class Toto { Public void M_Publique(){ int Donnée; //2
//Cache 1
Donnée=2; //accès à 2
Toto.this.Donnée=1 // accès à 1 } Private int Donnée; //1 };
Adel Khalfallah – Programmation objet avec C++ et Java 83
Attribut final (java)
• NB : const est un mot clé de java qui n’est pas utilisé • Un attribut final devra être initialisée au plus tard lors de la
construction
• Un attribut de type primitif final est une constante • Un attribut référence à un objet ou un tableau ne pourra pas être
réaffecté mais l’objet référencé pourra être modifié
public class Voiture { … Public M2() {… MonMoteur.AugmenterPuissance();… //Ok} Public M1() {… MonMoteur= new Moteur();… //Erreur} private final int NoChassis; private final Moteur MonMoteur; … Adel Khalfallah – Programmation objet avec C++ et Java 84
Paramètre/locale final (java) • Un paramètre (ou une variable locale) de type primitif final
ne pourra pas être modifié dans le corps du traitement
• Un paramètre (ou une variable locale) référence à un objet ou un tableau ne pourra pas être réaffecté mais l’objet référencé pourra changer dans le corps du traitement
public void Proc(final int I, final Voiture V){
final int tmp; I=123; //Erreur tmp=456 //Ok tmp=789 //Erreur V.Accelerer() //Ok
}
Adel Khalfallah – Programmation objet avec C++ et Java 85
Objets immuables (immutable) • Objets dont l’état ne change plus après avoir été
crées
• Ils matérialisent des valeurs • Ils garantissent un comportement cohérent dans
un contexte multitâches sans nécessiter de synchronisation
Adel Khalfallah – Programmation objet avec C++ et Java 86
Objets immuables
• Java
– Tous les attributs sont final – Il ne faut pas fournir de méthodes qui changent l’état – Il faut interdire l’héritage (afin d’éviter d’introduire de
méthodes qui changent l’état)
– String est un exemple de classe dont les objets sont
immuables
Adel Khalfallah – Programmation objet avec C++ et Java 87
Objets immuables
• Que faire lorsqu’un objet immuable doit
changer d’état. Par exemple, on veut rajouter un caractère dans un objet String
=> On crée un nouvel objet contenant le nouvel état
Adel Khalfallah – Programmation objet avec C++ et Java 88
Attributs et méthodes de classe
Chaise
– Nombre Total – Incrémenter Total
class Chaise { public
static void Incrementer()
…
private
static int NombreTotal;
… }
Adel Khalfallah – Programmation objet avec C++ et Java 89
Attributs et méthodes de classe
• Incrementer() n’a pas visibilité sur les attributs non statique (qu’ils soient privés ou publique), il ne peut manipuler que les attributs statiques
• Incrementer() ne dispose pas du pointeur this
Adel Khalfallah – Programmation objet avec C++ et Java 90
Constructeurs
Problème: initialisation de la tête de la pile ? • Premier tentative
…
private:
int Tete=-1;
…
Adel Khalfallah – Programmation objet avec C++ et Java 91
Constructeurs
class Pile { public
public Pile(){…} public bool EstPleine()… public bool EstVide()… public int Sommet()… public void Depiler()… public void Empiler(int Elt)…
private
int[] LesElements;
private int Tete;
};
Adel Khalfallah – Programmation objet avec C++ et Java 92
Constructeurs
Constructeur : • Même nom que la classe • Pas de type résultat • Invoqué automatiquement • Constructeur par défaut • Autant de constructeurs que de façons
d’initialiser (les paramètres doivent permettre de les distinguer)
Adel Khalfallah – Programmation objet avec C++ et Java 93
Constructeur
• Un classe peut disposer de plusieurs constructeurs
surchargés class Date {
Date(int UnJour, int UnMois, int UnAn); // La date initiale est fournie sous la forme jour / mois / An. Par exemple : // Date D(1,1,2004); Date(const char* UneDate); // La Date est fournie sous forme de chaîne de caractère. Par exemple : // Date D("Jeudi 1er Janvier 2004")
... }
Adel Khalfallah – Programmation objet avec C++ et Java 94
Bloc d’initialisations (java) • Les blocs d’initialisation permettent de factoriser le code
commun à tous les constructeurs (ils sont donc exécutés avant les constructeurs), lorsqu’ils sont statique ils ne sont exécutés qu’une seule fois lors de la création du 1er objet ou lors de 1er accès à un champ statique i.e. lorsque la classe est chargée
class Image {
private Bit[][] Bitmap=new Bit[N][M]; { for(int i=0;i<N; i++)
for(int i=0;i<M; i++) Bitmap[i][jy]=…
} static {…} Image(){…} Image(format f){…}
}
Adel Khalfallah – Programmation objet avec C++ et Java 95