notions de programmation orientée objet -...
Post on 04-Feb-2018
224 Views
Preview:
TRANSCRIPT
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 1
Génie LogicielGénie Logiciel
Notions de programmation Notions de programmation orientée objetorienté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 2
Les données d'abord (1)Les données d'abord (1)
ImportantImportant 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 3
Les données d'abord (2)Les données d'abord (2)
ImportantImportant 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)
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 4
Notions de programmation objetNotions 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 5
Programmation objet :Programmation objet :classe et instanceclasse 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) ...
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 6
Programmation objet :Programmation objet :champ et méthodechamp 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()
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 7
Exemple en Java : classe PointExemple 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 8
Exemple en Java : classe PointExemple en Java : classe Pointclasse définition de champs définition de méthodes
fabrication d'une instance
appel 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;
}
}
Point pt = new Point();
pt.déplacer(3.0,4.0);
double nm = pt.norme(); //→ 5.0
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 9
Exemple en Java : instancesExemple 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 10
fabrication d'instances
définition de classe
Exemple en Java : instancesExemple en Java : instancesdéfinition de méthode
appel de méthodes
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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 11
Programmation objet :Programmation objet :constructeurconstructeur
● 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 12
Exemple en Java : constructeurExemple 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 13
instances
Exemple en Java : constructeurExemple en Java : constructeurclasse champsconstructeur
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 14
Programmation objet :Programmation objet :extension de classe et héritageextension 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 15
Exemple en Java : extensionExemple 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 16
instances
Exemple en Java : extensionExemple en Java : extensionsous-classe champ ajouté méthode ajoutéeconstructeur super classe
méthode héritéechamps hérités
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 17
Programmation objet :Programmation objet :masquage de l'informationmasquage de l'information
● 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é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 19
Exemple en Java : visibilitéExemple en Java : visibilitéclasse champs invisibles en dehors de Point seul moyen de changer les coordonnées
fabrication d'instance
champs invisibles en dehors de Point
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 20
Programmation objet :Programmation objet :interfaceinterface
● 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 21
Exemple en Java : interface (1)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) { ... }
}
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 22
Exemple en Java : interface (1)Exemple en Java : interface (1)implémentations d'interface
définition de classes qui implémentent cette interface
méthodes de classe qui implémentent les méthodes d'interface
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) { ... }
}
méthodes interface
définition d'interface
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 23
Exemple en Java : interface (2)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 24
Exemple en Java : interface (2)Exemple en Java : interface (2)
appels des méthodes d'interface
appel de constructeurs spécifiques à chaque classe
interface
méthodes interfaceinterface 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 25
Et aussi...Et aussi...
● Notion de package (paquetage)– espace de nommage
● Héritage multiple– extension de plusieurs classes
● Classes abstraites
~ classes incomplètes● Variables de classes
~ globales● ...
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 26
Programmation objet et langage CProgrammation 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 (→)
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 27
Programmation objet en langage C :Programmation objet en langage C :classe, champ, instanceclasse, 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 28
Exemple en C : classe et instanceExemple en C : classe et instancedéclaration de structure champs « classe » = pointeur sur la structure
cast en pointeur sur la structure
allocation
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 */
point pt = (point) malloc(sizeof(struct str_pt));
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 29
Programmation objet en langage C :Programmation objet en langage C :constructeur, méthodeconstructeur, 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 30
Exemple en C : constructeurExemple 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 31
Exemple en C : constructeurExemple en C : constructeur« classe » = pointeur vers struct champs « constructeur » = fonction qui alloue une struct
appels du « 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 32
Exemple en C : méthodesExemple 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); }
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 33
Exemple en C : méthodesExemple 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); }
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 34
Programmation C :Programmation C :déclaration et définitiondé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)
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 35
Programmation objet en C :Programmation objet en C :masquage de l'informationmasquage de l'information
● 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 36
Programmation objet en C :Programmation objet en C :interfaceinterface
● 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 37
Exemple en C :Exemple en C :fichier d'interface (point.h)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);
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 38
Exemple en C :Exemple en C :fichier d'interface (point.h)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);
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 39
Exemple en C :Exemple en C :implémentation de l'interface (point.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); }
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 40
Exemple en C :Exemple en C :implémentation de l'interface (point.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); }
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 41
Exemple en C :Exemple en C :utilisation via l'interface (use.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 */
}
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 42
Exemple en C :Exemple en C :utilisation via l'interface (use.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 */
}
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 43
Limitations deLimitations dela programmation objet en Cla programmation objet en C
● Interface seulement pour masquer– Pas de multiple implémentation (dans un même binaire)
● Extension plus lourde– structure dans structure
● Héritage plus lourd (explicite)– « 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 44
Programmation objet en CProgrammation 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
Génie logiciel – Programmation orientée objet © 2005-2007 Renaud Marlet 45
À retenirÀ 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
top related