Premiers principes de la programmation objet
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
14 septembre 2015
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
1/34
Programmation objet
Objet :
(cid:73) propriétés (attributs), valeurs (État) (cid:73) opérations (méthodes) (cid:73) identité (adresse)
Classe :
(cid:73) définit un type d’objets (cid:73) ensemble d’objets (en intension) (cid:73) propriétés communes (attributs) (cid:73) opérations communes (méthodes)
Un objet est une instance de sa classe
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
2/34
Pourquoi programmer en objet ?
(cid:73) Perennité des objets (6= fonctionnalités) (cid:73) Modularité (cid:73) Réutilisabilité (cid:73) Structuration des données manipulées (cid:73) Encapsulation (cid:73) Abstraction, traitements génériques (cid:73) Facilité des tests (cid:73) etc.
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
3/34
Exemples de classes
Héritage
Classes abstraites et interfaces
Autres notions
Notation UML
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
4/34
Classe centrée sur les attributs
(cid:73) getName, getPrice : accesseurs (cid:73) setPrice(float) : mutateur (cid:73) available est encapsulé
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
5/34
Classe centrée sur les opérations
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
6/34
Classe générale
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
7/34
Exemples de classes
Héritage
Classes abstraites et interfaces
Autres notions
Notation UML
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
8/34
Héritage
La classe F hérite de la classe M : (cid:73) F a tous les attributs de M (cid:73) F peut avoir des attributs supplémentaires (cid:73) F a toutes les méthodes de M (cid:73) certaines méthodes peuvent être définies 6= dans F (redéfinition) (cid:73) F peut avoir des méthodes supplémentaires (cid:73) les instances de F peuvent être manipulées comme des instances de M
(polymorphisme)
(cid:73) Java : class F extends M
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
9/34
Publicité
Exemples de classes
Héritage
Classes abstraites et interfaces
Autres notions
Notation UML
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
10/34
Classes abstraites
Définitions :
(cid:73) méthode abstraite : déclarée mais non définie à ce niveau de la
hirarchie de classes
(cid:73) classe abstraite : sans instances directes (cid:73) méthodes abstraites ⇒ classe abstraite (cid:73) classe abstraite sans méthode abstraite possible (on ne veut pas
d’instance à ce niveau)
(cid:73) classe abstraite avec méthodes définies possible (tout n’est pas
abstrait)
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
11/34
Monstres
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
12/34
Monstres
class Fight {
. . . public void hit (Monster m1, Monster m2) { m2.decreaseLifePoints(m1.hitForce()) ;
}
}
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
13/34
Biologie
(cid:73) Séquence d’ADN : ATTGCATATCCGATTACA. . . (cid:73) Protéine : CYWCCGRKRAQ. . .
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
14/34
Biologie
(cid:73) Sequence abstraite sans méthode abstraite (cid:73) Sequence factorise la gestion de liste (cid:73) Pas d’instance de Sequence (cid:73) Pas ou peu de traitements génériques sur Sequence
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
15/34
Interfaces
Définitions :
(cid:73) ensemble de déclarations de méthodes (cid:73) implémenter ⇒ définir ces méthodes (cid:73) pas d’attribut (sauf final static) (cid:73) Java : class C implements I1, I2, I3. . .
Utilisations principales :
(cid:73) définir un type « tels traitements applicables » (cid:73) définir un type « telles opérations disponibles »
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
16/34
Tri
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
17/34
Tri
class Quicksort { . . . public List<Ordered> getOrderedList () {
. . . if (element1.isGreaterThan(element2)) {
Publicité
. . .
} . . .
}
}
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
18/34
Médiathèque
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
19/34
Une architecture classique
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
20/34
Exemples de classes
Héritage
Classes abstraites et interfaces
Autres notions
Notation UML
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
21/34
Délégation
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
22/34
Instances versus classes : "Static"
Méthodes d’instance :
(cid:73) méthodes standards (cid:73) dépendent de l’état courant de l’instance (et d’arguments) (cid:73) appelées sur un objet (instance) (cid:73) exemples : accesseurs, mutateurs (cid:73) exemples : p.evaluate(0.1), this.evaluate(5.33)
Méthodes de classe : (cid:73) Java : static (cid:73) ne dépendent que de la classe (et d’arguments) (cid:73) appelées sur une classe (cid:73) exemples : main (cid:73) exemple : Integer.parseInt("0347"), Polynomial.add(p1,p2)
Attributs : de classe ou d’instance également
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
23/34
Polymorphisme
List<Appartment> appartments=new List<Appartment> () ; appartments.add(new Appartment(400)) ; appartments.add(new AgencyAppartment(350,75)) ; Appartment a=appartments.get(1) ; System.out.println(""+a.getRent()) ; /* 425 */
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
24/34
Méthodes virtuelles, liage dynamique (1/2)
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
25/34
+démarrer():void+avancer():void+tourner():void-roues : Roue[ ]#moteur : MoteurVéhicule+tourner():void+tournerLeVolant():void+mettreLeClignotant():void-volant : VolantVoiture{mettreLeClignotant();tournerLeVolant();}+tourner():void+tournerLeGuidon():void+sePencherVersLIntérieur():void-guidon : GuidonVélo{sePencherVersLIntérieur();tournerLeGuidon();}Méthodes virtuelles, liage dynamique (2/2)
(cid:73) Par polymorphisme, une référence de type Véhicule peut référencer :
un Véhicule (si non abstract) OU une Voiture OU un vélo
(cid:73) Quelle est la différence entre vélo.tourne() et véhicule.tourner() si :
Vélo vélo=new Vélo() ; Véhicule véhicule = vélo ;
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
26/34
Code de test : Véhicule[ ] parcAuto=new Véhicule[2];parcAuto[0]=new Voiture();parcAuto[1]=new Vélo();for (int i=0;i<parcAuto.length;i++) { parcAuto[i].démarrer(); parcAuto[i].avancer(); parcAuto[i].tourner(); }Références versus Instances
(cid:73) Une instance n’a pas de nom, et il existe entre 1 et n références sur
elle à un instant donné (sinon –> garbage collector)
(cid:73) Une référence est capable de référencer tous les objets de son type, mais aussi, par POLYMORPHISME de son (ses) sous-type(s), etc. Elle peut ÃŊtre de type abstrait.
Publicité
(cid:73) Une instance n’est, par construction, JAMAIS ABSTRAITE. Toutes ses méthodes existent, même si elle est référencée par une référence abstraite, la classe ayant servi à l’instancier étant par définition non abstraite.
(cid:73) Le code à exécuter pour une invocation donnée de méthode n’est pas toujours connu à la compilation. C’est le liage dynamique. Le code réellement exécuté est toujours celui qui correspond à la (re)définition de méthode située LE PLUS BAS dans la hiérarchie de classes vis-à-vis du TYPE REEL de l’objet.
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
27/34
Héritage ou Association (1/3)
(cid:73) Attention, en découvrant la conception objet, on voit de l’héritage
partout
(cid:73) Ne pas oublier l’association, complément indispensable de l’héritage (cid:73) L’héritage se justifie si le polyorphisme qui en découle fait sens (cid:73) Test sémantique : une instance d’une classe fille EST UN élément de
la classe mère
(cid:73) Exemple : un cabriolet EST UNE voiture qui EST UN véhicule (cid:73) Contre exemple : un cercle N’EST PAS un point. Son centre est un
point (association)
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
28/34
Héritage versus Association (2/3)
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
29/34
+ translate(dx:double, dy:double)- x : double- y : doublePoint- rayon : doubleCercle{x+=dx;y+=dy;}{// délégation :centre.translate(dx,dy);}+ translate(dx:double, dy:double)- rayon : double- centre : PointCercle1Héritage ou Association (3/3)
(cid:73) Tout ne se décrit pas de facon hiérarchique (héritage) (cid:73) Essayons avec toutes les variétés de pizzas (cid:73) On crée la classe de base Pizza (cid:73) On crée une sous-classe PizzaAuJambon, ajoutant les fonctionnalités
propres à l’ingrédient jambon
(cid:73) Puis une sous-classe PizzaAuFromage (cid:73) Mais quid de la classe PizzaAuFormageEtAuJambon ? (cid:73) Avec 10 ingrédients, tout cela explose... et le code devient forcément
redondant
(cid:73) –> voir les design-patterns correspondants
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
30/34
Visibilité
Attributs et méthodes :
(cid:73) public : accessible partout (cid:73) private : accessible dans la classe seulement (cid:73) private accessible aussi dans autres instances de la classe (cid:73) protected : accessible dans classe et sous-classes (cid:73) package : accessible dans le package (Java)
Surcharge :
(cid:73) surcharge de méthode en augmentant visibilité possible (cid:73) restriction de visibilité impossible
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
31/34
Exemples de classes
Héritage
Classes abstraites et interfaces
Autres notions
Notation UML
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
32/34
Diagrammes complets
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
33/34
Utilisation parcimonieuse
(cid:73) Simplifier : moyen de communication (cid:73) Diagramme complet redondant avec le code et donc inutile (cid:73) Ne montrer que ce qui est pertinent dans le contexte (cid:73) Prendre 6= points de vue (cid:73) Distinguer présentation de l’implémentation vs de l’utilisation (cid:73) Attributs/méthodes privés : cacher sauf implémentation (cid:73) Cf. exemples de ce diaporama
Grégory Bonnet, Yann Mathet, Bruno Zanuttini
Génie logiciel
34/34