Conception Orientée Objet

  • Published on
    24-Jan-2016

  • View
    27

  • Download
    0

Embed Size (px)

DESCRIPTION

Conception Oriente Objet. Laurent Henocque http://laurent.henocque.free.fr/ Enseignant Chercheur ESIL/INFO France http://laurent.henocque.perso.esil.univmed.fr/ mis jour en Dcembre 2008. Licence Creative Commons. - PowerPoint PPT Presentation

Transcript

<ul><li><p>Conception Oriente ObjetLaurent Henocquehttp://laurent.henocque.free.fr/Enseignant Chercheur ESIL/INFO Francehttp://laurent.henocque.perso.esil.univmed.fr/mis jour en Dcembre 2008</p></li><li><p>Licence Creative CommonsCette cration est mise disposition selon le Contrat Paternit-Partage des Conditions Initiales l'Identique 2.0 France disponible en ligne </p><p>http://creativecommons.org/licenses/by-sa/2.0/fr/ </p><p>ou par courrier postal Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.</p></li><li><p>ObjectifsDonner une comprhension des enjeux de la conception oriente objet, et des connaissances actuelles sur le sujet</p></li><li><p>PlanPanorama du concept d'objet en InformatiquePrincipes gnraux de dtermination des classesPrincipes de l'utilisation des objetsA propos de rutilisabilitConception des interfaces de programmation en C++Types de classes</p></li><li><p>Panorama du concept d'objet</p></li><li><p>Un modle de la ralitles mmes ractions que la ralit reprsente,la mme modularit que le monde rel. </p></li><li><p>Modle de la ralit (2)Chaque objet se comporte "comme" son homologue rel en termes de : </p><p>persistance de son tatractions aux perturbations externescommunication avec les autres objets</p></li><li><p>PersistanceLa persistance dun tat est obtenue de faon lmentaire : par stockage de donnes pertinentes dans une structure (les types struct en C et record en Pascal). La structure est donc l'lment fondamental dans la reprsentation informatique de l'objet : un espace clos et contigu o figurent toutes les informations relatives un objet. </p></li><li><p>Encapsulation des donnesLa dmarche consistant dcrire un tel espace est nomme encapsulation des donnes.Une structure est galement dcrite comme un agrgat de donnes htrognes. Le type tableau au contraire constitue un agrgat de donnes dun mme type (homogne).</p></li><li><p>Ractions</p><p>La raction aux perturbations externes est simule par des fonctions que l'on peut appliquer l'objet. </p><p>Message -&gt; fonctionEvnement -&gt; fonction</p></li><li><p>DifficultsL'existence chez diffrents objets de fonctionnalits smantiquement voisines, et pour autant diffrentes dans leur ralisation justifie le polymorphismeLe nommage des fonctions globales ncessite de donner des noms diffrents des fonctions homologues, et donc multiplier dans un programme le nombre des symboles. </p></li><li><p>DifficultsLes fonctions globales ne permettent pas avec une grande finesse le contrle d'ventuelles restrictions au graphe d'appel du programme. Lorganisation en classe permet de finement dfinir les autorisations (public/protected/private)</p></li><li><p>PolymorphismeOn accepte de donner le mme nom des fonctions dont les arguments diffrent. Ainsi, un programmeur peut utiliser un nom unique pour l'associer un concept d'opration unique, utilisable dans diffrents contextes</p></li><li><p>Avantages du polymorphismeLes programmes gagnent en abstractionIl n'est pas ncessaire de dfinir une rgle de nommage des fonctions homologues (par exemple "bouge_caillou", ou bien "CaillouBouge"). L'criture des programmes est facilite.</p></li><li><p>Encapsulation de fonctionsDans ce modle, sont associes logiquement la structure (de donnes) reprsentant un objet les seules fonctions qui simulent (ou implantent) des ractions de cet objet au monde extrieur. Ces fonctions sont alors appeles des mthodes. La dclaration d'une mthode omet la mention du paramtre dsignant l'objet auquel elle s'applique, appel support</p></li><li><p>Oprations et MthodesPar dfinition, toutes les mthodes de mme nom constituent des implantations appropries du mme concept, qui porte le nom d' opration.Chaque mthode d'une classe implante une opration donne pour cette classe</p></li><li><p>Polymorphisme et mthodesAucun langage de programmation ne permet de distinguer deux fonctions par le seul type de leur valeur de retour.</p></li><li><p>ObjetsUne structure qui encapsule la fois des donnes et des mthodes est appele un objet. A ce titre, certaines bases de donnes dites "objet" n'en mritent pas le nom puisqu'elles ne sont qu'orientes "structure". Notons que le terme d'objet est dfini sans qu'il ne soit question d'hritage.</p></li><li><p>Communication L'envoi d'un message d'un objet un autre suppose qu'une mthode du premier appelle une mthode du deuxime. Dans le cas "synchrone", la rponse est fournie par la valeur de retour de la fonction appeleDans le cas asynchrone, le rponse est fournie par un message en retour: la mthode appelante peut terminer avant que la rponse ne parvienne</p></li><li><p>Messages / MthodesL'encapsulation permet de contrler les possibilits de communications inter objets,L'appel rciproque et rcursif de mthodes entre deux (ou plus) objets dans le cas asynchrone peut conduire des situations de bouclage, qui ne seraient pas apparues dans le cas synchrone</p></li><li><p>Classes et Types</p></li><li><p>La Classe (1)On veut crer un nombre arbitraire dobjetsLa partie "structure" de l'objet, contenant ses donnes, doit tre duplique pour chaque objet de mme type. Par contre, les mthodes de ces objets ne ncessitent pas d'tre dcrites plusieurs fois. </p></li><li><p>La Classe (2)On distingue donc entre la ralisation particulire d'un objet, une instance, et l'ensemble des informations ncessaires pour construire et "animer" ces instances : leur classe. </p></li><li><p>PrototypesLe modle utilis pour gnrer pour chaque objet une structure physique de donnes est appel le prototype.On peut donc parler de classe sans qu'il ne soit question d'hritage.</p></li><li><p>Types abstraitsLe concept de type abstrait est introduit pour la spcification de systmes. 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. </p></li><li><p>Types Abstraits et PreuveToutes les proprits des instances dun type abstrait sont dmontrables comme on dmontre un thorme. Une telle description spcifie donc sans ambigut la smantique dun ensemble dobjets, indpendamment des perspectives de sa ralisation informatique.</p></li><li><p>des Types abstraits aux langages Le type abstrait est un modle formel des objets qu'il dcrit, et peut tre appel une classe. Cette classe comporte assez d'informations pour gnrer un prototype. Les transitions correspondent des fonctions membres qui modifient les instances.Mais elle ne possde pas de ralisation physique en soi. Elle n'est qu'un cadre gnral de ralisation.C'est l'approche des langages comme C++ et Simula</p></li><li><p>Type = Classe + Invariant ?Une classe dcrit ses transitions de manire implicite : les fonctions membres qui provoquent des changements dtat.Les tats admissibles peuvent tre spcifis de manire semi-formelle par un invariant de classeCet invariant ralise par un test les axiomes applicables aux objets de cette classe</p></li><li><p>Types et VirtuellesLes langages orients objet modernes permettent de spcifier des fonctions virtuelles. Une classe dclarant des mthodes virtuelles est communment appele un type.En effet, la prsence de ces virtuelles oblige raliser partiellement le type abstrait</p></li><li><p>Ncessit de raliser le type abstraitUne classe dcrit essentiellement un prototype des objets de cette classe, et les mthodes applicables aux objets de cette classe. Pour des raisons techniques l'implantation des fonctions virtuelles par les langages orients objet ncessite que certaines classes engendrent une structure de donnes permettant de stocker des pointeurs vers des mthodes de la classe. </p></li><li><p>Table de virtuellesLa table de virtuelles "concrtise" la classe</p></li><li><p>C++/JavaC++ demande de dclarer les fonctions virtuelles</p><p>Toutes les mthodes sont virtuelles en Java.</p><p>En Java, le type est ralis de telle sorte que chaque objet comporte un pointeur vers une reprsentation consultable de sa classe.</p></li><li><p>Variations autour des classestout objet peut servir de prototype la construction d'un autre objet (Javascript)tous les types de donnes sont des objets (en Smalltalk, mme un caractre est un objet, qui communique par envoi de messages avec ses voisins)l'objet classe peut contenir des informations partages par toutes les instances de la classe (cela existe en Java, et partiellement en C++)une classe est elle mme un objet, instance d'une mtaclasse, </p></li><li><p>Objets et Classification La pense occidentale dveloppe un modle du monde par lequel les proprits des objets dcoulent logiquement de la place qu'ils occupent dans une classification.La pertinence de la classification est mesure par le faible nombre d'exceptions qu'elle engendre. Ce modle s'intresse avant tout aux proprits des objets (appeles propositions en logique) plus qu' leurs ventuelles relations. </p></li><li><p>ExemplePar exemple : si on sait qu'un "objet" est un mammifre, on sait alors qu'il allaite ses petits et qu'il ne vole pas (en gnral). </p><p>Une classification des concepts nous indique galement que tous les mammifres, et tous les oiseaux, sont des animaux. </p></li><li><p>Vision logique de la classeLes rgles "A" sont descriptives de la classeLes rgles "B" sont des rgles d'hritage</p></li><li><p>Exemple de hirarchie</p></li><li><p>Principes d'utilisation de l'hritage</p></li><li><p>B hrite de, ou possde un A</p></li><li><p>Une difficultLorsque B hrite de A, la structure de donnes dcrite par A sera prsente d'office dans toute structure de type B. </p><p>La relation d'hritage de classes prsente donc un caractre incrmental qui peut tre utilis comme une facilit d'criture. </p><p>(Dfinissant B comme hritant de A, on ralise l'conomie de la description de A dans B, au prix peut tre de quelques retouches permises par le langage).</p></li><li><p>Mauvais exemplesNON PAS ENCORE EUXFaire en sorte que la classe "Cercle" hrite de "Point" le cercle rutilise le point par hritage, en tant que centreFaire en sorte que la classe "Ellipse" hrite de "Cercle" ellipse rutilise le diamtre comme un de ses demi-axes</p></li><li><p>Point et CercleUn point peut tre vu comme un cercle dgnr de diamtre nul. La seule relation logique qui peut unir ces deux classes est Point=&gt;Cercle.Dans ce cas, toutes les instances de Point, si elles hritent de Cercle, vont comporter un champ appel "diamtre" qui leur est inutile. La bonne approche est peut tre de ne pas considrer d'hritage entre les deux classes.</p></li><li><p>Principe GnralS'il est possible de dire que "tout A est un B", alors </p><p>B ne doit pas hriter de A, et </p><p>A peut, le cas chant, hriter de B.</p></li><li><p>Principe pour les donnes membresS'il est possible de dire que tout A peut possder un B, ou S'il est vrai que tout A possde un B, alors</p><p>B est une donne de A</p></li><li><p>Hritage pour extension</p><p>On ajoute des donnes membres. </p><p>Cette situation est toujours prsente quand on implante une interface ou une classe abstraite</p></li><li><p>Hritage pour spcialisation</p><p>On restreint les domaines des attributs de la classes</p><p>On durcit les invariants de classe (intgrit) </p></li><li><p>Hritage pour surchargeOn substitue le code d'une fonction par une autre, en application du polymorphisme</p></li><li><p>Hritage pour rutilisation pureOn lappelle aussi hritage priv</p><p>On rutilise le code de la classe mais pas son interface de programmation</p></li><li><p>Champs, accesseurs et aspects </p></li><li><p>Masquage de donnesUn programme ne doit pas exposer les donnes membres de ses classes.Cette information peut varier au cours des volutions de la classe et ne doit pas tre divulgueExemple, une classe Liste nexpose pas les dtails de son implantation (Elem)</p></li><li><p>Champs, accesseurs, modifieursUn champ (ou attribut, proprit, donne membre) est PRIVEAccesseur : fonction permettant de lire la valeur d'un champModifieur : fonction permettant d'altrer l'tat de l'objet</p></li><li><p>Conventions de nommageSi une classe possde une proprit Xy</p><p>L'attribut (priv) est nomm "_xy"L'accesseur (non Boolen) est "getXy()"L'accesseur (Boolen) est "isXy()"Le modifieur est nomm "setXy(...)</p><p>Ces conventions sont celles des Java Beans</p></li><li><p>Exemple</p></li><li><p>AspectsD'autres langages plus volus (plus anciens) rglent le problme du masquage de l'information d'une autre faon:Deux fonctions, les aspects de lecture et d'criture, sont attaches potentiellement chaque attribut. Si elles sont prsentes, elles sont appeles automatiquement de faon invisible chaque lecture/criture</p></li><li><p>Aspects, lvalue, rvalueAinsi , faire rfrence a en situation lvalue (criture) peut appeler laspect correspondant de faon invisible</p><p>Faire rfrence a en situation rvalue (lecture) peut appeler laspect de lecture de faon invisible</p></li><li><p>Compatibilit ascendanteUn argument fort pour le masquage:</p><p>Toutes les versions futures d'une classe devront pouvoir tre utilises pour compiler des programmes clients anciens. </p><p>Les structure de donnes techniques supportant les algorithmes doivent donc tre cachs</p></li><li><p>Exemple d'volution</p></li><li><p>Exemple de divergence</p></li><li><p>Principes de Conception par Contrat</p></li><li><p>Conception par contratPrincipe fondamental de conception par contrat (Bertrand Meyer)</p><p>La spcification des invariants de classe et des pr et post conditions est pralable au codage proprement dit.</p></li><li><p>Conception par contrat et TestsLa conception des interfaces de programmation doit se faire dans son ensemble avant de programmer.</p><p>Lcriture des programmes de tests doit se faire avant limplantation concrte des mthodes</p><p>Les programmes de tests peuvent tre compils, mme sils ne sexcutent pas</p></li><li><p>Le principe Open/ClosedLa vision moderne de ce principe nonc par Meyer est la suivante: L'interface de programmation d'une classe est: Open = ouverte aux extensionsajout de fonctions membresClosed = ferme aux modificationspas de relchement de l'invariant de classe ni durcissement des prconditions, respect du principe de substitution de Liskov</p><p>Ce principe est subsum par les considrations prcdentes</p></li><li><p>Principe de substitution de LiskovUne instance d'une classe peut tre substitue par une instance d'une sous classe sans que:la compilation ne soit altrele programme ne soit altr dans son comportement.</p><p>Toutes les clauses du contrat satisfaites par les superclasses sont satisfaites par les sous classes</p></li><li><p>Impact sur les invariants de classeLes invariants de classe sont vrifis par toutes leurs sous classes</p><p>class A{int integrity(){...};};class B : public A {int integrity(){assert(A::integrity());...}</p></li><li><p>Impact sur les prconditionsLes prconditions des fonctions membres ne peuvent pas tre durcies par les sous classes</p><p>Sinon, une fonction appelant la fonction abstraite pourrait provoquer un chec avec une instance dune future sous classe (inconnue au moment prsent)</p></li><li><p>Ce principe doit tre modulLiskov rend trs difficile dans certains cas dutiliser des classes concrtes ayant des sous classesLorsquune sous classe ralise un sous ensemble clairement identifi de la classe, et que son implantation offre pour services de contrler lappartenance cet ensemble, on peut contredire le principe de substitution </p></li><li><p>Exemple de Cercle et EllipseOn a vu la possibilit de dfinir conceptuellement Cercle comme une sous classe de Ellipse. Dans une interface graphique se pose la question du re-dimensionnement:</p><p>La fonction resize(float x, float y) demande un traitement particulier.</p><p>Il ne devrait pas tre possible en vertu du principe de substitution de durcir la prcondition dans Cercle pour avoir "x==y"</p><p>Que fait on?</p></li><li><p>Ellipse et Cercle (2)Choix A/ on respecte le principe de substitution, ventuellement en dgradant arbitrairement la fonctionnalit</p><p>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}</p></li><li><p>Ellipse et Cercle (3)Choix B/ on ne respecte pas le principe de substitution. Largument est que si un programmeur avait voulu utiliser le concept de ce...</p></li></ul>

Recommended

View more >