Fondements de l’approche objet

Institut Supérieur d'Informatique
1/95
100%
Rendu du PDF...
Page 1 sur 95Lecteur de document UniversityLib

Fondements de l’approche objet

Institut Supérieur d'Informatique · Object-Oriented Programming (C++ and Java) · notes

Voir tous les documents en programmation

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éveloppeurUtilisateur 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