105
Conception Orientée Objet Laurent Henocque http: //laurent . henocque .free. fr/ Enseignant Chercheur ESIL/INFO France http: //laurent . henocque .perso. esil . univmed . fr/ mis à jour en Décembre 2008

Conception Orientée Objet

  • Upload
    enye

  • View
    32

  • Download
    0

Embed Size (px)

DESCRIPTION

Conception Orientée Objet. Laurent Henocque http://laurent.henocque.free.fr/ Enseignant Chercheur ESIL/INFO France http://laurent.henocque.perso.esil.univmed.fr/ mis à jour en Décembre 2008. Licence Creative Commons. - PowerPoint PPT Presentation

Citation preview

Page 1: Conception Orientée Objet

Conception Orientée Objet

Laurent Henocquehttp://laurent.henocque.free.fr/

Enseignant Chercheur ESIL/INFO Francehttp://laurent.henocque.perso.esil.univmed.fr/

mis à jour en Décembre 2008

Page 2: Conception Orientée Objet

Licence Creative Commons

Cette création est mise à disposition selon le Contrat Paternité-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne

http://creativecommons.org/licenses/by-sa/2.0/fr/

ou par courrier postal à Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Page 3: Conception Orientée Objet

Objectifs

• Donner une compréhension des enjeux de la conception orientée objet, et des connaissances actuelles sur le sujet

Page 4: Conception Orientée Objet

Plan

• Panorama du concept d'objet en Informatique• Principes généraux de détermination des classes• Principes de l'utilisation des objets• A propos de réutilisabilité• Conception des interfaces de programmation en

C++• Types de classes

Page 5: Conception Orientée Objet

Panorama du concept d'objet

Page 6: Conception Orientée Objet

Un modèle de la réalité

• les mêmes réactions que la réalité représentée,

• la même modularité que le monde réel.

Page 7: Conception Orientée Objet

Modèle de la réalité (2)

Chaque objet se comporte "comme" son homologue réel en termes de :

• persistance de son état

• réactions aux perturbations externes

• communication avec les autres objets

Page 8: Conception Orientée Objet

Persistance

• La persistance d’un état est obtenue de façon élémentaire : par stockage de données pertinentes dans une structure (les types struct en C et record en Pascal).

• La structure est donc l'élément fondamental dans la représentation informatique de l'objet : un espace clos et contigu où figurent toutes les informations relatives à un objet.

Page 9: Conception Orientée Objet

Encapsulation des données

• La démarche consistant à décrire un tel espace est nommée encapsulation des données.

• Une structure est également décrite comme un agrégat de données hétérogènes. – Le type tableau au contraire constitue un

agrégat de données d’un même type (homogène).

Page 10: Conception Orientée Objet

Réactions

• La réaction aux perturbations externes est simulée par des fonctions que l'on peut appliquer à l'objet.

– Message -> fonction– Evénement -> fonction

Page 11: Conception Orientée Objet

Difficultés

• L'existence chez différents objets de fonctionnalités sémantiquement voisines, et pour autant différentes dans leur réalisation justifie le polymorphisme

• Le nommage des fonctions globales nécessite de donner des noms différents à des fonctions homologues, et donc à multiplier dans un programme le nombre des symboles.

Page 12: Conception Orientée Objet

Difficultés

• Les fonctions globales ne permettent pas avec une grande finesse le contrôle d'éventuelles restrictions au graphe d'appel du programme.

• L’organisation en classe permet de finement définir les autorisations (public/protected/private)

Page 13: Conception Orientée Objet

Polymorphisme

• On accepte de donner le même nom à des fonctions dont les arguments diffèrent.

• Ainsi, un programmeur peut utiliser un nom unique pour l'associer à un concept d'opération unique, utilisable dans différents contextes

Page 14: Conception Orientée Objet

Avantages du polymorphisme

• Les programmes gagnent en abstraction

• Il n'est pas nécessaire de définir une règle de nommage des fonctions homologues (par exemple "bouge_caillou", ou bien "CaillouBouge").

• L'écriture des programmes est facilitée.

Page 15: Conception Orientée Objet

Encapsulation de fonctions

• Dans ce modèle, sont associées logiquement à la structure (de données) représentant un objet les seules fonctions qui simulent (ou implantent) des réactions de cet objet au monde extérieur.

• Ces fonctions sont alors appelées des méthodes. • La déclaration d'une méthode omet la mention du

paramètre désignant l'objet auquel elle s'applique, appelé « support »

Page 16: Conception Orientée Objet

Opérations et Méthodes

• Par définition, toutes les méthodes de même nom constituent des implantations appropriées du même concept, qui porte le nom d' opération.

• Chaque méthode d'une classe implante une opération donnée pour cette classe

Page 17: Conception Orientée Objet

Polymorphisme et méthodes

• Aucun langage de programmation ne permet de distinguer deux fonctions par le seul type de leur valeur de retour.

Page 18: Conception Orientée Objet

Objets

• Une structure qui encapsule à la fois des données et des méthodes est appelée un objet. – A ce titre, certaines bases de données dites

"objet" n'en méritent pas le nom puisqu'elles ne sont qu'orientées "structure".

• Notons que le terme d'objet est défini sans qu'il ne soit question d'héritage.

Page 19: Conception Orientée Objet

Communication

• L'envoi d'un message d'un objet à un autre suppose qu'une méthode du premier appelle une méthode du deuxième.

• Dans le cas "synchrone", la réponse est fournie par la valeur de retour de la fonction appelée

• Dans le cas asynchrone, le réponse est fournie par un message en retour: la méthode appelante peut terminer avant que la réponse ne parvienne

Page 20: Conception Orientée Objet

Messages / Méthodes

• L'encapsulation permet de contrôler les possibilités de communications inter objets,

• L'appel réciproque et récursif de méthodes entre deux (ou plus) objets dans le cas asynchrone peut conduire à des situations de bouclage, qui ne seraient pas apparues dans le cas synchrone

Page 21: Conception Orientée Objet

Classes et Types

Page 22: Conception Orientée Objet

La Classe (1)

• On veut créer un nombre arbitraire d’objets

• La partie "structure" de l'objet, contenant ses données, doit être dupliquée pour chaque objet de même type.

• Par contre, les méthodes de ces objets ne nécessitent pas d'être décrites plusieurs fois.

Page 23: Conception Orientée Objet

La Classe (2)

• On distingue donc entre la réalisation particulière d'un objet, une instance,

• et l'ensemble des informations nécessaires pour construire et "animer" ces instances : leur classe.

Page 24: Conception Orientée Objet

Prototypes

• Le modèle utilisé pour générer pour chaque objet une structure physique de données est appelé le prototype.

• On peut donc parler de “classe” sans qu'il ne soit question d'héritage.

Page 25: Conception Orientée Objet

Types abstraits

• Le concept de type abstrait est introduit pour la spécification de systèmes.

• Un type abstrait consiste en une description formelle (i.e. logique) des états accessibles aux objets de ce type, et des transitions qui peuvent survenir entre états.

Page 26: Conception Orientée Objet

Types Abstraits et Preuve

• Toutes les propriétés des instances d’un type abstrait sont démontrables comme on démontre un théorème.

• Une telle description spécifie donc sans ambiguïté la sémantique d’un ensemble d’objets, indépendamment des perspectives de sa réalisation informatique.

Page 27: Conception Orientée Objet

des Types abstraits aux langages

• Le type abstrait est un modèle formel des objets qu'il décrit, et peut être appelé une classe.

• Cette classe comporte assez d'informations pour générer un prototype. Les transitions correspondent à des fonctions membres qui modifient les instances.

• Mais elle ne possède pas de réalisation physique en soi. Elle n'est qu'un cadre général de réalisation.

• C'est l'approche des langages comme C++ et Simula

Page 28: Conception Orientée Objet

Type = Classe + Invariant ?

• Une classe décrit ses transitions de manière implicite : les fonctions membres qui provoquent des changements d’état.

• Les états admissibles peuvent être spécifiés de manière semi-formelle par un invariant de classe

• Cet invariant réalise par un test les axiomes applicables aux objets de cette classe

Page 29: Conception Orientée Objet

Types et Virtuelles

• Les langages orientés objet modernes permettent de spécifier des fonctions virtuelles.

• Une classe déclarant des méthodes virtuelles est communément appelée un type.

• En effet, la présence de ces virtuelles oblige à réaliser partiellement le type abstrait

Page 30: Conception Orientée Objet

Nécessité de réaliser le type abstrait

• Une classe décrit essentiellement un prototype des objets de cette classe, et les méthodes applicables aux objets de cette classe.

• Pour des raisons techniques l'implantation des fonctions virtuelles par les langages orientés objet nécessite que certaines classes engendrent une structure de données permettant de stocker des pointeurs vers des méthodes de la classe.

Page 31: Conception Orientée Objet

Table de virtuelles

• La table de virtuelles "concrétise" la classe

Page 32: Conception Orientée Objet

C++/Java

• C++ demande de déclarer les fonctions virtuelles

• Toutes les méthodes sont virtuelles en Java.

• En Java, le type est réalisé de telle sorte que chaque objet comporte un pointeur vers une représentation « consultable » de sa classe.

Page 33: Conception Orientée Objet

Variations autour des classes

• tout objet peut servir de prototype à la construction d'un autre objet (Javascript)

• tous les types de données sont des objets (en Smalltalk, même un caractère est un objet, qui communique par envoi de messages avec ses voisins)

• l'objet classe peut contenir des informations partagées par toutes les instances de la classe (cela existe en Java, et partiellement en C++)

• une classe est elle même un objet, instance d'une métaclasse, …

Page 34: Conception Orientée Objet

Objets et Classification

• La pensée occidentale développe un modèle du monde par lequel les propriétés des objets découlent logiquement de la place qu'ils occupent dans une classification.

• La pertinence de la classification est mesurée par le faible nombre d'exceptions qu'elle engendre.

• Ce modèle s'intéresse avant tout aux propriétés des objets (appelées propositions en logique) plus qu'à leurs éventuelles relations.

Page 35: Conception Orientée Objet

Exemple

• Par exemple : si on sait qu'un "objet" est un mammifère, on sait alors qu'il allaite ses petits et qu'il ne vole pas (en général).

• Une classification des concepts nous indique également que tous les mammifères, et tous les oiseaux, sont des animaux.

Page 36: Conception Orientée Objet

Vision logique de la classe

• Les règles "A" sont descriptives de la classe

• Les règles "B" sont des règles d'héritage

Page 37: Conception Orientée Objet

Exemple de hiérarchie

Page 38: Conception Orientée Objet

Principes d'utilisation de l'héritage

Page 39: Conception Orientée Objet

B hérite de, ou possède un A

Page 40: Conception Orientée Objet

Une difficulté

• Lorsque B hérite de A, la structure de données décrite par A sera présente d'office dans toute structure de type B.

• La relation d'héritage de classes présente donc un caractère incrémental qui peut être utilisé comme une facilité d'écriture.

• (Définissant B comme héritant de A, on réalise l'économie de la description de A dans B, au prix peut être de quelques retouches permises par le langage).

Page 41: Conception Orientée Objet

Mauvais exemples

« NON PAS ENCORE EUX »• Faire en sorte que la classe "Cercle" hérite de

"Point" – le cercle réutilise le point par héritage, en tant que

centre

• Faire en sorte que la classe "Ellipse" hérite de "Cercle" – ellipse réutilise le diamètre comme un de ses demi-axes

Page 42: Conception Orientée Objet

Point et Cercle

• Un point peut être vu comme un cercle dégénéré de diamètre nul. La seule relation logique qui peut unir ces deux classes est Point => Cercle.– Dans ce cas, toutes les instances de Point, si

elles héritent de Cercle, vont comporter un champ appelé "diamètre" qui leur est inutile.

• La bonne approche est peut être de ne pas considérer d'héritage entre les deux classes.

Page 43: Conception Orientée Objet

Principe Général

• S'il est possible de dire que "tout A est un B", alors

• B ne doit pas hériter de A, et

• A peut, le cas échéant, hériter de B.

Page 44: Conception Orientée Objet

Principe pour les données membres

• S'il est possible de dire que tout A peut posséder un B, ou

• S'il est vrai que tout A possède un B, alors

• B est une donnée de A

Page 45: Conception Orientée Objet

Héritage pour extension

• On ajoute des données membres.

• Cette situation est toujours présente quand on implante une interface ou une classe abstraite

Page 46: Conception Orientée Objet

Héritage pour spécialisation

• On restreint les domaines des attributs de la classes

• On durcit les invariants de classe (intégrité)

Page 47: Conception Orientée Objet

Héritage pour surcharge

• On substitue le code d'une fonction par une autre, en application du polymorphisme

Page 48: Conception Orientée Objet

Héritage pour réutilisation pure

• On l’appelle aussi héritage privé

• On réutilise le code de la classe mais pas son interface de programmation

Page 49: Conception Orientée Objet

Champs, accesseurs et aspects

Page 50: Conception Orientée Objet

Masquage de données

• Un programme ne doit pas exposer les données membres de ses classes.

• Cette information peut varier au cours des évolutions de la classe et ne doit pas être divulguée

• Exemple, une classe « Liste » n’expose pas les détails de son implantation (« Elem »)

Page 51: Conception Orientée Objet

Champs, accesseurs, modifieurs

• Un champ (ou attribut, propriété, donnée membre) est PRIVE

• Accesseur : fonction permettant de lire la valeur d'un champ

• Modifieur : fonction permettant d'altérer l'état de l'objet

Page 52: Conception Orientée Objet

Conventions de nommage

• Si une classe possède une propriété Xy

• L'attribut (privé) est nommé "_xy"• L'accesseur (non Booleén) est "getXy()"• L'accesseur (Booléen) est "isXy()"• Le modifieur est nommé "setXy(...) »

• Ces conventions sont celles des Java Beans

Page 53: Conception Orientée Objet

Exemple

Page 54: Conception Orientée Objet

Aspects

• D'autres langages plus évolués (plus anciens) règlent le problème du masquage de l'information d'une autre façon:

• Deux fonctions, les aspects de lecture et d'écriture, sont attachées potentiellement à chaque attribut.

• Si elles sont présentes, elles sont appelées automatiquement de façon invisible à chaque lecture/écriture

Page 55: Conception Orientée Objet

Aspects, lvalue, rvalue

• Ainsi , faire référence à « a » en situation lvalue (écriture) peut appeler l’aspect correspondant de façon invisible

• Faire référence à « a » en situation rvalue (lecture) peut appeler l’aspect de lecture de façon invisible

Page 56: Conception Orientée Objet

Compatibilité ascendante

• Un argument fort pour le masquage:

• Toutes les versions futures d'une classe devront pouvoir être utilisées pour compiler des programmes clients anciens.

• Les structure de données techniques supportant les algorithmes doivent donc être cachés

Page 57: Conception Orientée Objet

Exemple d'évolution

Page 58: Conception Orientée Objet

Exemple de divergence

Page 59: Conception Orientée Objet

Principes de Conception par Contrat

Page 60: Conception Orientée Objet

Conception par contrat

• Principe fondamental de conception par contrat (Bertrand Meyer)

• La spécification des invariants de classe et des pré et post conditions est préalable au codage proprement dit.

Page 61: Conception Orientée Objet

Conception par contrat et Tests

• La conception des interfaces de programmation doit se faire dans son ensemble avant de programmer.

• L’écriture des programmes de tests doit se faire avant l’implantation concrète des méthodes

• Les programmes de tests peuvent être compilés, même s’ils ne s’exécutent pas

Page 62: Conception Orientée Objet

Le principe Open/Closed

La vision moderne de ce principe énoncé par Meyer est la suivante:

L'interface de programmation d'une classe est:

• Open = ouverte aux extensions– ajout de fonctions membres

• Closed = fermée aux modifications– pas de relâchement de l'invariant de classe ni durcissement des

préconditions, respect du principe de substitution de Liskov

Ce principe est subsumé par les considérations précédentes

Page 63: Conception Orientée Objet

Principe de substitution de Liskov

• Une instance d'une classe peut être substituée par une instance d'une sous classe sans que:– la compilation ne soit altérée

– le programme ne soit altéré dans son comportement.

• Toutes les clauses du contrat satisfaites par les superclasses sont satisfaites par les sous classes

Page 64: Conception Orientée Objet

Impact sur les invariants de classe

Les invariants de classe sont vérifiés par toutes leurs sous classes

class A{int integrity(){...};

};class B : public A {

int integrity(){assert(A::integrity());...

}

Page 65: Conception Orientée Objet

Impact sur les préconditions

Les préconditions des fonctions membres ne peuvent pas être durcies par les sous classes

• Sinon, une fonction appelant la fonction abstraite pourrait provoquer un échec avec une instance d’une future sous classe (inconnue au moment présent)

Page 66: Conception Orientée Objet

Ce principe doit être modulé

• Liskov rend très difficile dans certains cas d’utiliser des classes concrètes ayant des sous classes

• Lorsqu’une sous classe réalise un sous ensemble clairement identifié de la classe, et que son implantation offre pour services de contrôler l’appartenance à cet ensemble, on peut contredire le principe de substitution

Page 67: Conception Orientée Objet

Exemple de Cercle et Ellipse

• On a vu la possibilité de définir conceptuellement Cercle comme une sous classe de Ellipse. Dans une interface graphique se pose la question du re-dimensionnement:

• La fonction resize(float x, float y) demande un traitement particulier.

• Il ne devrait pas être possible en vertu du principe de substitution de durcir la précondition dans Cercle pour avoir "x==y"

• Que fait on?

Page 68: Conception Orientée Objet

Ellipse et Cercle (2)

• Choix A/ on respecte le principe de substitution, éventuellement en dégradant arbitrairement la fonctionnalité

void Cercle::resize(float x, float y){ assert(integrity());// demi-axes égauxfloat aux = min(x,y); // on pourra dessiner le cercle dans la boiteEllipse::resize(aux,aux);assert(integrity());//_x==_y

}

Page 69: Conception Orientée Objet

Ellipse et Cercle (3)

• Choix B/ on ne respecte pas le principe de substitution. – L’argument est que si un programmeur avait

voulu utiliser le concept de cercle sans disposer de la classe, il l’aurait exclu des cas d’utilisation de la fonction « resize » générale.

Page 70: Conception Orientée Objet

Ellipse et Cercle (4)

void Cercle::resize(float x, float y){ assert(integrity());// demi-axes égaux assert(x==y);// contredit LiskovEllipse::resize(aux,aux);assert(integrity());//_x==_y

}

Page 71: Conception Orientée Objet

Ellipse et Cercle (5)

• Choix B/ on ne respecte pas le principe de substitution et on interdit l’accès à la fonction d’origine

#define NOT_CALLABLE false

void Cercle::resize(float x, float y){ assert(NOT_CALLABLE );// appel impossible

} void Cercle::resize(float x){

assert(integrity()); // demi-axes égaux Ellipse::resize(x,x);assert(integrity());

}

Page 72: Conception Orientée Objet

Impact sur les post conditions

Les post conditions ne peuvent pas être assouplies par les sous classes

• Sinon, les données retournées, ou l'état de l'objet, pourraient ne plus satisfaire les conditions du programme appelant après substitution

• Cette situation n’est pas fréquemment rencontrée, car la principale postcondition est l’invariant de classe, qui est nécessairement satisfait

Page 73: Conception Orientée Objet

Principe de Couplage Faible

• Les composants logiciels (classes) distincts sont le plus indépendant(e)s possibles.– en termes de connexions– en termes de création mutuelle

• On vise ainsi à permettre une maintenance facile du code. L’évolution d’une classe n’a que peu d’impact sur ses voisines

Page 74: Conception Orientée Objet

Principe de Cohésion Forte

• Les éléments associés au sein d'une classe ou d’un package (groupe de classes) sont fortement liés

• L’intérêt de les avoir groupés est justifié• Toutes les données membres sont toujours (ou

presque) utilisées• Si ce n'est pas le cas, il convient de les séparer

dans des classes distinctes (exemple des itérateurs)

Page 75: Conception Orientée Objet

Couplage/Cohésion vs. Héritage

• Dans une classe B qui étend A par héritage, les attributs introduits par B sont – toujours utilisés (cohésion forte) mais ils sont – le plus possible indépendants de ceux qui sont

hérités (couplage faible):

• leurs états n’influent pas ou peu sur l’état du A qui est dans B

Page 76: Conception Orientée Objet

Principe d’Etat logique/physique

• Tout modifieur d'une classe altère son état physique ET son état logique

• Les modifieurs sont de vrais modifieurs:

• leur appel modifie les données membre de l'objet d'une manière qui altère la sémantique attachée à l'objet.

• Exemple : insertion dans la liste

Page 77: Conception Orientée Objet

La liste: Etat Logique

Liste

Elem Elem Elem

Liste

Elem Elem Elem

Elem

Page 78: Conception Orientée Objet

La liste: Etat Physique

Liste

Elem Elem Elem

Liste

Elem Elem Elem

Page 79: Conception Orientée Objet

Que faire sinon?

• Si un modifieur altère l'état physique (les données) sans agir sur l'état logique, c'est le signe que la classe doit être divisée.

• Exemple des itérateurs

Page 80: Conception Orientée Objet

List -> ListIterator

Class List {Elem* first;Elem* current;…};

Class List { Elem* first; …};

Class Iterator{ Elem* current;};

Page 81: Conception Orientée Objet

Masquage de données

Les détails d'implantation d'une classe doivent être cachés aux utilisateurs

• données membres, classes auxiliaires, fonctions privées

• On vise ainsi à empêcher que des programmes accèdent à des éléments non pérennes (compatibilité ascendante) et également risquent de compromettre les données

Page 82: Conception Orientée Objet

Conception des interfaces de programmation

Page 83: Conception Orientée Objet

Le problème

• Pour garantir une bonne compréhension collective des sources développés, il est préférable de renvoyer à des notions très communément partagées.

• Le développement du logiciel open source a multiplié les besoins de normalisation des interfaces de programmation

• Ex en Java : notion de Bean

Page 84: Conception Orientée Objet

L'objet vu comme une machine.

• Cette métaphore guide la définition des interfaces de programmation.

• On voit une machine, et on observe son état sans agir sur elle

• On agit sur une machine, sans nécessairement observer son état

Page 85: Conception Orientée Objet

Le capteur informatique

• Une fonction dont la valeur de retour est une information sur l'état de l'objet ne doit sous aucun prétexte modifier l'état de l'objet.

• Une telle fonction est appelée un accesseur.

Page 86: Conception Orientée Objet

Signature des accesseurs en C++

data accesseur_i (args) const {…}

• Le mot clef "const" garantit que la fonction est sans effet sur l'objet support

• Le cas échéant, garantir qu'elle soit également sans effet sur des objets connectés caractéristiques d'un état demande de la rigueur de programmation

Page 87: Conception Orientée Objet

Le bouton de commande

• Lorsqu'on désire modifier l'état d'un objet, on le fait au travers d'une procédure.

• La règle ici est qu'une telle procédure ne peut en aucun cas renvoyer une valeur décrivant l'état de l'objet après, ou pire encore, avant la modification.

• On appelle une telle fonction un modifieur.

Page 88: Conception Orientée Objet

Signature des modifieurs en C++

void modifieur _i (args) {…}

• "void" garantit que la fonction ne renvoie pas d'information sur l'état de l'objet.

Page 89: Conception Orientée Objet

Identification des modifieurs

• Une fonction est un modifieur s'il existe des situations où un accesseur change de valeur de retour après son appel.

Page 90: Conception Orientée Objet

Pourquoi être strict

• Exemple de C (et C++)

i++ + i++

• n'est pas équivalent à

2*i++

Page 91: Conception Orientée Objet

Un accesseur/modifieur présente le même défaut

• Supposons qu'une fonction d'accès présente un effet de bord.

E1 = (p->value() + p->value())

• sera différent de

E2 = (2 * p->value())

Page 92: Conception Orientée Objet

Avantages des modifieurs "void"

• Absence des risques évoqués précédemment • Le calcul d'un état coûte potentiellement des

ressources• Les appels de modifieurs sont fréquemment faits

en ignorant la valeur de retour• Le calcul de cette valeur est alors fait inutilement

– (exemple de char* strcpy(char*) en C) • Il doit exister un accesseur retournant l'état• On ne pourra pas retirer le calcul de la valeur de

retour, et les interfaces sont "fermées".

Page 93: Conception Orientée Objet

Les modifieurs retournant "this"

• Il est souvent utile toutefois de faire en sorte que les modifieurs retournent leur objet support

• Cela permet d'enchaîner des cascades d'appels, et justement de faire suivre le modifieur de l'accesseur voulu...

Container c;

c.modif_f(params).modif_g(params).accesseur_h();

Page 94: Conception Orientée Objet

On veut quand même retourner un état

• Exemple :

Page 95: Conception Orientée Objet

Conversions implicites en C++

• En C++, on peut avoir des modifieurs "this" et toutefois donner accès à l'état de l'objet

Page 96: Conception Orientée Objet

La variante create/end• Lorsqu’une fonction crée un objet, il est parfois utile de

retourner celui ci, sinon thiscreateSubState("saveOrPrint"). //{ createReq(ex, "bg", Color.RED). createSubRegion("Print"). //{ createRootState("default"). //{ createReqCallback(pr, …). createSubState("print"). //{ createReq(pr, "on", false). createReq(fr, "Visible", true). endSubState("print"). //} endRootState("default"). //} endSubRegion(). //}endSubState("saveOrPrint"). //}

Page 97: Conception Orientée Objet

Cas particulier des opérateurs

• Les opérateurs redéfinis en C++ sont souvent des modifieurs/accesseurs, dans la mesure où ils participent à des expressions complexes.

• L'usage fait que leur "danger" d'utilisation est connu (ex. de "++")

Page 98: Conception Orientée Objet

Fonctions d'usage

• Les accesseurs "const" et modifieurs "void" ou "this" forment le squelette des interfaces de programmation. Doit en s'en contenter? NON.

• Une API peut mettre à disposition une collection de fonctions d'usage qui combinent si besoin est modifieurs et accesseurs

• Les opérateurs en font partie.

Page 99: Conception Orientée Objet

Interfaces de programmation

Page 100: Conception Orientée Objet

Types de classes

Page 101: Conception Orientée Objet

Héritage

• Classe abstraite

• Classe concrète

• Classe "nœud"

Page 102: Conception Orientée Objet

Fonctionnalités

• Classe de service– par exemple l'interface "displayable"

• Classes de définition d'interfaces abstraites– l'abstraction Pile par exemple

• Les classes poignée

• Les classes "type de base" vérifié

Page 103: Conception Orientée Objet

Poignées

Page 104: Conception Orientée Objet

Interfaces abstraites

Page 105: Conception Orientée Objet

Fin du document

• Des questions?