Chapitre 3
ELEMENTS DE PROGRAMMATION
ORIENTEE OBJET
 
 
Précédent Suivant
 

Eléments de programmation
orientée objet
Programmation orientée objet
* Modélisation orientée objet
* Modélisation = représentation simplifiée d'un système
* Modélisation reposant sur les concepts du paradigme objet
* Un formalisme universel: UML
* Modélisation orientée objet utile dans un projet interactif
* Permet d'identifier les composants animés (les "sprites")
* Permet de déterminer les interactions entre ces composants
* TypeScript est un langage orienté objet
* Programmation orientée objet
* Programmation intégrant les concepts du paradigme objet
* Langages généralistes orientés objet: C++, Java, C#...
* Pour le Web: TypeScript et PHP intègrent des concepts objet
Définitions
* Un objet est une entité
* Chose concrète ou abstraite
* Ayant un intérêt pour l'étude
* Pouvant être reconnu distinctement
* Exemple: une voiture Clio 2 DCI, un stylo bleu...
* Classe = objets d'un même type
* Décrit un ensemble d'objets similaires
* Exemple
* Classe = voiture
* Objets = Clio 2 DCI, Punto S55...
Membres d'une classe
* Une classe possède des "membres"
* Des attributs
* Des méthodes
* Attributs = état
* Caractéristiques de l'objet
* Exemple: la couleur de la voiture
* couleur sera un attribut de la classe voiture
* bleu sera la valeur de cet attribut pour un objet précis
* Ensemble des valeurs des attributs = état de l'objet
* Programmation: attribut = variable propre à l'objet
* Méthodes = comportement
* Fonctionnalités de l'objet
* Exemple: la voiture accélère
* accélérer sera une méthode de la classe voiture
* Une méthode permet de changer l'état de l'objet
* Programmation: méthode = fonction propre à l'objet
Les principes fondateurs (1/3)
* Encapsulation
* Variables et fonctions réunies dans une même entité: la classe
* L'accès à ces éléments peut être contrôlé
* Permet de masquer les détails non nécessaires à l'utilisation
* Exemple
* Eléments nécessaires pour dessiner une forme géométrique
* Des coordonnées et une couleur
* Une fonction qui permet de tracer la forme
* Définition d'une classe "Forme"
* Trois variables: x, y et couleur
* Une fonction: tracer
Les principes fondateurs (2/3)
* Héritage
* Permet de définir une hiérarchie entre classes
* Classe fille hérite des variables et fonctions de sa mère
* Classe fille possède ses propres variables et fonctions
* Exemple
* Un rectangle est une forme géométrique
* Définition d'une classe "Rectangle"
* Hérite de la classe "Forme"
* Trois variables: x, y, et couleur
* Une fonction: tracer
* Possède ses propres caractéristiques
* Deux variables: largeur et hauteur
* Une fonction "tracer" différente
Les principes fondateurs (3/3)
* Polymorphisme
* Possibilité pour une fonction de prendre plusieurs formes
* Souvent utilisé en combinaison avec l'héritage
* Possibilité de redéfinir une fonction héritée: "redéfinition"
* Accès par la classe mère ==> polymorphisme
* Exemple
* Un rectangle et un cercle sont des formes géométriques
* Chacun a des variables et fonctions propres
* Fonctions "tracer" différentes
* Manipulation d'une forme par la classe "Forme"
* Que fait l'appel à la fonction "tracer" de la classe mère ?
* Rectangle ==> appel à "tracer" de "Rectangle"
* Cercle ==> appel à "tracer" de "Cercle"
Formalisme UML
* UML = Unified Modeling Language
* Formalisme international pour la modélisation
* Permet de modéliser tout type de système
* Utilisé en particulier pour modéliser des logiciels
* Programmes informatiques
* Bases de données
* Sites Web
* Principaux types de schémas
* Diagramme des cas d'utilisation
* Analyse des besoins
* Diagramme de classes
* Structure statique du système
* Diagramme d'interactions
* Structure dynamique du système
* Pour un projet interactif: diagramme de classes
Diagramme de classes
* Représentation d'une classe ==> décrire des objets ayant
* Des propriétés (des attributs) similaires
* Un comportement (des méthodes) commun
* Des relations communes avec d'autres objets
Déclaration d'une classe avec TS (1/2)
class Voiture {
public puissance_ : number;
public couleur_ : string;
public vitesse_ : number;
public accelerer()
{ this.vitesse_ += 5; }
public ralentir()
{ this.vitesse_ -= 5; }
public constructor(p : number,
c : string)
{
this.puissance_ = p;
this.couleur_ = c;
this.vitesse_ = 0;
}
}
Déclaration d'une classe avec TS (2/2)
* Convention de nommage
* Classe: 1ère lettre en majuscule
* Attribut et méthode: 1ère lettre en minuscule
* Attribut suivi d'un "_"
* Principe d'encapsulation
* Attributs non accessibles sans contrôle
* Attributs cachés avec le mot-clé "private"
* Des méthodes contrôlent l'accès: les "accesseurs"
* Exemple d'encapsulation
* private couleur_ : string
* public getCouleur() : string
{ return this.couleur_; }
* public setCouleur(c : string)
{ this.couleur_ = c; } ? vérification possible
Encapsulation
Utilisation d'une classe avec TypeScript
* Créer un objet à partir d'une classe: l'"instanciation"
* let ma_voiture : Voiture = new Voiture(75,"bleu");
* "new" crée un objet de la classe indiquée
* "new" appelle aussi le constructeur de la classe
* Le constructeur est chargé d'initialiser l'objet
* Classe = modèle pour la création d'objets
* Objet = "instance" d'une classe donnée
* Appeler une méthode ou un attribut d'un objet
* Grâce à l'opérateur "."
* ma_voiture.accelerer();
* let couleur : string = ma_voiture.getCouleur();
* let vitesse : number = ma_voiture.vitesse_;
Mot-clé "this"
* "this" représente l'objet dans lequel on se trouve
* Exécuter une méthode
* Signifie exécuter une fonction sur un objet
* "this" représente l'objet dans cette fonction
* Pas besoin de le passer en paramètre
* Exemple
* class Pingouin {
private nom_ : string;
public constructor(n : string) { this.nom_ = n; }
public danser(p : Pingouin)
{ console.log(this.nom_ + " danse avec " + p.nom_); }
}
* let p1 : Pingouin = new Pingouin("Mumble");
let p2 : Pingouin = new Pingouin("Gloria");
* Que signifie "p1.danser(p2)" ?
* Exécution de la fonction "danser" sur l'objet "p1"
* Dans la fonction "danser", "this" représente alors l'objet "p1"
* Résultat: Mumble danse avec Gloria
Relations entre les classes (1/2)
* Une classe peut être en relation avec d'autres
* Un objet d'une classe peut manipuler un objet d'une autre classe
* Relation d'association
* Exemple: un yéti lance un pingouin (cf. yeti sports)
* Un objet d'une classe peut contenir un objet d'une autre classe
* Relation d'agrégation
* Exemple: un pingouin possède deux ailes
* Une classe peut représenter un sous-ensemble d'objets
d'une autre classe qui sont plus spécifiques
* Relation d'héritage
* Exemple: les pingouins sont des oiseaux (de la famille des alcidés)
Relations entre les classes (2/2)
* Relation d'association
* Une classe B est associée à une classe A
* Relation d'agrégation
* Une classe B possède des objets d'une classe A
* Relation d'héritage
* Une classe B hérite des caractéristiques d'une classe A
Agrégation avec TypeScript
class Pingouin {
private numero_ : number;
private x_ : number;
private y_ : number;
public constructor(n : number) {
this.numero_ = n;
this.x_ = 0;
this.y_ = 0;
}
public deplacer(x : number,
y : number) {
this.x_ = x;
this.y_ = y;
}
}
Héritage avec TypeScript (1/2)
class Forme {
protected x_ : number;
protected y_ : number;
public constructor(x : number, y : number)
{ this.x_ = x; this.y_ = y; }
public tracer() { /* Vide */ }
}
class Rectangle extends Forme {
private largeur_ : number;
private hauteur_ : number;
public constructor(x : number, y : number, l : number, h : number)
{ this.x_ = x; this.y_ = y;
this.largeur_ = l; this.hauteur_ = h; }
public tracer() { /* Code dessin rectangle */ }
}
* "Rectangle" hérite de tous les membres de "Forme"
* Mot-clé "extends" indique la relation d'héritage
* "Rectangle" redéfinit la méthode "tracer"
* protected = membre accessible à partir des classes filles
Héritage avec TypeScript (2/2)
* Utilisation des classes "Forme" et "Rectangle"
let f : Array<Forme> = new Array<Forme>();
f[0] = new Forme(10,10);
f[1] = new Rectangle(100,100,25,10);
for (let i : number = 0; i < f.length; i++)
{ f[i].tracer(); }
* "f[0]" et "f[1]" sont des objets de la classe "Forme"
* Pourtant leur méthode "tracer" est différente
* La méthode "tracer" prend donc des formes différentes
* C'est ça le polymorphisme !
* Le polymorphisme est indispensable pour l'héritage
* Pour "f[0]", la méthode "tracer" de "Forme" est appelée
* Pour "f[1]", la méthode "tracer" de "Rectangle" est appelée
Complément sur les constructeurs (1/2)
* Un seul constructeur autorisé
* Contrairement à d'autres langages
* Il faut donc choisir le plus pertinent
* Quel constructeur ?
* public constructor(x : number, y : number)
{ this.x_ = x; this.y_ = y; }
* public constructor()
{ this.x_ = 0; this.y_ = 0; }
* Quelle utilisation ?
* let f : Forme = new Forme(10,10);
* let f : Forme = new Forme();
Complément sur les constructeurs (2/2)
* Héritage ==> constructions en chaîne
* Appel constructeur classe fille ==> appel constructeur classe mère
* Automatique: construction partie héritée au début du constructeur
* Exemple: construction d'un rectangle
==> Appel constructeur "Forme"
==> Exécution constructeur "Rectangle"
* Appel constructeur classe mère ==> super(arguments)
class Rectangle extends Forme {
...
public constructor(x : number, y : number,
l : number, h : number) {
super(x,y);
this.largeur_ = l; this.hauteur_ = h;
}
}
Héritage et conversion
* Tester l'appartenance d'un objet à une classe
* if (f[i] instanceof Rectangle) ...
* Conversion ascendante: fille ==> mère
* let r : Rectangle = new Rectangle(...);
* let f : Forme = r;
* Toujours possible
* Conversion descendante: mère ==> fille
* let f : Forme = new Rectangle(...);
* let r : Rectangle = f;
* Nécessite une vérification
* Toute conversion descendante doit être explicitée
* let r : Rectangle = <Rectangle>f;
* Conversion impossible ==> r = null