Notions de programmation orientée objet

Transcription

Notions de programmation orientée objet
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
1
Génie Logiciel
Notions de programmation
orientée objet
Renaud Marlet
LaBRI / INRIA
http://www.labri.fr/~marlet
màj 19/04/2007
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Les données d'abord (1)
Important résultat de l'expérience :
–
Le plus souvent, il vaut mieux organiser un système
autour des données qu'autour des fonctions
–
Et ce d'autant plus que les données sont complexes
–
Mais si les données sont simples et les traitements
complexes, OK pour organiser le système autour
des fonctions
●
ex. bibliothèque de fonctions trigonométriques
2
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Les données d'abord (2)
Important résultat de l'expérience :
–
Le plus souvent, il vaut mieux organiser un système
autour des données qu'autour des fonctions
→ Importance du lien avec le modèle conceptuel
–
objets, attributs, opérations pour les manipuler
→ Programmation Orientée Objet (OO)
3
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Notions de programmation objet
●
Nécessite un cours complet (!)
–
principes
–
méthodologie
–
langages : Java, C++, Eiffel, ...
→ Juste quelques notions ici
–
idées les plus importantes
–
exemples en Java
–
comment faire de la programmation objet en C
4
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
classe et instance
●
Classe
= type d'objet (données + opérations pour les manipuler)
–
–
●
ex. : classe « point » dans le plan (c.-à-d. en dim 2)
●
données = deux coordonnées cartésiennes (x,y)
●
opérations = déplacer, calculer la norme (distance à (0,0)), ...
en général : 1 fichier ~ 1 classe
Instance
= exemplaire de la classe
–
ex. : un point en (3,5), un en (-2,7), un autre en (3,5) ...
5
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
champ et méthode
●
Champ
= attribut de l'objet
–
ex. : coordonnée x, coordonnée y
(on dit aussi « variable d'instance »)
●
Méthode
= opération pour manipuler les données (~ fonction)
–
ex. : déplacer(dx,dy), norme()
6
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : classe Point
class Point {
double x, y; // valeur 0 par défaut
double norme() { return Math.sqrt(x*x+y*y); }
void déplacer(double dx, double dy) {
x += dx; y += dy;
}
}
Point pt = new Point();
pt.déplacer(3.0,4.0);
double nm = pt.norme(); //→ 5.0
7
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : classe Point
classe
définition de champs
définition de méthodes
class Point {
double x, y; // valeur 0 par défaut
double norme() { return Math.sqrt(x*x+y*y); }
void déplacer(double dx, double dy) {
x += dx; y += dy;
}
}
fabrication d'une instance
Point pt = new Point();
pt.déplacer(3.0,4.0);
appel de méthodes
double nm = pt.norme(); //→ 5.0
8
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : instances
class Point {
...
double distance(Point pt) {
double dx = x-pt.x; double dy = y-pt.y;
return Math.sqrt(dx*dx+dy*dy); }
}
Point pt1 = new Point().déplacer(7.0,3.0);
Point pt2 = new Point().déplacer(4.0,-1.0);
double dist = pt1.distance(pt2); //→ 5.0
9
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : instances
définition de classe
définition de méthode
class Point {
...
double distance(Point pt) {
double dx = x-pt.x; double dy = y-pt.y;
return Math.sqrt(dx*dx+dy*dy); }
}
fabrication d'instances
Point pt1 = new Point().déplacer(7.0,3.0);
Point pt2 = new Point().déplacer(4.0,-1.0);
double dist = pt1.distance(pt2); //→ 5.0
appel de méthodes
10
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
constructeur
●
Constructeur
–
sorte de méthode
–
initialise les champs de l'objet lors de sa création
–
créations/initialisations plus lisibles
–
permet des initialisations toujours cohérentes
11
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
12
Exemple en Java : constructeur
class Point {
double x, y;
// initialisés par défaut à 0
Point(double u, double v) {
x = u; y = v;
}
...
}
Point pt1 = new Point(7.0,3.0);
Point pt2 = new Point(4.0,-1.0);
double dist = pt1.distance(pt2); //→ 5.0
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : constructeur
classe
constructeur
champs
class Point {
double x, y;
// initialisés par défaut à 0
Point(double u, double v) {
x = u; y = v;
}
...
}
instances
Point pt1 = new Point(7.0,3.0);
Point pt2 = new Point(4.0,-1.0);
double dist = pt1.distance(pt2); //→ 5.0
13
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
extension de classe et héritage
●
Extension de classe
–
version spécialisée d'une classe existante
–
héritage des champs et méthodes de cette classe
–
champs et méthodes additionnels
–
vocabulaire :
●
sous-classe : la classe étendue
●
super classe : la classe que l'on étend
14
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
15
Exemple en Java : extension
class PointColoré extends Point {
Couleur couleur;
PointColoré(double u, double v, Couleur coul){
x = u; y = v; couleur = coul; }
boolean mêmeCouleur(PointColoré pt) {
return couleur.equals(pt.couleur); }
}
Couleur rouge = new Couleur(255,0,0);
PointColoré ptRouge = new PointColoré(3,4,rouge);
double nm = ptRouge.norme();
//→ 5.0
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : extension
constructeur
sous-classe
champ ajouté
méthode ajoutée
super classe
class PointColoré extends Point {
Couleur couleur;
PointColoré(double u, double v, Couleur coul){
x = u; y = v; couleur = coul; }
boolean mêmeCouleur(PointColoré pt) {
return couleur.equals(pt.couleur); }
}
champs hérités
méthode héritée
instances
Couleur rouge = new Couleur(255,0,0);
PointColoré ptRouge = new PointColoré(3,4,rouge);
double nm = ptRouge.norme();
//→ 5.0
16
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
masquage de l'information
●
17
Masquage de l'information
–
s'applique à : classes, champs et méthodes
–
visibilité (scope)
●
public : visible par toutes les classes
●
private : visible seulement dans la classe
●
protected : visible seulement par les classes étendues
●
(package : visible seulement des classes du même package)
→ Type abstrait
–
on peut changer le contenu privé de la classe sans
changer ses utilisations publiques
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
18
Exemple en Java : visibilité
public class Point {
private double x, y;
public void déplacer(double dx, double dy) {
x += dx; y += dy;
}
}
Point pt = new Point();
pt.x = 3.0; pt.y = 4.0; // Erreur à la compilation
pt.déplacer(3.0,4.0);
// OK
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : visibilité
classe
champs invisibles en dehors de Point
19
seul moyen de changer les coordonnées
public class Point {
private double x, y;
public void déplacer(double dx, double dy) {
x += dx; y += dy;
}
}
fabrication d'instance
Point pt = new Point();
pt.x = 3.0; pt.y = 4.0; // Erreur à la compilation
pt.déplacer(3.0,4.0);
// OK
champs invisibles en dehors de Point
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet :
interface
●
20
Interface
~ squelette d'une classe, sans implémentation
●
méthodes d'interface : sans corps (abstraites)
●
pas de champs d'interface
–
plusieurs classes peuvent implémenter une même
interface
–
une interface peut étendre plusieurs autres interfaces
☛ Type abstrait (...→)
–
on peut changer la classe sans changer les utilisations
de l'interface
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : interface (1)
interface Point2D {
double norme();
void déplacer(double dx, double dy);
}
class PointCartésien implements Point2D { ... }
class PointPolaire implements Point2D {
double rayon, angle;
double norme() { return rayon; }
void déplacer(double dx, double dy) { ... }
}
21
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : interface (1)
définition d'interface
implémentations d'interface
interface Point2D {
double norme();
méthodes interface
void déplacer(double dx, double dy);
}
définition de classes qui implémentent cette interface
class PointCartésien implements Point2D { ... }
class PointPolaire implements Point2D {
double rayon, angle;
double norme() { return rayon; }
void déplacer(double dx, double dy) { ... }
}
méthodes de classe qui implémentent les méthodes d'interface
22
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
23
Exemple en Java : interface (2)
interface Point2D {
double norme();
void déplacer(double dx, double dy);
}
Point2D pt1 = new PointCartésien(1.0, -2.0);
Point2D pt2 = new PointPolaire(4.0, 0.7854);
pt1.déplacer(2.0, 6.0);
pt2.déplacer(1.0, 1.0);
double nm1 = pt1.norme();
//→ 5.0
double nm2 = pt2.norme();
//~ 5.0
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en Java : interface (2)
interface
interface Point2D {
double norme();
méthodes interface
void déplacer(double dx, double dy);
}
appel de constructeurs spécifiques à chaque classe
Point2D pt1 = new PointCartésien(1.0, -2.0);
Point2D pt2 = new PointPolaire(4.0, 0.7854);
pt1.déplacer(2.0, 6.0);
pt2.déplacer(1.0, 1.0);
appels des méthodes d'interface
double nm1 = pt1.norme();
//→ 5.0
double nm2 = pt2.norme();
//~ 5.0
24
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
25
Et aussi...
●
Notion de package (paquetage)
–
●
Héritage multiple
–
●
espace de nommage
extension de plusieurs classes
Classes abstraites
~ classes incomplètes
●
Variables de classes
~ globales
●
...
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet et langage C
●
●
Langage C
–
programmation impérative (effets de bord)
–
variables, fonctions, types structurés
–
pas de notions d'objet (classe, méthode, ...)
Extensions objet à C
–
●
langages : C++, Objective C
Programmation objet en langage C
–
style de programmation particulier (→)
26
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet en langage C :
classe, champ, instance
●
●
Déclaration de classe (type d'objet)
–
déclaration de structure
–
déclaration d'un type pointeur vers cette structure
Champ de classe (attribut)
–
●
champ de structure
Création d'instance (objet) :
–
définition d'entités du type structure
–
allocation dynamique et cast vers le type pointeur
27
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C : classe et instance
déclaration de structure
champs
« classe » = pointeur sur la structure
struct str_pt {
double x, y;
};
typedef struct str_pt *point;
/* Allocation statique */
struct str_pt orig = { 0.0, 0.0 };
point origine = &orig;
/* Allocation dynamique */
allocation
point pt = (point) malloc(sizeof(struct str_pt));
cast en pointeur sur la structure
28
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet en langage C :
constructeur, méthode
●
Constructeur (création d'objet)
–
●
fonction qui alloue dynamiquement une structure et
retourne un pointeur vers la structure
Méthode (opération) :
–
fonction qui prend comme premier argument un
type pointeur vers la structure
29
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
30
Exemple en C : constructeur
typedef struct str_pt {
double x, y;
} *point ;
point nouveauPoint(double x, double y) {
point pt = (point) malloc(sizeof(struct str_pt));
pt->x = x; pt->y = y;
return pt;
}
point pt1 = nouveauPoint(3.0, 4.0);
point pt2 = nouveauPoint(4.0, -1.0);
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C : constructeur
« classe » = pointeur vers struct
champs
31
« constructeur » = fonction qui alloue une struct
typedef struct str_pt {
double x, y;
} *point ;
point nouveauPoint(double x, double y) {
point pt = (point) malloc(sizeof(struct str_pt));
pt->x = x; pt->y = y;
return pt;
}
appels du « constructeur »
point pt1 = nouveauPoint(3.0, 4.0);
point pt2 = nouveauPoint(4.0, -1.0);
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C : méthodes
double norme(point pt){
return sqrt(pt->x * pt->x + pt->y * pt->y);
}
void déplacer(point pt, double dx, double dy){
pt->x += dx; pt->y += dy;
}
double distance(point pt1, point pt2) {
double dx = pt1->x – pt2->x;
double dy = pt1->y – pt2->y;
return sqrt(dx*dx+dy*dy); }
32
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C : méthodes
« méthodes » = fonction avec objet comme premier argument
double norme(point pt){
return sqrt(pt->x * pt->x + pt->y * pt->y);
}
void déplacer(point pt, double dx, double dy){
pt->x += dx; pt->y += dy;
}
double distance(point pt1, point pt2) {
double dx = pt1->x – pt2->x;
double dy = pt1->y – pt2->y;
return sqrt(dx*dx+dy*dy); }
33
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation C :
déclaration et définition
Déclaration :
–
suposition d'existence (dans un autre fichier), typage
–
ex. extern int x;
extern int f(char, struct str);
Définition
–
lieu d'existence (ce fichier), rappel du typage
–
ex. int x;
int f(char c, struct str mystr) { ... }
(→ contrôle possible par rapport à des déclarations)
34
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet en C :
masquage de l'information
●
35
Visibilité des entités (variables, fonctions)
–
modifieur « extern »
●
déclaration d'une entité visible à l'extérieur du fichier
→ variables et fonctions publiques (déclaration)
–
modifieur « static »
●
définition d'une entité locale au fichier (invisible à l'extérieur)
→ variables et fonctions privées
–
sans modifieur
●
définition d'une entité visible à l'extérieur du fichier
(il suffit pour ça qu'on l'y déclare « extern »)
→ variables et fonctions publiques (définition)
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet en C :
interface
●
Interface
–
●
●
fichier « .h »
●
déclarations de type (structure et pointeur sur structure)
●
déclarations de fonctions (extern)
Classe qui implémente l'interface
–
inclusion du fichier « .h » (#include)
–
définition des fonctions correspondantes
Classe qui utilise l'interface
–
inclusion du fichier « .h » (#include)
–
appel des fonctions déclarées
36
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
fichier d'interface (point.h)
// Classe
typedef struct str_pt *point;
// Constructeur
extern point nouveauPoint(double x, double y);
// Méthodes
extern double norme(point pt);
extern void déplacer(point pt, double dx, double dy);
extern double distance(point pt1, point pt2);
37
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
fichier d'interface (point.h)
// Classe
typedef struct str_pt *point;
// Constructeur
extern point nouveauPoint(double x, double y);
// Méthodes
extern double norme(point pt);
extern void déplacer(point pt, double dx, double dy);
extern double distance(point pt1, point pt2);
38
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
implémentation de l'interface (point.c)
// Inclusion de l'interface
#include "point.h"
// Définition du type
typedef struct str_pt { double x, y; } *point;
// Définition des constructeurs et méthodes
static double normeXY(double x, double y) {
return sqrt(x*x+y*y); }
extern double norme(point pt) {
return normeXY(pt->x, pt->y); }
extern double distance(point pt1, point pt2) {
return normeXY(pt1->x - pt2->x, pt1->y – pt2->y); }
39
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
implémentation de l'interface (point.c)
// Inclusion de l'interface
#include "point.h"
// Définition du type
typedef struct str_pt { double x, y; } *point;
// Définition des constructeurs et méthodes
static double normeXY(double x, double y) {
return sqrt(x*x+y*y); }
extern double norme(point pt) {
return normeXY(pt->x, pt->y); }
extern double distance(point pt1, point pt2) {
return normeXY(pt1->x - pt2->x, pt1->y – pt2->y); }
40
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
utilisation via l'interface (use.c)
// Inclusion de l'interface
#include "point.h"
// Utilisation via l'interface
void use() {
point pt1 = nouveauPoint(3.0, 4.0);
point pt2 = nouveauPoint(4.0, -1.0);
printf("norm = %d\n", norme(pt1));
printf("dist = %d\n", distance(pt1,pt2));
int u = pt1->x;
/* Erreur à la compilation */
int v = normeXY(3.0,4.0); /* Erreur à la compilation */
}
41
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Exemple en C :
utilisation via l'interface (use.c)
// Inclusion de l'interface
#include "point.h"
// Utilisation via l'interface
void use() {
point pt1 = nouveauPoint(3.0, 4.0);
point pt2 = nouveauPoint(4.0, -1.0);
printf("norm = %d\n", norme(pt1));
printf("dist = %d\n", distance(pt1,pt2));
int u = pt1->x;
/* Erreur à la compilation */
int v = normeXY(3.0,4.0); /* Erreur à la compilation */
}
42
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Limitations de
la programmation objet en C
●
Interface seulement pour masquer
–
●
structure dans structure
Héritage plus lourd (explicite)
–
●
Pas de multiple implémentation (dans un même binaire)
Extension plus lourde
–
●
43
« cast » de type (de la sous-classe vers la superclasse)
Moins de contrôles du compilateur
–
pas de contrôle de la légalité des casts
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
Programmation objet en C
☛ Suivre l'esprit, pas la lettre (!)
–
s'adapter au problème : ne pas aveuglément tout
traiter avec des « objets à la C » (pointeurs vers
structure et fonctions associées)
–
aide à l'organisation des déclarations et définitions
44
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet
45
À retenir
●
Organisation du système autour de :
–
fonctions si pas d'objets ou objets simples (ex.
scalaires)
–
données si des objets complexes
●
Lien avec le modèle conceptuel
●
Concepts de la programmation objet
–
●
classe, instance, champ, méthode, constructeur,
interface, héritage, extension
Masquage de l'information et types abstraits