Premiers principes de la programmation objet

Page 1 sur 34Lecteur de document UniversityLib

Premiers principes de la programmation objet

Software Engineering · notes

Voir tous les documents en programmation

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