e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples...

23
Hugues Bersini 6 e édition La programmation orientée objet Cours et exercices en UML 2, avec Java , C# , C++, Python, PHP et LINQ La programmation orientée objet Cours et exercices en UML 2 avec Java, C#, C++, Python, PHP et LINQ 6 e édition © Groupe Eyrolles, 2002, 2004, 2007, 2009, 2011 et 2013 pour la pr sente dition, ISBN : 978-2-212-13578-7

Transcript of e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples...

Page 1: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Le manuel indispensable à tout étudiant en informatique (IUT, écoles spécialisées, écolesd'ingénieurs) sur la programmation orientée objet !

L’objet par la pratique avec Python, Java, C# et C++ et PHP 5… en UML 2Cette sixième édition de l’ouvrage L’orienté objet décortique l’ensemble des mécanismes de la programma-tion objet (classes et objets, interactions entre classes, envois de messages, encapsulation, héritage, poly-morphisme, interface, multithreading, sauvegarde des objets, programmation distribuée, modélisation...) enles illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5,UML 2, LINQ mais aussi les services web, Corba, les bases de données objet, différentes manières de résoudrela mise en correspondance relationnel/objet dont le langage innovant de requête objet LinQ et enfin les desi-gn patterns. Chaque chapitre est introduit par un dialogue vivant, à la manière du maître et de l’élève, et secomplète de nombreux exercices en UML 2, Java, Python, PHP 5, C# et C++.

À qui s’adresse ce livre ?• Ce livre sera lu avec profit par tous les étudiants de disciplines informatiques liées à l’approche objet (pro-grammation orientée objet, modélisation UML, Java, Python, PHP 5, C#/C++...) et pourra être utilisé par leursenseignants comme matériel de cours.

• Il est également destiné à tous les développeurs qui souhaitent approfondir leur compréhension desconcepts objet sous-jacents au langage qu’ils utilisent.

Au sommairePrincipes de base : quel objet pour l’informatique • Un objet sans classe... n’a pas de classe • Du faire-savoir au savoir-faire... du procédural à l’OO • Ici Londres : les objets parlent aux objets • Collaborationentre classes • Méthodes ou messages ? • L’encapsulation des attributs • Les classes et leur jardinsecret • Vie et mort des objets • UML 2 • Héritage • Redéfinition des méthodes • Abstraite, cette clas-se est sans objet • Clonage, comparaison et assignation d’objets • Interfaces • Distribution gratuited’objets : pour services rendus sur le réseau • Multithreading • Programmation événementielle •Persistance d’objets • Et si on faisait un petit flipper ? • Les graphes • Petite chimie et biologie OOamusante • Design patterns.

Le code source des exercices et leurs corrections sont fournis sur le site d’accompagnementwww.editions-eyrolles.com.

H. B

ersi

ni

Hugues Bersini Membre de l’Académie Royale de Belgique, ingénieur physicien, directeur du Laboratoire d’in-telligence artificielle de l’Université libre de Bruxelles, Hugues Bersini enseigne l’informa-tique et la programmation aux facultés polytechnique et Solvay de cette même université.

Prog

ram

mat

ion

obje

t

Hugues Bersini6 e

édition6e édition6e édition

La programmation

orientéeobjet

Cours et exercices en UML 2,avec Java , C# , C++, Python, PHP et LINQ

La programmation

orientéeobjet

Cours et exercices en UML 2avec Java, C#, C++, Python, PHP et LINQ

6 eédition

Code

édite

ur :

G135

78

ISBN

: 978

-2-2

12-1

3578

-7

36 E

9782212135787

bersini 2013 7/02/13 9:56 Page 1

© Groupe Eyrolles, 2002, 2004, 2007, 2009, 2011 et 2013 pour la prŽ sente Ž dition, ISBN : 978-2-212-13578-7

Page 2: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Aux tout débuts de l’informatique, le fonctionnement interne des processeurs décidait de la seulemanière efficace de programmer un ordinateur. Alors que l’on acceptait tout programme commeune suite logique d’instructions, il était admis que l’organisation du programme et la nature mêmede ces instructions ne pouvaient s’éloigner de la façon dont le processeur les exécutait : pourl’essentiel, des modifications de données mémorisées, des déplacements de ces données d’unemplacement mémoire à un autre, des opérations d’arithmétique et de logique élémentaire, et depossibles ruptures de séquence ou branchements.La mise au point d’algorithmes complexes, dépassant les simples opérations mathématiques et lessimples opérations de stockage et de récupérations de données, obligea les informaticiens à effectuerun premier saut dans l’abstrait, en inventant un style de langage dit procédural, auquel appartiennentles langages Fortran, Cobol, Basic, Pascal, C... Les codes écrits dans ces langages sont devenus indé-pendants des instructions élémentaires propres à chaque type de processeur. Grâce à eux, les informa-ticiens ont pris quelques distances par rapport aux processeurs (en ne travaillant plus directement àpartir des adresses mémoire et en évitant la manipulation directe des instructions élémentaires) et ontélaboré une écriture de programmes plus proche de la manière naturelle de poser et de résoudre lesproblèmes. Il est incontestablement plus simple d’écrire : c = a + b qu’une suite d’instructions tellesque "load a, reg1", "load b, reg2", "add reg3, reg1, reg2", "move c, reg3", ayant pour-tant la même finalité. Une opération de traduction automatique, dite de compilation, se charge detraduire le programme, écrit au départ avec ces nouveaux langages, dans les instructions élémentairesseules comprises par le processeur. La montée en abstraction permise par ces langages de programmation présente un doubleavantage : une facilité d’écriture et de résolution algorithmique, ainsi qu’une indépendance accruepar rapport aux différents types de processeur existant aujourd’hui sur le marché. Le programmeurse trouve libéré des détails d’implémentation machine et peut se concentrer sur la logique du pro-blème et ses voies de résolution.Plus les problèmes à affronter gagnaient en complexité – comptabilité, jeux automatiques, com-préhension et traduction des langues naturelles, aide à la décision, bureautique, conception etenseignement assistés, programmes graphiques, etc. –, plus l’architecture et le fonctionnement desprocesseurs semblaient contraignants. Il devenait vital d’inventer des mécanismes informatiquessimples à mettre en œuvre pour réduire cette complexité et rapprocher encore plus l’écriture deprogrammes des manières humaines de poser et résoudre les problèmes.

Avant-propos

Page 3: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetVI

Avec l’intelligence artificielle, l’informatique s’inspira de notre mode cognitif d’organisation desconnaissances, comme un ensemble d’objets conceptuels entrant dans un réseau de dépendance etse structurant de manière taxonomique. Avec la systémique ou la bioinformatique, l’informatiquenous révéla qu’un ensemble d’agents au fonctionnement élémentaire, mais s’influençant mutuelle-ment, peut produire un comportement émergent d’une surprenante complexité lorsqu’on observele système dans sa globalité. Dès lors, pour comprendre jusqu’à reproduire ce comportement par lebiais informatique, la meilleure approche consiste en une découpe adéquate du système en ses par-ties et une attention limitée au fonctionnement de chacune d’entre elles.Tout cela mis ensemble (la nécessaire distanciation par rapport au fonctionnement du processeur,la volonté de rapprocher la programmation du mode cognitif de résolution de problème, les per-cées de l’intelligence artificielle et de la bio-informatique, le découpage comme voie de simplifica-tion des systèmes apparemment complexes) conduisit graduellement à un deuxième type de lan-gages de programmation, fêtant ses 45 ans d’existence (l’antiquité à l’échelle informatique) : leslangages orientés objet, tels Simula, Smalltalk, C++, Eiffel, Java, C#, Delphi, Power Builder,Python et bien d’autres...

L’orientation objet (OO) en quelques motsÀ la différence de la programmation procédurale, un programme écrit dans un langage objetrépartit l’effort de résolution de problèmes sur un ensemble d’objets collaborant par envoi de mes-sages. Chaque objet se décrit par un ensemble d’attributs (partie statique) et de méthodes portantsur ces attributs (partie dynamique). Certains de ces attributs étant l’adresse des objets avec les-quels les premiers coopèrent, il leur est possible de déléguer certaines des tâches à leurs collabora-teurs. Le tout s’opère en respectant un principe de distribution des responsabilités on ne peut plussimple, chaque objet s’occupant de ses propres attributs. Lorsqu’un objet exige de s’informer sur lesattributs d’un autre ou de les modifier, il charge cet autre de s’acquitter de cette tâche. En effet,chaque objet expose à ses interlocuteurs un mode d’emploi restreint, une carte de visite limitée auxseuls services qu’il est apte à assurer et continuera à rendre dans le temps, malgré de possiblesmodifications dans la réalisation concrète de ces services. Cette programmation est fondamentalement distribuée, modularisée et décentralisée. Pour autantqu’elle respecte également des principes de confinement et d’accès limité (dits d’encapsulation,l’objet n’expose qu’une partie restreinte de ses services), cette répartition modulaire a égalementl’insigne avantage de favoriser la stabilité des développements. En effet, elle restreint au maximumles conséquences de modifications apportées au code au cours du temps : seuls les objets concernéssont modifiés, pas leurs interlocuteurs, même si le comportement de ces derniers dépend indirec-tement des fonctionnalités affectées.Ces améliorations, résultant de la prise de conscience des problèmes posés par l’industrie du logiciel(complexité accrue et stabilité dégradée), ont enrichi la syntaxe des langages objet. Un autre méca-nisme de modularisation inhérent à l’orienté objet est l’héritage, qui permet à la programmation derefléter l’organisation taxonomique de notre connaissance en une hiérarchie de concepts du plus aumoins général. À nouveau, cette organisation modulaire en objets génériques et plus spécialistes est à

Page 4: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Avant-propos VII

l’origine d’une simplification de la programmation, d’une économie d’écriture et de la création dezones de code aux modifications confinées. Tant cet héritage que la répartition des tâches entre lesobjets autorisent une décomposition plus naturelle des problèmes, une réutilisation facilitée des codesdéjà existants (tout module peut se prêter à plusieurs assemblages) et une maintenance facilitée etallégée de ces derniers. L’orientation objet s’impose, non pas comme une panacée universelle, maiscomme une évolution naturelle de la programmation procédurale qui facilite l’écriture de pro-grammes, les rendant plus gérables, plus compréhensibles, plus stables et mieux réexploitables.L’orienté objet inscrit la programmation dans une démarche somme toute très classique pour affronterla complexité de quelque problème qui soit : une découpe naturelle et intuitive en des parties plus sim-ples. A fortiori, cette découpe sera d’autant plus intuitive qu’elle s’inspire de notre manière « cognitive »de découper la réalité qui nous entoure. L’héritage, reflet fidèle de notre organisation cognitive, en est letémoignage le plus éclatant. L’approche procédurale rendait cette découpe moins naturelle, plus« forcée ». Si de nombreux adeptes de la programmation procédurale sont en effet conscients qu’unemanière incontournable de simplifier le développement d’un programme complexe est de le découperphysiquement, ils souffrent de l’absence d’une prise en compte naturelle et syntaxique de cette découpedans les langages de programmation utilisés. Dans un programme imposant, l’OO aide à tracer lespointillés que les ciseaux doivent suivre là où il semble le plus naturel de les tracer : au niveau du cou, desépaules ou de la ceinture, et non pas au niveau des sourcils, des biceps ou des mollets. De surcroît, cettepratique de la programmation incite à cette découpe suivant deux dimensions orthogonales : horizonta-lement, les classes se déléguant mutuellement un ensemble de services, verticalement, les classes héri-tant entre elles d’attributs et de méthodes installés à différents niveaux d’une hiérarchie taxonomique.Pour chacune de ces dimensions, reproduisant fidèlement nos mécanismes cognitifs de conceptualisa-tion, en plus de simplifier l’écriture des codes, il est important de faciliter la récupération de ces partiesdans de nouveaux contextes et d’assurer la robustesse de ces parties aux changements survenus dansd’autres. Un code OO, idéalement, sera aussi simple à créer qu’à maintenir, récupérer et faire évoluer.Il n’est pas pertinent d’opposer le procédural à l’OO car, in fine, toute programmation desméthodes (c’est-à-dire la partie active des classes et des objets) reste totalement tributaire desmécanismes procéduraux. On y rencontre des variables, des arguments, des boucles, des fonctionset leurs paramètres, des instructions conditionnelles, tout ce que l’on trouve classiquement dans lesboîtes à outils procédurales. L’OO vient plutôt compléter le procédural, en lui superposant un sys-tème de découpe plus naturel et facile à mettre en œuvre. Pour preuve, les langages procédurauxcomme le C, Cobol ou, plus récemment, PHP, se sont relativement aisément enrichis d’unecouche dite OO sans que cette addition ne remette sérieusement en question l’existant. Cependant, l’effet de cette couche additionnelle ne se limite pas à quelques structures de données sup-plémentaires afin de mieux organiser les informations manipulées par le programme. Il va bien au-delà. C’est toute une manière de concevoir un programme et la répartition de ses parties fonctionnellesqui est en jeu. Les fonctions et les données ne sont plus d’un seul tenant mais éclatées en un ensemblede modules reprenant chacun à son compte une sous-partie de ces données et les seules fonctions quiles manipulent. Il faut réapprendre à programmer en s’essayant au développement d’une succession demicro-programmes et au couplage soigné et réduit au minimum de ces micro-programmes. En découpant 1 000 lignes de code en 10 modules de 100 lignes, le gain est bien plus que linéaire,car il est extraordinairement plus simple de programmer 100 lignes plutôt que 1 000. En subs-

Page 5: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetVIII

tance, la programmation OO pourrait reprendre à son compte ce slogan altermondialiste : « agirlocalement, penser globalement ». Se pose alors la question de tactique didactique, très controversée dans l’enseignement de l’informa-tique aujourd’hui, sur l’ordre dans lequel enseigner procédural et OO. De nombreux enseignants,soutenus en cela par de très nombreux manuels, considèrent qu’il faut d’abord passer par un enseigne-ment intensif et une maîtrise parfaite du procédural, avant de faire le grand saut vers l’OO. Maisvingt années d’enseignement de la programmation à des étudiants de tous âges et de toutes condi-tions (issus des sciences humaines ou exactes) nous ont convaincus qu’il n’y a aucun ordre à donner.De même qu’historiquement, l’OO est né quasiment en même temps que le procédural et en com-plément de celui-ci, l’OO doit s’enseigner conjointement et en complément du procédural. Il fautenseigner les instructions de contrôle en même temps que la découpe en classes. L’enseignement de laprogrammation doit mélanger à loisir la perception « micro » des mécanismes procéduraux à la vision« macro » de la découpe en objets. Aujourd’hui, tout projet informatique de dimension conséquentedébute par une analyse des différentes classes qui le constituent. Il faut aborder l’enseignement de laprogrammation tout comme débute la prise en charge de ce type de projet, en enseignant au plus vitela manière dont ces classes et les objets qui en résultent opèrent à l’intérieur d’un programme.Ces dernières années, compétition oblige, l’orienté objet s’est trouvé à l’origine d’une explosion detechnologies différentes, mais toutes intégrant à leur manière ses mécanismes de base : classes,objets, envois de messages, héritage, encapsulation, polymorphisme... Ainsi sont apparus de nom-breux langages de programmation proposant des syntaxes dont les différences sont soit purementcosmétiques, soit plus subtiles. Ils sont autant de variations sur les thèmes créés par leurs troisprincipaux précurseurs : Simula, Smalltalk et C++.L’OO a également conduit à repenser trois des chapitres les plus importants de l’informatique deces deux dernières décennies :• tout d’abord, le besoin de développer une méthode de modélisation graphique standardi-

sée débouchant sur un niveau d’abstraction encore supplémentaire (on ne programme plusen écrivant du code mais en dessinant un ensemble de diagrammes, le code étant crééautomatiquement à partir de ceux-ci ; c’est le rôle joué par UML 2) ;

• ensuite, les applications informatiques distribuées (on ne parlera plus d’applications distri-buées mais d’objets distribués, et non plus d’appels distants de procédures mais d’envois demessages à travers le réseau) ;

• enfin, le stockage des données, qui doit maintenant compter avec les objets. Chaque fois, plus qu’un changement de vocabulaire, un changement de mentalité sinon de cultures’impose.

Les grands acteurs de l’orienté objetAujourd’hui, l’OO est omniprésent. Microsoft par exemple, a développé un nouveau langage informa-tique purement objet (C#), a très intensément contribué au développement d’un système d’informa-tique distribuée, basé sur des envois de messages d’ordinateur à ordinateur (les services web) et a plus

Page 6: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Avant-propos IX

récemment proposé un nouveau langage d’interrogation des objets (LINQ), qui s’interface naturelle-ment avec le monde relationnel et le monde XML. Tous les langages informatiques intégrés dans sanouvelle plate-forme de développement, .Net (aux dernières nouvelles, ils seraient 22), visent à uneuniformisation (y compris les nouvelles versions de Visual Basic et Visual C++) en intégrant les mêmesbriques de base de l’OO. Aboutissement considérable s’il en est, il devient très simple de faire commu-niquer ou hériter entre elles des classes écrites dans des langages différents. Plusieurs années auparavant, Sun avait conçu Java, une création déterminante car elle fut à l’originede ce nouvel engouement pour une manière de programmer qui pourtant existait depuis toujours sansque les informaticiens dans leur ensemble en reconnaissent l’utilité ni la pertinence. Depuis, Sun acréé RMI, Jini et sa propre version des services web, tous basés sur les technologies OO. Ces mêmesservices web font l’objet de développements tout autant aboutis chez HP ou IBM. À la croisée deJava et du Web (originellement la raison, sinon du développement de Java, du moins de son succès),on découvre une importante panoplie d’outils de développement et de conception de sites web dyna-miques. Depuis, Java est devenu le langage de prédilection pour de nombreuses applications d’entre-prise et plus récemment pour le développement d’applications tournant sur les smartphones ettablettes dotés du système Android, maintenu par Google. IBM et Borland, avec Rational et Together, menaient la danse en matière d’outils d’analyse dudéveloppement logiciel, avec la mise au point de puissants environnements UML. Chez IBM, laplate-forme logicielle Eclipse est sans doute, à ce jour, une des aventures Open Source les plusabouties en matière d’OO. Comme environnement de développement Java, Eclipse estaujourd’hui le plus prisé et le plus usité et cherche à gagner son pari « d’éclipser » tous les autres.Borland a rendu Together intégrable tant dans Visual Studio.Net que dans Eclipse, comme outilsynchronisant au mieux et au plus la programmation et la réalisation des diagrammes UML. Enfin, l’OMG, organisme de standardisation du monde logiciel, n’a pas pour rien la lettre O commeinitiale. UML et Corba sont ses premières productions : la version OO de l’analyse logicielle et laversion OO de l’informatique distribuée. Cet organisme plaide de plus en plus pour un développe-ment informatique détaché des langages de programmation ainsi que des plates-formes matérielles,par l’utilisation intensive des diagrammes UML. Partant de ces mêmes diagrammes, les codesseraient créés automatiquement dans un langage choisi et en adéquation avec la technologie voulue.Le pari d’UML est osé et encore très largement controversé, mais l’évolution de l’informatique aucours des ans a toujours confié à des mécanismes automatisés le soin de prendre en charge desdétails qui éloignaient le programmeur de sa mission première : penser et résoudre son problème.

Objectifs de l’ouvrageToute pratique économe, fiable et élégante de Java, C++, C#, Python, PHP ou UML requiert,pour débuter, une bonne maîtrise des mécanismes de base de l’OO. Et, pour y pourvoir, rien n’estmieux que d’expérimenter les technologies OO dans ces différentes versions, comme un bon con-ducteur qui se sera frotté à plusieurs types de véhicules, un bon skieur à plusieurs styles de skis etun guitariste à plusieurs modèles de guitares.

Page 7: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetX

Plutôt qu’un voyage en profondeur dans l’un ou l’autre de ces multiples territoires, ce livre vouspropose d’explorer plusieurs d’entre eux, mais en tentant à chaque fois de dévoiler ce qu’ils recèlentde commun. Car ce sont ces ressemblances qui constituent les briques fondamentales de l’OO.Nous pensons que la mise en parallèle de C++, Java, C#, Python, PHP 5 et UML est une voie pri-vilégiée pour l’extraction de ces mécanismes de base.Il nous a paru pour cette raison indispensable de discuter et comparer la façon dont ces cinq langagesde programmation gèrent, par exemple, l’occupation mémoire par les objets, leur manière d’implé-menter le polymorphisme ou la programmation dite « générique », pour en comprendre in fine toute laproblématique et les subtilités indépendamment de l’une ou l’autre implémentation. Ajoutez unecouche d’abstraction, ainsi que le permet UML, et cette compréhension ne pourra que s’en trouverrenforcée. Chacun de ces cinq langages offre des particularités amenant les praticiens de l’un ou l’autreà le prétendre supérieur aux autres : la puissance du C++, la compatibilité Windows et l’intégrationXML de C#, l’anti-Microsoft et le leadership de Java en matière de serveurs d’entreprise, les vertuspédagogiques et l’aspect « scripting » de Python, le succès incontestable de PHP 5 pour la mise enplace simplifiée d’une solution web dynamique et la capacité de s’interfacer aisément avec les bases dedonnées. Nous nous désintéresserons ici complètement de ces querelles de clochers, a fortiori car notreprojet pédagogique nous conduit bien davantage à nous pencher sur ce qui les réunit plutôt que ce quiles différencie. C’est leur multiplicité qui a présidé à cet ouvrage et qui en fait, nous l’espérons, son ori-ginalité. Nous n’allons pas nous en plaindre et défendons en revanche l’idée que le choix définitif del’un ou l’autre de ces langages dépend davantage d’habitude, d’environnement professionnel oud’enseignement, de questions sociales et économiques et surtout de la raison concrète de cette utilisa-tion (pédagogie, performance machine, adéquation web ou base de données …).

Quelques amabilités glanées dans Masterminds of Programming

Bjarne Stroustrup (créateur du C++) : « J’avais prédit que s’il voulait percer, Java serait contraint de croîtresignificativement en taille et en complexité. Il l’a fait ».Guido van Rossum (créateur de Python) : « Je dis qu’une ligne de Python, de Ruby, de Perl ou de PHP équivaut à10 lignes de Java ».Tom Love (co-créateur d’Objective-C, le langage OO de prédilection pour le développement des applications Appleet plus récemment IPhone, IPod et autres smartphones) : « Tant Objective-C que C++ sont nés au départ dulangage C. Dans le premier cas, ce fut un petit langage, simple, élégant, net et bien défini ; dans l’autre, ce fut uneabomination hyper compliquée et présentant de véritables défauts de conceptions ».James Gosling (créateur de Java) : « Les pointeurs en C++ sont un désastre, une véritable incitation à program-mer de manière erronée » et « C# a tout pompé sur Java, à l’exception de la sûreté et de la fiabilité par la prise encharge de pointeurs dangereux qui m’apparaissent comme grotesquement stupides ».Anders Hejlsberg (créateur de C#) : « Je ne comprends pas pourquoi Java a choisi de ne pas évoluer. Si vousregardez l’histoire de l’industrie, tout n’est qu’une question d’évolution. À la minute où vous arrêtez d’évoluer,vous signez votre arrêt de mort ».James Rumbaugh (un des trois concepteurs d’UML) : « Je pense qu’utiliser UML comme générateur de code estune idée exécrable. Il n’y a rien de magique au sujet d’UML. Si vous pouvez créer du code à partir des diagrammes,alors il s’agit d’un langage de programmation. Or UML n’est pas du tout conçu comme un langage deprogrammation ».Bertrand Meyer (créateur d’Eiffel et défendant la programmation OO dite par « contrats ») : « Je ne comprends pascomment l’on peut programmer sans prendre le temps et la responsabilité de se demander ce que les éléments duprogramme ont la charge de faire. C’est une question à poser à Gosling, Stroustrup, Alan Kay ou Hejlsberg ».

Page 8: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Avant-propos XI

Récemment, un livre intitulé Masterminds of Programming (O’Reilly, 2009) et compilant unensemble d’entretiens avec les créateurs des langages de programmation, nous a convaincu dubien-fondé de ce type de démarche comparative. Il apparaît en effet, au vu de la guerre des mots àlaquelle se livrent ses créateurs, qu’aucun langage de programmation ne peut vraiment s’appré-hender sans partiellement le comparer à d’autres. En fait, tous se positionnent dans une forme derupture ou de replacement par rapport à ses prédécesseurs. Enfin, nous souhaitions que cet ouvrage, tout en restant suffisamment détaché de toute techno-logie, couvre l’essentiel des problèmes posés par la mise en œuvre des objets en informatique : leurstockage sur le disque dur, leur interfaçage avec les bases de données, leur fonctionnement enparallèle et leur communication à travers Internet. Ce faisant nous acceptons de perdre un peu enprécision, et il nous apparaît nécessaire de mettre en garde le lecteur. Ce livre n’aborde aucune destechnologies en profondeur, mais les approche toutes dans ce qu’elles ont de commun et qui sedevrait de survivre pour des siècles et des siècles…

Plan de l’ouvrageLes 23 chapitres de ce livre peuvent se répartir en cinq grandes parties.Le premier chapitre constitue une partie en soi car il a pour importante mission d’initier aux briques debase de la programmation orientée objet, sans aucun développement technique : une première esquisse,teintée de sciences cognitives, et toute en intuition, des éléments essentiels de la pratique OO.La deuxième partie intègre les quatorze chapitres suivants. Il s’agit pour chacun d’entre eux dedécrire, plus techniquement cette fois, ces briques de base : objet, classe (chapitres 2 et 3), mes-sages et communication entre objets (chapitres 4, 5 et 6), encapsulation (chapitres 7 et 8), gestionmémoire des objets (chapitre 9), modélisation objet (chapitre 10), héritage et polymorphisme(chapitres 11 et 12), classe abstraite (chapitre 13), clonage et comparaison d’objets (chapitre 14),interface (chapitre 15).Chacune de ces briques est illustrée par des exemples en Java, C#, C++, Python, PHP 5 et UML.Nous y faisons le pari que cette mise en parallèle est la voie la plus naturelle pour la compréhensiondes mécanismes de base : extraction du concept par la multiplication des exemples.La troisième partie reprend, dans le droit fil des ouvrages dédiés à l’un ou l’autre langage objet, desnotions jugées plus avancées : les objets distribués, Corba, RMI, les services web (chapitre 16), lemultithreading ou programmation parallèle (ou concurrentielle, chapitre 17), la programmationévénementielle (chapitre 18) et enfin la sauvegarde des objets sur le disque dur, y compris l’interfa-çage entre les objets et les bases de données relationnelles (chapitre 19). Là encore, le lecteur setrouvera le plus souvent en présence de plusieurs versions dans les cinq langages de ces méca-nismes. La nouvelle plate-forme LINQ de Microsoft s’y trouve abordée, car elle propose unemanière radicalement neuve de penser la mise en correspondance entre les objets et les informa-tions stockées sous forme relationnelle ou XML.La quatrième partie décrit plusieurs projets de programmation objet totalement aboutis, tant en UMLqu’en Java. Elle inclut d’abord le chapitre 20, décrivant la modélisation objet d’un petit flipper et d’un

Page 9: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetXII

petit tennis, ainsi que les problèmes de conception orientée objet que cette modélisation pose. Lechapitre 21, lié au chapitre 22, décrit la manière dont les objets peuvent s’organiser en liste liée ou engraphe, mode de mise en relation et de regroupement des objets que l’on retrouve abondamment danstoute l’informatique. Le chapitre 22 marie la chimie, la biologie et l’économie à la programmation OO.Il contient tout d’abord la programmation d’un réacteur chimique créant de nouvelles molécules à partirde molécules de base, tout en suivant à la trace l’évolution de la concentration des molécules dans letemps. La chimie – une chimie élémentaire acquise bien avant l’université – nous est apparue être uneplate-forme pédagogique idéale pour l’assimilation des concepts objets. Nous proposons aussi des simu-lations élémentaires du système immunitaire et d’une économie de marché.Enfin, la dernière partie se ramène au seul chapitre 23, dans lequel sont présentées plusieursrecettes de conception OO, résolvant de manière fort élégante un ensemble de problèmes récur-rents dans la réalisation de programmes. Ces recettes de conception, dénommées Design patterns,sont devenues fort célèbres dans la communauté OO. Leur compréhension s’inscrit dans la suitelogique de l’enseignement des briques et des mécanismes de base de l’OO. Elle fait souvent la dif-férence entre l’apprenti et le compagnon parmi les programmeurs OO. Nous les illustrons enpartie sur le flipper, la chimie, la biologie et l’économie des chapitres précédents.

À qui s’adresse ce livre ?Cet ouvrage est sans nul doute destiné à un public assez large : industriels, enseignants et étudiants,mais sa vocation première n’en reste pas moins une initiation à la programmation orientée objet.Ce livre sera un compagnon d’étude enrichissant pour les étudiants qui comptent la programmation objetdans leur cursus d’étude (et toutes technologies s’y rapportant : Java, C++, C#, Python, PHP, Corba,RMI, services web, UML, LINQ). Il devrait les aider, le cas échéant, à évoluer de la programmation pro-cédurale à la programmation objet, pour aller ensuite vers toutes les technologies s’y rapportant.Nous ne pensons pas, en revanche, que ce livre peut seul prétendre à constituer une porte d’entréedans le monde de la programmation tout court. Comme dit précédemment, nous estimons qu’ilest idéal d’aborder en même temps les mécanismes OO et procéduraux. Pour des raisons évidentesde place et car les librairies informatiques en regorgent déjà, nous avons fait l’impasse d’un ensei-gnement de base des mécanismes procéduraux : variables, boucles, instructions conditionnelles,éléments fondamentaux et compagnons indispensables à l’assimilation de l’OO. Nous pensons,dès lors, que ce livre sera plus facile à aborder pour des lecteurs ayant déjà un peu de pratique de laprogrammation dite procédurale, et ce, dans un quelconque langage de programmation. Finale-ment, précisons que s’il ne pretend pas être exhaustif – et bien qu’à sa 6e édition – il résiste assezbien au temps. Ses pages ne jaunissent pas trop et, tout comme la plupart des technologies qu’ilrecense, il reste rétrocompatible avec ses versions précédentes. Il suit les évolutions de toutes cestechnologies, même si celles-ci restent délibérément accrochées aux principes OO qui en font sonsujet et, nous l’espérons, son attrait principal.

Page 10: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Table des matières

Avant-propos ........................... VL’orientation objet (OO) en quelques mots VILes grands acteurs de l’orienté objet . . . .VIIIObjectifs de l’ouvrage . . . . . . . . . . . . . . . IXPlan de l’ouvrage . . . . . . . . . . . . . . . . . . . XIÀ qui s’adresse ce livre ? . . . . . . . . . . . . . XII

CHAPITRE 1Principes de base : quel objet pour l’informatique ?.............. 1

Le trio <entité, attribut, valeur> . . . . . . . . . 2Stockage des objets en mémoire . . . . . . . . . 2

Types primitifs . . . . . . . . . . . . . . . . . . . . 4Le référent d’un objet . . . . . . . . . . . . . . . . 5Plusieurs référents pour un même objet . . . . 6

L’objet dans sa version passive . . . . . . . . . . 7L’objet et ses constituants . . . . . . . . . . . . . 7Objet composite . . . . . . . . . . . . . . . . . . . 8Dépendance sans composition . . . . . . . . . . 9

L’objet dans sa version active . . . . . . . . . . . 9Activité des objets . . . . . . . . . . . . . . . . . . 9Les différents états d’un objet . . . . . . . . . . 9Les changements d’état : qui en est la cause ? . 10Comment relier les opérations et les attributs ? 10

Introduction à la notion de classe . . . . . . . 11Méthodes et classes . . . . . . . . . . . . . . . . 11Sur quel objet précis s’exécute la méthode ? 13

Des objets en interaction . . . . . . . . . . . . . 14Comment les objets communiquent . . . . . 14Envoi de messages . . . . . . . . . . . . . . . . . 15Identification des destinataires de message . 15

Des objets soumis à une hiérarchie . . . . . . . 16Du plus général au plus spécifique . . . . . . . 16Dépendance contextuelle du bon niveau taxonomique . . . . . . . . . . . . . . . . . . . . . 17

Polymorphisme . . . . . . . . . . . . . . . . . . . . 18Héritage bien reçu . . . . . . . . . . . . . . . . . . 19Exercices . . . . . . . . . . . . . . . . . . . . . . . . . 19

CHAPITRE 2Un objet sans classe… n’a pas de classe.................... 21

Constitution d’une classe d’objets . . . . . . . 22Définition d’une méthode de la classe : avec ou sans retour . . . . . . . . . . . . . . . . . 23Identification et surcharge des méthodes par leur signature . . . . . . . . . . . . . . . . . . 24

La classe comme module fonctionnel . . . . . 26Différenciation des objets par la valeur des attributs . . . . . . . . . . . . . . . . . . . . . . 26Le constructeur . . . . . . . . . . . . . . . . . . . 26Mémoire dynamique, mémoire statique . . . 28

La classe comme garante de son bon usage . 29La classe comme module opérationnel . . . . 30

Mémoire de la classe et mémoire des objets 30Méthodes de la classe et des instances . . . . 32

Un premier petit programme complet dans les cinq langages . . . . . . . . . . . . . . . . 32

En Java . . . . . . . . . . . . . . . . . . . . . . . . . 33EN C# . . . . . . . . . . . . . . . . . . . . . . . . . 35En C++ . . . . . . . . . . . . . . . . . . . . . . . . 37En Python . . . . . . . . . . . . . . . . . . . . . . 40

Page 11: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetXIV

En PHP 5 . . . . . . . . . . . . . . . . . . . . . . 42La classe et la logistique de développement 44

Classes et développement de sous-ensembles logiciels . . . . . . . . . . . . . . . . . . . . . . . . 44Classes, fichiers et répertoires . . . . . . . . . 45

Exercices . . . . . . . . . . . . . . . . . . . . . . . . 46

CHAPITRE 3Du faire savoir au savoir-faire…du procédural à l’OO ............. 51

Objectif objet : les aventures de l’OO . . . . 52Argumentation pour l’objet . . . . . . . . . . . 52Transition vers l’objet . . . . . . . . . . . . . . . 53

Mise en pratique . . . . . . . . . . . . . . . . . . . 53Simulation d’un écosystème . . . . . . . . . . 53

Analyse . . . . . . . . . . . . . . . . . . . . . . . . . 54Analyse procédurale . . . . . . . . . . . . . . . . 54Fonctions principales . . . . . . . . . . . . . . . 54

Conception . . . . . . . . . . . . . . . . . . . . . . 55Conception procédurale . . . . . . . . . . . . . 55Conception objet . . . . . . . . . . . . . . . . . . 56

Conséquences de l’orientation objet . . . . . 57Les acteurs du scénario . . . . . . . . . . . . . . 57Indépendance de développement et dépendance fonctionnelle . . . . . . . . . . 57Petite allusion (anticipée) à l’héritage . . . . 58La collaboration des classes deux à deux . . 58

CHAPITRE 4Ici Londres : les objets parlent aux objets............................... 59

Envois de messages . . . . . . . . . . . . . . . . . 60Association de classes . . . . . . . . . . . . . . . 61Dépendance de classes . . . . . . . . . . . . . . . 64Réaction en chaîne de messages . . . . . . . . 66Exercices . . . . . . . . . . . . . . . . . . . . . . . . 67

CHAPITRE 5Collaboration entre classes .. 69

Pour en finir avec la lutte des classes . . . . . 70

La compilation Java : effet domino . . . . . . . 71En C#, Python, PHP 5 ou C++ . . . . . . . . . 72De l’association unidirectionnelle à l’association bidirectionnelle . . . . . . . . . . 74Auto-association . . . . . . . . . . . . . . . . . . . 77Paquets et espaces de noms . . . . . . . . . . . . 79Exercices . . . . . . . . . . . . . . . . . . . . . . . . . 82

CHAPITRE 6Méthodes ou messages ?...... 83

Passage d’arguments prédéfinis dans les messages . . . . . . . . . . . . . . . . . . . 84

En Java . . . . . . . . . . . . . . . . . . . . . . . . . 84Résultat . . . . . . . . . . . . . . . . . . . . . . . 84

En C# . . . . . . . . . . . . . . . . . . . . . . . . . 85Résultat . . . . . . . . . . . . . . . . . . . . . . . 86

En C++ . . . . . . . . . . . . . . . . . . . . . . . . 86Résultat . . . . . . . . . . . . . . . . . . . . . . . 87

En Python . . . . . . . . . . . . . . . . . . . . . . 87Résultat . . . . . . . . . . . . . . . . . . . . . . . 88

En PHP 5 . . . . . . . . . . . . . . . . . . . . . . 88Passage d’argument objet dans les messages . . 91

En Java . . . . . . . . . . . . . . . . . . . . . . . . . 91Résultat . . . . . . . . . . . . . . . . . . . . . . . 91

En C# . . . . . . . . . . . . . . . . . . . . . . . . . 92Résultat . . . . . . . . . . . . . . . . . . . . . . . 94

En PHP 5 . . . . . . . . . . . . . . . . . . . . . . 94En C++ . . . . . . . . . . . . . . . . . . . . . . . . 96

Résultat passage par valeur . . . . . . . . . . . 97Résultat passage par référent . . . . . . . . . . 97

En Python . . . . . . . . . . . . . . . . . . . . . . 97Résultat . . . . . . . . . . . . . . . . . . . . . . . 98

Une méthode est-elle d’office un message ? . . 98Même message, plusieurs méthodes . . . . . 98Nature et rôle, type, classe et interface : quelques préalables . . . . . . . . . . . . . . . . . 99Interface : liste de signatures de méthodes disponibles . . . . . . . . . . . . . . . . . . . . . 100Des méthodes strictement internes . . . . . 101

La mondialisation des messages . . . . . . . 101

Page 12: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Table des matières XV

Message sur Internet . . . . . . . . . . . . . . 101L’informatique distribuée . . . . . . . . . . . 102

Exercices . . . . . . . . . . . . . . . . . . . . . . . 103

CHAPITRE 7L’encapsulation des attributs ........................ 107

Accès aux attributs d’un objet . . . . . . . . . 108Accès externe aux attributs . . . . . . . . . . 108Cachez ces attributs que je ne saurais voir 109Encapsulation des attributs . . . . . . . . . . 110

En Java . . . . . . . . . . . . . . . . . . . . . 110En C++ . . . . . . . . . . . . . . . . . . . . . . 111En C# . . . . . . . . . . . . . . . . . . . . . . 111En PHP 5 . . . . . . . . . . . . . . . . . . . . 112En Python . . . . . . . . . . . . . . . . . . . . 113

Encapsulation : pour quoi faire ? . . . . . . . 114Pour préserver l’intégrité des objets . . . . . 114La gestion d’exception . . . . . . . . . . . . . 115Pour cloisonner leur traitement . . . . . . . 117Pour pouvoir faire évoluer leur traitement en douceur . . . . . . . . . . . . . . . . . . . . . 117La classe : enceinte de confinement . . . . 119

Exercices . . . . . . . . . . . . . . . . . . . . . . . 119

CHAPITRE 8Les classes et leur jardin secret .................................... 121

Encapsulation des méthodes . . . . . . . . . 122Interface et implémentation . . . . . . . . . 122Toujours un souci de stabilité . . . . . . . . 123Signature d’une classe : son interface . . . . 125

Les niveaux intermédiaires d’encapsulation . . . . . . . . . . . . . . . . . . . 126

Classes amies . . . . . . . . . . . . . . . . . . . 126Une classe dans une autre . . . . . . . . . . . 127Utilisation des paquets . . . . . . . . . . . . . 128

Afin d’éviter l’effet papillon . . . . . . . . . . 130Exercices . . . . . . . . . . . . . . . . . . . . . . . 132

CHAPITRE 9Vie et mort des objets ........ 135

Question de mémoire . . . . . . . . . . . . . . . 136Un rappel sur la mémoire RAM . . . . . . . 136L’OO coûte cher en mémoire . . . . . . . . 137Qui se ressemble s’assemble : le principe de localité . . . . . . . . . . . . . . 137Les objets intermédiaires . . . . . . . . . . . . 138Mémoire pile . . . . . . . . . . . . . . . . . . . 138

En C++ . . . . . . . . . . . . . . . . . . . . . . 140En C# . . . . . . . . . . . . . . . . . . . . . . . 141

Disparaître de la mémoire comme de la vie réelle . . . . . . . . . . . . . . . . . . . 144Mémoire tas . . . . . . . . . . . . . . . . . . . . 145

C++ : le programmeur est le seul maître à bord . . . . . . . . . . . . . . . . . . . . . . . . . . 145

La mémoire a des fuites . . . . . . . . . . . . . 146En Java, C#, Python et PHP 5 : la chasse au gaspi . . . . . . . . . . . . . . . . . . 148

En Java . . . . . . . . . . . . . . . . . . . . . . . . 149En C# . . . . . . . . . . . . . . . . . . . . . . . . 150En PHP 5 . . . . . . . . . . . . . . . . . . . . . 150Le ramasse-miettes (ou garbage collector) 151Des objets qui se mordent la queue . . . . . 152En Python . . . . . . . . . . . . . . . . . . . . . 153

Exercices . . . . . . . . . . . . . . . . . . . . . . . . 155

CHAPITRE 10UML 2.................................... 159

Diagrammes UML 2 . . . . . . . . . . . . . . . . . 161Représentation graphique standardisée . . 162Du tableau noir à l’ordinateur . . . . . . . . . 163Programmer par cycles courts en superposant les diagrammes . . . . . . . . 164Diagramme de classe et diagramme de séquence . . . . . . . . . . . . . . . . . . . . . . 165Diagramme de classe . . . . . . . . . . . . . . . 166

Une classe . . . . . . . . . . . . . . . . . . . . . . 166En Java : UML1.java . . . . . . . . . . . . . 166En C# : UML1.cs . . . . . . . . . . . . . . . 167

Page 13: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetXVI

En C++ : UML1.cpp . . . . . . . . . . . . . 168En Python : UML1.py . . . . . . . . . . . . 169En PHP 5 : UML1.php . . . . . . . . . . . 169

Similitudes et différences entre les langages . 170Association entre classes . . . . . . . . . . . . 170

En Java : UML 2.java . . . . . . . . . . . . 171En C# : UML 2.cs . . . . . . . . . . . . . . . 171En C++ : UML 2.cpp . . . . . . . . . . . . . 172En Python : UML 2.py . . . . . . . . . . . . 173En PHP 5 : UML2.php . . . . . . . . . . . 174

Similitudes et différences entre les langages . 174Pas d’association sans message . . . . . . . . . . 175Rôles et cardinalité . . . . . . . . . . . . . . . . . . . 176Dépendance entre classes . . . . . . . . . . . . . . 184Composition . . . . . . . . . . . . . . . . . . . . . . . . 185En Java . . . . . . . . . . . . . . . . . . . . . . . 186

UML3.java . . . . . . . . . . . . . . . . . . . 187UML3bis.java . . . . . . . . . . . . . . . . . 189

En C# . . . . . . . . . . . . . . . . . . . . . . . . 190UML3.cs . . . . . . . . . . . . . . . . . . . . . 191UML3bis.cs . . . . . . . . . . . . . . . . . . . 192

En C++ . . . . . . . . . . . . . . . . . . . . . . . 193UML3.cpp . . . . . . . . . . . . . . . . . . . . 194UML3bis.cpp . . . . . . . . . . . . . . . . . . 196

En Python . . . . . . . . . . . . . . . . . . . . . 197UML3.py . . . . . . . . . . . . . . . . . . . . 197UML3bis.py . . . . . . . . . . . . . . . . . . 198

En PHP 5 . . . . . . . . . . . . . . . . . . . . . 199Classe d’association . . . . . . . . . . . . . . . 200Les paquets . . . . . . . . . . . . . . . . . . . . 201

Les bienfaits d’UML . . . . . . . . . . . . . . . . . . 202Un premier diagramme de classe de l’écosystème . . . . . . . . . . . . . . . . . . 202Des joueurs de football qui font leurs classes . . . . . . . . . . . . . . . . . . . . 202Les avantages des diagrammes de classes . 202Un diagramme de classe simple à faire, mais qui décrit une réalité complexe à exécuter . 204Procéder de manière modulaire et incrémentale . . . . . . . . . . . . . . . . . . 205

Diagramme de séquence . . . . . . . . . . . . 205

Diagramme d’états-transitions . . . . . . . . . . 211Exercices . . . . . . . . . . . . . . . . . . . . . . . . 214

CHAPITRE 11Héritage................................ 221

Comment regrouper les classes dans des superclasses ? . . . . . . . . . . . . . . 222Héritage des attributs . . . . . . . . . . . . . . . 223

Pourquoi l’addition de propriétés ? . . . . . 226L’héritage : du cognitif aux taxonomies . . 226Interprétation ensembliste de l’héritage . . 227Qui peut le plus peut le moins . . . . . . . . 228

Héritage ou composition ? . . . . . . . . . . . 229Économiser en ajoutant des classes ? . . . . 230Héritage des méthodes . . . . . . . . . . . . . . 230

Code Java . . . . . . . . . . . . . . . . . . . . . . 233Code C# . . . . . . . . . . . . . . . . . . . . . . 234Code C++ . . . . . . . . . . . . . . . . . . . . . . 235Code Python . . . . . . . . . . . . . . . . . . . . 237Code PHP 5 . . . . . . . . . . . . . . . . . . . . 238

La recherche des méthodes dans la hiérarchie . . . . . . . . . . . . . . . . . . 239Encapsulation protected . . . . . . . . . . . . . 240Héritage et constructeurs . . . . . . . . . . . . 241

Premier code Java . . . . . . . . . . . . . . . . . 241Deuxième code Java . . . . . . . . . . . . . . . 242Troisième code Java : le plus logique et le bon . . . . . . . . . . . . . . . . . . . . . . . 243En C# . . . . . . . . . . . . . . . . . . . . . . . . 244En C++ . . . . . . . . . . . . . . . . . . . . . . . 245En Python . . . . . . . . . . . . . . . . . . . . . 246En PHP 5 . . . . . . . . . . . . . . . . . . . . . 246

Héritage public en C++ . . . . . . . . . . . . . . 247Le multihéritage . . . . . . . . . . . . . . . . . . 248

Ramifications descendantes et ascendantes 248Multihéritage en C++ et Python . . . . . . . 249

Code C++ illustrant le multihéritage . . . . 250Code Python illustrant le multihéritage . . . 251

Des méthodes et attributs portant un même nom dans des superclasses distinctes . . . . 252

Page 14: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Table des matières XVII

Code C++ illustrant un premier problème lié au multihéritage . . . . . . . . . . . . . . 252En Python . . . . . . . . . . . . . . . . . . . . 254

Plusieurs chemins vers une même superclasse . . . . . . . . . . . . . 255

Code C++ : illustrant un deuxième problème lié au multihéritage . . . . . . . . . . . . . . 256

L’héritage virtuel . . . . . . . . . . . . . . . . . 258Exercices . . . . . . . . . . . . . . . . . . . . . . . 259

CHAPITRE 12Redéfinition des méthodes 265

La redéfinition des méthodes . . . . . . . . . 266Beaucoup de verbiage mais peu d’actes véritables . . . . . . . . . . . . . . . . . . 267Un match de football polymorphique . . . 268

La classe Balle . . . . . . . . . . . . . . . . . . 269En Java . . . . . . . . . . . . . . . . . . . . . 269En C++ . . . . . . . . . . . . . . . . . . . . . . 270En C# . . . . . . . . . . . . . . . . . . . . . . 270En Python . . . . . . . . . . . . . . . . . . . . 270En PHP 5 . . . . . . . . . . . . . . . . . . . . 270

La classe Joueur . . . . . . . . . . . . . . . . . 270En Java . . . . . . . . . . . . . . . . . . . . . 270En C++ . . . . . . . . . . . . . . . . . . . . . . 271En C# . . . . . . . . . . . . . . . . . . . . . . 272En Python . . . . . . . . . . . . . . . . . . . . 273En PHP 5 . . . . . . . . . . . . . . . . . . . . 274

Précisons la nature des joueurs . . . . . . . . 274En Java . . . . . . . . . . . . . . . . . . . . . 275En C++ . . . . . . . . . . . . . . . . . . . . . . 276En C# . . . . . . . . . . . . . . . . . . . . . . 277En Python . . . . . . . . . . . . . . . . . . . . 278En PHP 5 . . . . . . . . . . . . . . . . . . . . 279

Passons à l’entraîneur . . . . . . . . . . . . . . 280En Java . . . . . . . . . . . . . . . . . . . . . 280En C++ . . . . . . . . . . . . . . . . . . . . . . 281En C# . . . . . . . . . . . . . . . . . . . . . . 281En Python . . . . . . . . . . . . . . . . . . . . 282En PHP 5 . . . . . . . . . . . . . . . . . . . . 282

Passons maintenant au bouquet final . . . 282

En Java . . . . . . . . . . . . . . . . . . . . . . 282Un même ordre mais une exécution différente . . . . . . . . . . . . . . . . . . . . . 284C++ : un comportement surprenant . . . . . 285Polymorphisme : uniquement possible dans la mémoire tas . . . . . . . . . . . . . . . 289En C# . . . . . . . . . . . . . . . . . . . . . . . 289En Python . . . . . . . . . . . . . . . . . . . . 291En PHP 5 . . . . . . . . . . . . . . . . . . . . 292

Quand la sous-classe doit se démarquer pour marquer . . . . . . . . . . . . . . . . . . . 293

Les attaquants participent à un casting . . . 294Éviter les « mauvais castings » . . . . . . . . 295En C++ . . . . . . . . . . . . . . . . . . . . . . 296En C# . . . . . . . . . . . . . . . . . . . . . . . 296Le casting a mauvaise presse . . . . . . . . . 297Redéfinition et encapsulation . . . . . . . . . 298

Exercices . . . . . . . . . . . . . . . . . . . . . . . . 299

CHAPITRE 13Abstraite, cette classe est sans objet....................... 311

De Canaletto à Turner . . . . . . . . . . . . . . 312Des classes sans objet . . . . . . . . . . . . . . . 312Du principe de l’abstraction à l’abstraction syntaxique . . . . . . . . . . . . . . . . . . . . . . . 313

Classe abstraite . . . . . . . . . . . . . . . . . . 315new et abstract incompatibles . . . . . . . . . 316Abstraite de père en fils . . . . . . . . . . . . . 316Un petit exemple dans quatre langages de programmation . . . . . . . . . . . . . . . . 317

En Java . . . . . . . . . . . . . . . . . . . . . 317En C# . . . . . . . . . . . . . . . . . . . . . . . 318En PHP 5 . . . . . . . . . . . . . . . . . . . . 319En C++ . . . . . . . . . . . . . . . . . . . . . . 320

L’abstraction en Python . . . . . . . . . . . . 321Un petit supplément de polymorphisme . . 322

Les enfants de la balle . . . . . . . . . . . . . . 322Cliquez frénétiquement . . . . . . . . . . . . . 322Le Paris-Dakar . . . . . . . . . . . . . . . . . . 324Le polymorphisme en UML . . . . . . . . . 325

Page 15: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetXVIII

Exercices . . . . . . . . . . . . . . . . . . . . . . . 326Exercice 13.11 . . . . . . . . . . . . . . . . . . 335Exercice 13.12 . . . . . . . . . . . . . . . . . . 335

CHAPITRE 14Clonage, comparaison et affectation d’objets ........ 339

Introduction à la classe Object . . . . . . . . 340Une classe à compétence universelle . . . . 341Code Java illustrant l’utilisation de la classe Vector et innovation de Java 5 341

Nouvelle version du code . . . . . . . . . . . 342Décortiquons la classe Object . . . . . . . . . 343Test d’égalité de deux objets . . . . . . . . . . 345

Code Java pour expérimenter la méthode equals(Object o) . . . . . . . . . . . . . . . . . 345Égalité en profondeur . . . . . . . . . . . . . 348

Le clonage d’objets . . . . . . . . . . . . . . . . 350Code Java pour expérimenter la méthode clone() . . . . . . . . . . . . . . . . 350

Égalité et clonage d’objets en Python . . . . 354Code Python pour expérimenter l’égalité et le clonage . . . . . . . . . . . . . . . . . . . . 354

Égalité et clonage d’objets en PHP 5 . . . . 355Code PHP 5 pour expérimenter l’égalité et le clonage . . . . . . . . . . . . . . . . . . . . 355

Égalité, clonage et affectation d’objets en C++ . . . . . . . . . . . . . . . . . . . . . . . . . 357

Code C++ illustrant la duplication, la comparaison et l’affectation d’objets . . . 357Traitons d’abord la mémoire tas . . . . . . . 361Surcharge de l’opérateur d’affectation . . . 363Comparaisons d’objets . . . . . . . . . . . . . 363La mémoire pile . . . . . . . . . . . . . . . . . 364Surcharge de l’opérateur de comparaison . 364Dernière étape . . . . . . . . . . . . . . . . . . 365Code C++ de la classe O1 créé automatiquement par Rational Rose . . . . 366

En C#, un cocktail de Java et de C++ . . . . 368Pour les structures . . . . . . . . . . . . . . . . 368

Pour les classes . . . . . . . . . . . . . . . . . . . 368Code C# . . . . . . . . . . . . . . . . . . . . . . 368

Exercices . . . . . . . . . . . . . . . . . . . . . . . . 374

CHAPITRE 15Interfaces ............................. 375

Interfaces : favoriser la décomposition et la stabilité . . . . . . . . . . . . . . . . . . . . . 376Java, C# et PHP 5 : interface et héritage . . 377Les trois raisons d’être des interfaces . . . . 378

Forcer la redéfinition . . . . . . . . . . . . . . 378Code Java illustrant l’interface Comparable . 379Code Java illustrant l’interface ActionListener . . . . . . . . . . . . . . . . . . . 381Code Java illustrant l’interface KeyListener . 382

Permettre le multihéritage . . . . . . . . . . . 384La carte de visite de l’objet . . . . . . . . . . . 385

Code Java . . . . . . . . . . . . . . . . . . . . . 386Code C# . . . . . . . . . . . . . . . . . . . . . . 387Code PHP 5 . . . . . . . . . . . . . . . . . . . 391

Les interfaces dans UML 2 . . . . . . . . . . . 392En C++ : fichiers .h et fichiers .cpp . . . . . . 393Interfaces : du local à Internet . . . . . . . . . 397Exercices . . . . . . . . . . . . . . . . . . . . . . . . 397

CHAPITRE 16Distribution gratuite d’objets : pour services rendus sur le réseau......................... 401

Objets distribués sur le réseau : pourquoi ? 402Faire d’Internet un ordinateur géant . . . . 402Répartition des données . . . . . . . . . . . . 403Répartition des utilisateurs et des responsables . . . . . . . . . . . . . . . . 403Peer-to-peer . . . . . . . . . . . . . . . . . . . . 404L’informatique ubiquitaire . . . . . . . . . . . 405Robustesse . . . . . . . . . . . . . . . . . . . . . 406

RMI (Remote Method Invocation) . . . . . 406Côté serveur . . . . . . . . . . . . . . . . . . . . 407Côté client . . . . . . . . . . . . . . . . . . . . . 408

Page 16: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Table des matières XIX

RMIC : stub et skeleton . . . . . . . . . . . . 410Lancement du registre . . . . . . . . . . . . . 411

Corba (Common Object Request Broker Architecture) . . . . . . . . . . . . . . . 412

Un standard : ça compte . . . . . . . . . . . . 413IDL . . . . . . . . . . . . . . . . . . . . . . . . . 413Compilateur IDL vers Java . . . . . . . . . . 414Côté client . . . . . . . . . . . . . . . . . . . . . 415Côté serveur . . . . . . . . . . . . . . . . . . . . 417Exécutons l’application Corba . . . . . . . . 418Corba n’est pas polymorphique . . . . . . . 419

Ajoutons un peu de flexibilité à tout cela . 420Corba : invocation dynamique versus invocation statique . . . . . . . . . . . 421Jini . . . . . . . . . . . . . . . . . . . . . . . . . . 421XML : pour une dénomination universelle des services . . . . . . . . . . . . . . . . . . . . . 422

Les services web sur .Net . . . . . . . . . . . . 425Code C# du service . . . . . . . . . . . . . . . 425WDSL . . . . . . . . . . . . . . . . . . . . . . . 426Création du proxy . . . . . . . . . . . . . . . . 427Code C# du client . . . . . . . . . . . . . . . . 428Soap (Simple Object Access Protocol) . . 428Invocation dynamique sous .Net . . . . . . 429Invocation asynchrone en .Net . . . . . . . . 430Mais où sont passés les objets ? . . . . . . . 432Un annuaire des services XML universel : UDDI . . . . . . . . . . . . . . . . 435Services web versus RMI et Corba . . . . . 435Services web versus Windows Communication Foundation (WCF) . . . 436

Exercices . . . . . . . . . . . . . . . . . . . . . . . 436

CHAPITRE 17Multithreading .................... 439

Informatique séquentielle . . . . . . . . . . . 441Multithreading . . . . . . . . . . . . . . . . . . . 443Implémentation en Java . . . . . . . . . . . . . 444Implémentation en C# . . . . . . . . . . . . . 446Implémentation en Python . . . . . . . . . . 449

L’effet du multithreading sur les diagrammes de séquence UML . . . . . . 450Du multithreading aux applications distribuées . . . . . . . . . . . . . . . . . . . . . . . 451Des threads équirépartis . . . . . . . . . . . . . 452

En Java . . . . . . . . . . . . . . . . . . . . . . . . 452En C# . . . . . . . . . . . . . . . . . . . . . . . . 452En Python . . . . . . . . . . . . . . . . . . . . . 453

Synchroniser les threads . . . . . . . . . . . . . 454En Java . . . . . . . . . . . . . . . . . . . . . . . . 454En C# . . . . . . . . . . . . . . . . . . . . . . . . 456En Python . . . . . . . . . . . . . . . . . . . . . 459

Exercices . . . . . . . . . . . . . . . . . . . . . . . . 462

CHAPITRE 18Programmation événementielle.................... 465

Des objets qui s’observent . . . . . . . . . . . . 466En Java . . . . . . . . . . . . . . . . . . . . . . . . . 467

La plante . . . . . . . . . . . . . . . . . . . . . . 467Du côté du prédateur . . . . . . . . . . . . . . 468Du côté de la proie . . . . . . . . . . . . . . . . 469Finalement, du côté de la Jungle . . . . . . . 469Résultat . . . . . . . . . . . . . . . . . . . . . . . 470

En C# : les délégués . . . . . . . . . . . . . . . . 470Généralités sur les délégués dans .Net . . . 470Retour aux observateurs et observables . . . 474

Tout d’abord, la plante . . . . . . . . . . . . . 474Du côté du prédateur . . . . . . . . . . . . . . 475Du côté de la proie . . . . . . . . . . . . . . . . 476Finalement, du côté de la Jungle . . . . . . . 476

En Python : tout reste à faire . . . . . . . . . . 479Un feu de signalisation plus réaliste . . . . . 481

En Java . . . . . . . . . . . . . . . . . . . . . . . . 482Exercices . . . . . . . . . . . . . . . . . . . . . . . . 484

CHAPITRE 19Persistance d’objets ............ 485

Sauvegarder l’état entre deux exécutions . . 486Et que dure le disque dur . . . . . . . . . . . . 486

Page 17: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objetXX

Quatre manières d’assurer la persistance des objets . . . . . . . . . . . . . . . . . . . . . . 486

Simple sauvegarde sur fichier . . . . . . . . . 487Utilisation des streams ou flux . . . . . . . . 487Qui sauve quoi ? . . . . . . . . . . . . . . . . . 488En Java . . . . . . . . . . . . . . . . . . . . . . . 488En C# . . . . . . . . . . . . . . . . . . . . . . . . 490En C++ . . . . . . . . . . . . . . . . . . . . . . 491En Python . . . . . . . . . . . . . . . . . . . . 492En PHP 5 . . . . . . . . . . . . . . . . . . . . . 493

Sauvegarder les objets sans les dénaturer : la sérialisation . . . . . . . . . . . . . . . . . . . . 494

En Java . . . . . . . . . . . . . . . . . . . . . . . 495En C# . . . . . . . . . . . . . . . . . . . . . . . 497En Python . . . . . . . . . . . . . . . . . . . . 498Contenu des fichiers de sérialisation : illisible . . . . . . . . . . . . . . . . . . . . . . . . 499

Les bases de données relationnelles . . . . . 499SQL . . . . . . . . . . . . . . . . . . . . . . . . . 500Une table, une classe . . . . . . . . . . . . . . 500Comment interfacer Java et C# aux bases de données . . . . . . . . . . . . . . 502

En Java . . . . . . . . . . . . . . . . . . . . . 503En C# . . . . . . . . . . . . . . . . . . . . . . . 505

Relations entre tables et associations entre classes . . . . . . . . . . . . . . . . . . . . 507

Relation 1-n . . . . . . . . . . . . . . . . . . . 507Relation n-n . . . . . . . . . . . . . . . . . . . 510Dernier problème : l’héritage . . . . . . . . . 511

Réservation de places de spectacles . . . . . 512Les bases de données relationnelles-objet 517

SQL3 . . . . . . . . . . . . . . . . . . . . . . . . 519Les bases de données orientées objet . . . . 521

OQL . . . . . . . . . . . . . . . . . . . . . . . . 522Django et Python . . . . . . . . . . . . . . . . . 523LINQ . . . . . . . . . . . . . . . . . . . . . . . . . 524

Premier exemple de LINQ agissant sur une collection d’objets . . . . . . . . . . . 525Second exemple de LINQ agissant sur une base de données relationnelle . . . 527

Exercices . . . . . . . . . . . . . . . . . . . . . . . 531

CHAPITRE 20Et si on faisait un petit flipper ? ................. 533

Généralités sur le flipper et les GUI . . . . . 534Une petite animation en C# . . . . . . . . . . 540

Retour au Flipper . . . . . . . . . . . . . . . . . . 545Code Java du Flipper . . . . . . . . . . . . . . 548

Un petit tennis . . . . . . . . . . . . . . . . . . . . 558

CHAPITRE 21Les graphes .......................... 565

Le monde regorge de réseaux . . . . . . . . . 566Tout d’abord : juste un ensemble d’objets . 568Liste liée . . . . . . . . . . . . . . . . . . . . . . . . 570

En Java . . . . . . . . . . . . . . . . . . . . . . . . 572En C++ . . . . . . . . . . . . . . . . . . . . . . . 574

La généricité en C++ . . . . . . . . . . . . . . . 576La généricité en Java et C# . . . . . . . . . . . 580Passons aux graphes . . . . . . . . . . . . . . . . 586Exercices . . . . . . . . . . . . . . . . . . . . . . . . 590

CHAPITRE 22Petites chimie, biologie et économie OO amusantes 595

Pourquoi de la chimie OO ? . . . . . . . . . . 596Chimie computationnelle . . . . . . . . . . . 596Chimie comme plate-forme didactique . . 596Une aide à la modélisation chimique . . . . 596

Les diagrammes de classes du réacteur chimique . . . . . . . . . . . . . . . . . . . . . . . . 597

La classe Composant_Chimique . . . . . . . 598Les classes Composant_Neutre et Composant_Charge . . . . . . . . . . . . . 599Les trois sous-classes de composants neutres . 600Les trois sous-classes de composants chargés . 602

La classe NœudAtomique . . . . . . . . . . . 603La classe NœudMoléculaire . . . . . . . . . . 603La classe Liaison . . . . . . . . . . . . . . . . . 603Le graphe moléculaire . . . . . . . . . . . . . . 604

Les règles de canonisation . . . . . . . . . . . 606

Page 18: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Table des matières XXI

Les réactions chimiques . . . . . . . . . . . . 607Une première réaction de croisement . . . . 607Une autre réaction de croisement un peu plus sophistiquée . . . . . . . . . . . . 608Une réaction d’ouverture de liaison . . . . . 608Réaction de transfert de charge . . . . . . . . 609Réaction de type Ion-Molecule . . . . . . . . 609Comment est calculée la cinétique réactionnelle . . . . . . . . . . . . . . . . . . . 609La classe Reaction . . . . . . . . . . . . . . . 610Les sous-classes de Reaction . . . . . . . . . . 610

Quelques résultats du simulateur . . . . . . 610Première simulation : une seule molécule produite . . . . . . . . . . . . . . . . . . . . . . 611Deuxième simulation : plusieurs molécules produites . . . . . . . . . . . . . . . . . . . . . 612Troisième simulation : De nombreuses molécules complexes produites . . . . . . . . . 612Pourquoi un tel simulateur ? . . . . . . . . . 613

La simulation immunologique en OO ? . 613Petite introduction au fonctionnement du système immunitaire . . . . . . . . . . . . 613Le diagramme UML d’états-transitions . 615

Dernière simulation : économie de marché 617

CHAPITRE 23Design patterns ................... 621

Introduction aux design patterns . . . . . . . 622De l’architecte à l’archiprogrammeur . . . . 622

Les patterns « trucs et ficelles » . . . . . . . . 624Le pattern Singleton . . . . . . . . . . . . . . . 625Le pattern Adaptateur . . . . . . . . . . . . . 626Les patterns Patron de méthode, Proxy, Observer et Memento . . . . . . . . . 627Le pattern Flyweight . . . . . . . . . . . . . . 628Les patterns Builder et Prototype . . . . . . 629Le pattern Façade . . . . . . . . . . . . . . . . 631

Les patterns qui se jettent à l’OO . . . . . . . 632Le pattern Command . . . . . . . . . . . . . . 633Le pattern Décorateur . . . . . . . . . . . . . . 636Le pattern Composite . . . . . . . . . . . . . . 639Le pattern Chain of responsabililty . . . . . 639Les patterns Strategy, State et Bridge . . . 640

Index..................................... 645

Page 19: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

IndexSymboles.Net 142, 390, 423, 506

Numeriques2-tiers 4033-tiers 403

Aabstract 316Abstract Factory 623abstraction 312Access 500acteur 57ActionListener en Java 379adressage indirect 6, 92affectation d’objet 362, 363agrégation 185analyse

objet 56procédurale 54

annuaire 421, 435argument 64, 184

objet 91, 140passage par référent 86, 89

assemblage 79, 128association de classes 61, 176atome 600attribut 2, 61, 62

private 109, 110automate cellulaire 442

Bbase 278base de données 403, 454, 499

objet 60OO 521, 523, 524relationnelle 5, 499

relationnelle-objet 60, 512, 517

Berners-Lee, Tim 423biologie 60, 442Booch, Gary 160Bridge 623

Ccardinalité 176cas d’utilisation 160casting 90, 294, 341, 496

critique 297explicite 228implicite 228, 294

cerveau 441charte du bon programmeur

OO 108, 130chimie

computationnelle 596cinétique réactionnelle 609classe

abstraite 268, 313, 315, 321, 377

association 74, 176dépendance 91, 184enceinte de confinement 119fichier 65, 72, 184généralité 12interaction 70Object 340, 343, 496, 580observable 466, 467sans objet 312Thread 445Vector 341, 570

cléétrangère 508

primaire 501, 502clonage d’objet 98, 350CLR 143CLS 143collection 230comparaison d’objets 363compilation 61, 70, 71, 109,

228, 239, 254, 293, 294, 312, 379, 387, 579

Composite 623composition 200

d’objets 9, 185, 229compteur de référents 151constructeur

héritage 244par copie 98, 141, 362, 367

cookie 434Corba 160, 406, 412, 422

invocationdynamique 421statique 421

services 416création automatique de

code 203

DDahl, Ole-Johan 52Deittel et Deittel 71délégué 470

en C# 448delete 145, 148, 193, 210dépendance

de classe 64, 184design pattern 411, 466destructeur 141, 190, 193, 195diagramme

Page 20: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objet646

d’objet 183de classe 161, 165, 202, 222,

267, 325, 385, 571de classes 597de composant 184, 393de séquence 161, 165, 205,

211, 450UML 161

disque dur 65, 136, 486dll 72DTD (Document Type

Definition) 424

Eécosystème 53, 202, 222, 313,

439effet papillon 132égalité de deux objets 345encapsulation 100, 110, 114,

130, 240, 241, 377des méthodes 122

espace de nommage 129, 414

FFaçade 623Factory Method 623fichiers

.cpp en C++ 393

.h en C++ 393finalize 149, 186flux 487flux filtré 487fonctionnement de type

yoyo 240friend 126, 364fuite de mémoire 146

GGamma, Helm, Johnson et

Vlissides 623Gang des quatre 411, 623garbage collector 151, 155Gates, Bill 142, 324Gemstone 521généricité 90, 576

gestiond’exception 117, 295, 352,

406, 490mémoire 139, 144, 174

Gnutella 404Gosling, James 70graphe 566, 586

moléculaire 604

HHejlsberg, Anders 142héritage

addition de propriétés 226arbre versus graphe 248d’interfaces 377des attributs 223des flux 487des méthodes 230économie 230généralités 17, 58, 202, 511interprétation

ensembliste 227, 276justification 230, 267mécanisme 224public en C++ 247versus composition 229, 538virtuel en C++ 258

Hopfield, John 567HP 425HTML 424HTTP 423

IIBM 414, 425IDL (Interface Definition

Language) 413IDLJ (Interface Definition

Language Java) 414imbrication de classe 127, 190include 395indépendance logicielle 58, 117informatique

séquentielle 441ubiquitaire 405

Informix 500instance 12intégrité référentielle 508intelligence artificielle 226, 227interface 100, 122, 125, 352,

376, 407, 414, 496fichier 385graphique 322Observer 468versus implémentation 122,

376versus implémentation en

C++ 394Internet 101, 397, 402, 451Iona 414

JJacobson, Ivar 160Java 70JAX-RPC 423JDBC 504Jini 71, 421, 435Jobs, Steve 323JXTA 405

KKant 227Kauffman, Stuart A. 130, 597Kay, Alan 323, 324Kazaa 404KeyListener en Java 379, 382Khün, Thomas 227

Lleasing 422liaison 603LIFO (Last-In First-Out) 139LISP 153liste liée 570lookup 421

Mmachine de von Neumann 442match de football 202, 268Memento 623

Page 21: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Index 647

mémoireassociative 567cache 137compactage 153fuite 146pile 85, 138, 170, 174, 191,

193, 236, 364, 569RAM 10, 136, 137, 240, 357,

486tas 145, 170, 174, 193, 236,

289, 321, 361, 569message 98, 175

asynchrone 451envoi 66, 170, 405, 419généralités 15, 60synchrone 451

méthodeabstraite 315, 377appel 13, 77argument 64d’accès 112définition 11, 14main 60message 98private 122public 122redéfinition 266run 446signature 98virtuelle 288

pure 315Meyer, Bertrand 66, 143Microsoft 160, 423Minsky, Marvin 226, 227, 567molécule 600MouseListener en Java 378multihéritage 248, 384, 546

d’interfaces 255en C++ 249

multitâche 443multithreading 206, 343, 379

définition 443généralités 139join 461

par composition 448par héritage 448priorité 452sleep 452start 448suspension 452synchronisation 451, 454

multi-tiers 403

NNapster 404new 137, 145, 312, 316nœud 567Nygaard, Kristen 52

OObjectStore 521objet

affectation 362clonage 350, 354, 355composite 8composition 62cycle de vie 10, 144dépendance 466distribué 102, 402, 406, 451état 9intégrité 114interaction 14, 58, 60, 125persistance 486référent 5sauvegarde 367versus procédural 78, 117,

144Observer 623ODBC (Open DataBase

Connectivity) 504ODMG (Object Data

Management Group) 522OleDb 506OMG (Objet Management

Group) 160, 413OMT (Object Modelling

Technique) 160

OOD (Object Oriented Design) 160

OOSE (Object Oriented Software Engineering) 160

OQL (Objet Query Language) 518, 522

Oracle 500, 519OrbixWeb 414override 275, 278, 319, 389

Ppackage 128, 414parallélisme 442passage

par référent 96par valeur 85, 96

patternAbstract Factory 623Bridge 623Façade 623Factory Method 623Observer 623Proxy 623Singleton 623

peer-to-peer 404Piaget, Jean 227Poet 521pointeur 86, 140, 170polymorphisme 255, 268, 389,

545Corba 419et casting 298généralités 18, 98, 322mécanisme 267, 293par défaut 285RMI 420

principede localité 137de substitution 226, 228,

284, 294private 109, 117, 126programmation

événementielle 466

Page 22: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

La programmation orientée objet648

protected 128Proxy 623proxy 421, 427public 109, 117, 126

Rramasse-miettes 92, 151, 155,

186, 195, 365Rational 160

Rose 160, 175, 249, 365réacteur chimique 597réactions chimiques 607redéfinition des méthodes 275,

378référent 5, 91, 145, 149, 170,

174, 289, 347, 387, 448en C++ 86fou 146, 148

registre 408, 411relation

1-n 507n-n 510

répertoire 81réseau 566

de Hopfield 567de neurones 227, 442, 566génétique 566immunitaire 566

réutilisation 230Riel, Arthur J. 108RMI (Remote Method

Invocation) 70, 403, 406, 422

robustesse 406rôles 176RTTI (Run-Time Type

Information) 272Rumbaugh, James 160Runnable en Java 379RUP (Rational Unified

Process) 165

Ssauvegarde d’objet 367

schéma XML 424sciences cognitives 19, 567sémaphore 458sérialisation 494services web 143, 423, 425seti@home 402signature 255, 376

de méthode 122Simula 52, 323Singleton 623skeleton 410, 411Smalltalk

voir aussi Squeak 323Soap 427, 428sous-classe 224SQL 500SQL3 518, 519Squeak

voir aussi Smalltalk 324squelette de code 203stabilité du logiciel 117, 119,

123, 377, 397Stroustrup, Bjarne 89, 297, 576structure en C# 142, 170, 190,

291, 368, 390stub 410, 411, 415Sun 402, 423, 425super 244, 276superclasse 222surcharge d’opérateur 361, 364,

492Sybase 500synchronisation des threads 454système

complexe 60, 130, 324, 567d’exploitation 322, 443

Ttable 500

virtuelle en C++ 288tableau 568

d’objets 314, 341en C++ 281

taxonomie 225, 267

Taylor, David A. 60TCP/IP 397template 577, 579temporisation 487thread 443TogetherJ 165, 203, 207, 249traitement en surface et en

profondeur 357trio 2trois amigos 160typage

dynamique 281, 287, 293, 312

statique 281, 286, 293statique versus typage

dynamique 284, 318type

entier 12primitif 3, 62

UUDDI (Universal Description

Discovery and Integration) 435

UMLavantages 202

UML (Unified Modelling Language) 160, 162, 164, 230, 325, 365, 450, 579, 596

diagramme d’états-transitions 615

UML 2interface 392

Vvaleur 89Van Rossum, Guido 340Versant 521vie artificielle 442virtual 272, 273, 286, 389virtual/override 291Visibroker 414Visitor 623

Page 23: e Hugues Bersini Membre de l’Académie Royale de Belgique ... · les illustrant d’exemples empruntant aux technologies les plus populaires : Java et C#, C++, Python, PHP 5, UML

Index 649

von Neumann, John 442

WW3 423Walter Fontana 596, 597

WDSL 425, 435Web sémantique 423WebSphere 414Windows 324Wittgenstein 18

XXerox PARC 324XML 422, 424