La programmation orientée objet
Cours et exercices en UML2, Python, PHP, C#, C++ et Java (y compris Android)
Hugues Bersini
Eyrolles
Chapitre 1
Principes de base : quel objet pour l'informatique ?1
Le trio <entité, attribut, valeur>2
Stockage des objets en mémoire
2
Types primitifs4
Le référent d'un objet5
Plusieurs référents pour un même objet6
L'objet dans sa version passive
7
L'objet et ses constituants7
Objet composite8
Dépendance sans composition9
L'objet dans sa version active
9
Activités des objets9
Les différents états d'un objet9
Les changements d'état : qui en est la cause ?10
Comment relier les opérations et les attributs ?10
Introduction à la notion de classe
11
Méthodes et classes11
Sur quel objet précis s'exécute la méthode ?13
Des objets en interaction
14
Comment les objets communiquent14
Envoi de messages15
Identification des destinataires de message15
Des objets soumis à une hiérarchie
16
Du plus général au plus spécifique16
Dépendance contextuelle du bon niveau taxonomique17
Polymorphisme
18
Héritage bien reçu18
Exercices19
Chapitre 2
Un objet sans classe... n'a pas de classe21
Constitution d'une classe d'objets
22
Définition d'une méthode de la classe : avec ou sans retour23
Identification et surcharge des méthodes par leur signature24
La classe comme module fonctionnel
26
Différenciation des objets par la valeur des attributs26
Le constructeur26
Mémoire dynamique, mémoire statique28
La classe comme garante de son bon usage
29
La classe comme module opérationnel
30
Mémoire de la classe et mémoire des objets30
Méthodes de la classe et des instances32
Un premier petit programme complet dans les cinq langages
32
En Java33
En C#35
En C++37
En Python40
En PHP42
La classe et la logistique de développement
45
Classes et développement de sous-ensembles logiciels45
Classes, fichiers et répertoires45
Exercices
46
Chapitre 3
Du faire savoir au savoir-faire du procédural à l'OO51
Objectif objet : les aventures de l'OO
52
Argumentation pour l'objet52
Transition vers l'objet52
Mise en pratique
53
Simulation d'un écosystème53
Analyse
53
Analyse procédurale53
Fonctions principales54
Conception
55
Conception procédurale55
Conception objet55
Conséquences de l'orientation objet
56
Les acteurs du scénario56
Indépendance de développement et dépendance fonctionnelle57
Petite allusion (anticipée) à l'héritage58
La collaboration des classes deux à deux58
Chapitre 4
Ici Londres : les objets parlent aux objets59
Envois de messages
60
Association de classes
61
Dépendance de classes
63
Réaction en chaîne de messages
66
Exercices
67
Chapitre 5
Collaboration entre classes69
Pour en finir avec la lutte des classes
70
La compilation Java : effet domino
70
En C(...), Python, PHP ou C++
71
De l'association unidirectionnelle à l'association bidirectionnelle
73
Auto-association
76
Paquets et espaces de noms
78
Exercices
81
Chapitre 6
Méthodes ou messages ?83
Passage d'arguments prédéfinis dans les messages
84
En Java84
Résultat
84
En C(...)85
Résultat
86
En C++86
Résultat
87
En Python87
Résultat
88
En PHP88
Passage d'argument objet dans les messages
89
En Java89
Résultat
90
En C(...)91
Résultat
92
En PHP93
En C++94
Résultat passage par valeur
95
Résultat passage par référent
95
En Python96
Résultat
96
Une méthode est-elle d'office un message ?
97
Même message, plusieurs méthodes97
Nature et rôle, type, classe et interface : quelques préalables97
Interface : liste de signatures de méthodes disponibles98
Des méthodes strictement internes99
La mondialisation des messages
100
Message sur Internet100
L'informatique distribuée101
Exercices101
Chapitre 7
L'encapsulation des attributs107
Accès aux attributs d'un objet
108
Accès externe aux attributs108
Cachez ces attributs que je ne saurais voir108
Encapsulation des attributs109
En Java
109
En C++
110
En C(...)
111
En PHP
112
En Python
113
Encapsulation : pour quoi faire ?
114
Pour préserver l'intégrité des objets114
La gestion d'exception115
Pour cloisonner leur traitement117
Pour pouvoir faire évoluer leur traitement en douceur117
La classe : enceinte de confinement119
Exercices
119
Chapitre 8
Les classes et leur jardin secret121
Encapsulation des méthodes
122
Interface et implémentation122
Toujours un souci de stabilité123
Signature d'une classe : son interface125
Les niveaux intermédiaires d'encapsulation
126
Classes amies
126
Une classe dans une autre
127
Utilisation des paquets
128
Exercices
130
Chapitre 9
Vie et mort des objets131
Question de mémoire
132
L'OO coûte cher en mémoire133
Qui se ressemble s'assemble : le principe de localité133
Les objets intermédiaires134
Mémoire pile134
En C++
136
C(...)
137
Disparaître de la mémoire comme de la vie réelle138
Mémoire tas139
C++ : le programmeur est le seul maître à bord
139
La mémoire a des fuites141
En Java, C(...), Python et PHP : la chasse au gaspi
143
En Java143
C(...)144
En PHP145
Le ramasse-miettes (ou garbage collector)145
Des objets qui se mordent la queue146
En Python147
Exercices
150
Chapitre 10
UML155
Diagrammes UML
156
Représentation graphique standardisée
156
Du tableau noir à l'ordinateur
157
Programmer par cycles courts en superposant les diagrammes
159
Diagramme de classe et diagramme de séquence
160
Diagramme de classe
161
Une classe161
En Java : UML1.java
161
En C(...) : UML1.cs
162
En C++ : UML1.cpp
162
En Python : UML1.py
163
En PHP : UML1.php
164
Similitudes et différences entre les langages164
Association entre classes165
En Java : UML2.java
165
En C(...) : UML2.cs
166
En C++ : UML 2.cpp
167
En Python : UML 2.py
168
En PHP : UML2.php
169
Similitudes et différences entre les langages169
Pas d'association sans message170
Rôles et cardinalité171
Dépendance entre classes179
Composition180
En Java181
UML3.java
182
UML.3bis.java
184
En C#185
UML3.cs
186
UML3bis.cs
187
En C++188
UML3.cpp
189
UML3bis.cpp
191
En Python192
UML3.py
192
UML3bis.py
193
En PHP194
Classe d'association195
Les paquets196
Les bienfaits d'UML
197
Un premier diagramme de classe de l'écosystème197
Des joueurs de football qui font leurs classes197
Les avantages des diagrammes de classes197
Un diagramme de classe à faire, mais qui décrit une réalité complexe à exécuter.
199
Procéder de manière modulaire et incrémentale200
Diagramme de séquence
200
Diagramme d'états-trasitions
206
Exercices
210
Chapitre 11
Héritage217
Comment regrouper les classes dans des superclasses ?
218
Héritage des attributs
219
Pourquoi l'addition de propriétés ?222
L'héritage : du cognitif aux taxonomies222
Interprétation ensembliste de l'héritage223
Qui peut le plus peut le moins224
Héritage ou composition ?
224
Économiser en ajoutant des classes ?
225
Héritage des méthodes
226
Code Java229
Code C#230
Code C++231
Code Python233
Code PHP234
La recherche des méthodes dans la hiérarchie
235
Encapsulation protected
236
Héritage et constructeurs
237
Premier code Java237
Deuxième code Java238
Troisième code Java : le plus logique et le bon239
En C#240
En C++241
En Python242
En PHP242
Héritage public en C++
243
Le multihéritage
244
Ramifications descendantes et ascendantes244
Multihéritage en C++ et Python245
Code C++ illustrant le multihéritage
246
Code Python illustrant le multihéritage
247
Des méthodes et attributs portant un même nom dans des superclasses distinctes248
Code C++ illustrant un premier problème lié au multihéritage
248
En Python
250
Plusieurs chemins vers une même superclasse251
Code C++ : illustrant un deuxième problème lié au multihéritage
252
L'héritage virtuel254
Exercices
255
Chapitre 12
Redéfinition des méthodes261
La redéfinition des méthodes
262
Beaucoup de verbiage mais peu d'actes véritables
263
Un match de football polymorphique
264
La classe Balle265
En Java
265
En C++
266
En C(...)
266
En Python
266
En PHP
266
La classe Joueur266
En Java
266
En C++
267
En C(...)
268
En Python
269
En PHP
270
Précisons la nature des joueurs270
En Java
271
En C++
273
En C(...)
274
En Python
275
PHP
275
Passons à l'entraîneur276
En Java
276
En C++
277
En C(...)
278
En Python
278
PHP
278
Passons maintenant au bouquet final279
En Java
279
Un même ordre mais une exécution différente
280
C++ : un comportement surprenant
282
Polymorphisme : uniquement possible dans la mémoire tas
285
En C(...)
286
En Python
288
En PHP
289
Quand la sous-classe doit se démarquer pour marquer289
Les attaquants participent à un casting
290
Éviter les « mauvais castings »
291
En C++
292
En C(...)
293
Le casting a mauvaise presse
293
Redéfinition et encapsulation
295
Exercices
296
Chapitre 13
Abstraite, cette classe est sans objet307
De Canaletto à Turner
308
Des classes sans objet
308
Du principe de l'abstraction à l'abstraction syntaxique
309
Classe abstraite311
new et abstract incompatibles312
Abstraites de père en fils312
Un petit exemple dans quatre langages de programmation312
En java
313
En C(...)
314
En PHP
315
En C++
316
L'abstraction en Python317
Un petit supplément de polymorphisme
318
Les enfants de la balle318
Cliquez frénétiquement318
Le Paris-Dakar320
Le polymorphisme en UML320
Exercices
322
Exercice 13.11
330
Exercice 13.12
331
Chapitre 14
Clonage, comparaison et affectation d'objets333
Introduction à la classe Object
334
Une classe à compétence universelle334
Code Java illustrant l'utilisation de la classe Vector et innovation de Java 5334
Nouvelle version du code
335
Décortiquons la classe Object
336
Test d'égalité de deux objets
338
Code Java pour expérimenter la méthode equals(Object o)338
Égalité en profondeur341
Le clonage d'objets
343
Code Java pour expérimenter la méthode clone()343
Égalité et clonage d'objets en Python
347
Code Python pour expérimenter l'égalité et le clonage347
Égalité et clonage d'objets en PHP
348
Code PHP pour expérimenter l'égalité et le clonage348
Égalité, clonage et affectation d'objets en C++
350
Code C++ illustrant la duplication, la comparaison et l'affectation d'objets350
Traitons d'abord la mémoire tas354
Surcharge de l'opérateur d'affectation356
Comparaisons d'objets356
La mémoire pile357
Surcharge de l'opérateur de comparaison357
Dernière étape358
Code C++ de la classe O1 crée automatiquement par Rational Rose359
En C(...), un cocktail de Java et de C++
361
Pour les structures361
Pour les classes361
Code C(...)361
Exercices
367
Chapitre 15
Interfaces369
Interfaces : favoriser la décomposition et la stabilité
370
Java, C(...) et PHP : interface et héritage
370
Les trois raisons d'être des interfaces
372
Forcer la redéfinition372
Code Java illustrant l'interface Comparable
373
Code Java illustrant l'interface
ActionListener
374
Code Java illustrant l'interface KeyListener
376
Permettre le multihéritage378
La carte de visite de l'objet378
Code Java
379
Code C(...)
381
Code PHP384
Les interfaces dans UML 2
385
En C++ : fichiers .h et fichiers
.cpp
387
Interfaces : du local à Internet
390
Exercices
391
Chapitre
Distribution gratuite d'objets : pour services rendus sur le réseau395
Objets distribués sur le réseau : pourquoi ?
396
Faire d'Internet un ordinateur géant396
Répartition des données397
Répartition des utilisateurs et des responsables397
Peer-to-peer398
L'informatique ubiquitaire399
Robustesse400
RMI (Remote Method Invocation
400
Côté serveur401
Côté client402
RMIC : stub et skeleton404
Lancement du registre405
Corba (Common Object Request Broker Architecture)
406
Un standard : ça compte407
IDL407
Compilateur IDL vers Java408
Côté client409
Côté serveur411
Exécutons l'application Corba412
Corba n'est pas polymorphique413
Ajoutons un peu de flexibilité à tout cela
414
Corba : invocation dynamique versus invocation statique415
Jini415
XML : pour une dénomination universelle des services416
Les services web sur .Net
418
Code C(...) du service418
WDSL420
Création du proxy420
Code C(...) du client421
Soap (Simple Object Access Protocol)422
Invocation dynamique sous .Net422
Invocation asynchrone en .Net424
Mais où sont passés les objets ?426
Un annuaire des services XML universel : UDDI428
Services web versus RMI et Corba429
Services web versus Windows Communication Foundation (WCF)429
Exercices
430
Chapitre 17
Multithreading433
Informatique séquentielle
435
Multithreading
436
Implémentation en Java
437
Implémentation en C(...)
440
Implémentation en Python
442
L'effet du multithreading sur les diagrammes de séquence UML
443
Du multithreading aux applications distribuées
444
Des threads équirépartis
445
En Java445
En C(...)446
En Phyton446
Synchroniser les threads
447
En Java448
En C(...)449
En Python452
Exercices
455
Chapitre 18
Programmation événementielle459
Des objets qui s'observent
460
En Java
461
La plante461
Du côté du prédateur462
Du côté de la proie463
Finalement, du côté de la Jungle463
Résultat464
En C(...) : les délégués
464
Généralités sur les délégués dans .Net464
Retour aux observateurs et observables468
Tout d'abord, la plante
468
Du côté du prédateur
469
Du côté de la proie
470
Finalement, du côté de la Jungle
470
En Python : tout reste à faire
473
Un feu de signalisation plus réaliste
475
En Java476
Exercices
477
Chapitre 19
Persistance d'objets479
Sauvegarder l'état entre deux exécutions
480
Et que dure le disque dur480
Quatre manières d'assurer la persistance des objets480
Simple sauvegarde sur fichier
481
Utilisation des streams ou flux481
Qui sauve quoi ?482
En Java482
En C(...)484
En C++485
En Python486
En PHP487
Sauvegarder les objets sans les dénaturer : la sérialisation
488
En Java489
En C(...)491
En Python492
Contenu des fichiers de sérialisation : illisible493
Les bases de données relationnelles
493
SQL494
Une table, une classe494
Comment interfacer Java et C(...) aux bases de données496
En Java
497
En C(...)
499
Relations entre tables et associations entre classes501
Relation 1-n
502
Relation n-n
504
Dernier problème : l'héritage
505
Réservation de places de spectacles
506
Les bases de données relationnelles-objet
511
SQL3512
Les bases de données orientées objet
514
OQL515
Django et Python
516
LINQ
518
Premier exemple de LINQ agissant sur une collection d'objets519
Second exemple de LINQ agissant sur une base de données relationnelle521
Exercices
524
Chapitre 20
Et si on faisait un petit flipper ?527
Généralités sur le flipper et les GUI
528
Une petite animation en C(...)533
Une version simplifiée de cette même animation en Python539
Retour au Flipper
540
Code Java du Flipper543
Un petit tennis
553
Chapitre 21
Les graphes561
Le monde regorge de réseaux
562
Tout d'abord : juste un ensemble d'objets
563
Liste liée
565
En Java567
En C++569
La généricité en C++
571
La généricité en Java et C(...)
575
Passons aux graphes
581
Exercices
586
Chapitre 22
Petite chimie OO amusante591
Pourquoi de la chimie OO ?
592
Chimie computationnelle592
Chimie comme plate-forme didactique592
Une aide à la modélisation chimique592
Les diagrammes de classes du réacteur chimique
593
La classe Composant_Chimique593
Les classes Composant_Neutre et Composant_Charge
594
Les trois sous-classes de composants neutres
595
Les trois sous-classes de composants chargés
597
La classe NoeudAtomique598
La classe NoeudMoléculaire599
La classe Liaison599
Le graphe moléculaire599
Les règles de canonisation
601
Les réactions chimiques602
Une première réaction de croisement
603
Une autre réaction de croisement un peu plus sophistiquée
603
Une réaction d'ouverture de liaison
603
Réaction de transfert de charge
604
Réaction de type Ion-Molecule
604
Comment est calculée la cinétique réactionnelle
604
La classe Reaction
605
Les sous-classes de Reaction
606
Quelques résultats du simulateur606
Première simulation : une seule molécule produite
607
Deuxième simulation : plusieurs molécules produites
607
Troisième simulation : De nombreuses molécules complexes produites
608
Pourquoi un tel simulateur ?
609
La simulation immunologique en OO ?
609
Petite introduction au fonctionnement du système immunitaire609
Le diagramme UML d'états-transitions611
Chapitre 23
Programmation Java sous Android615
Un petit calculateur élémentaire
617
Animation avec balles colorées
620
Jeu Canon
628
Chapitre 24
Design patterns645
Introduction aux design patterns
646
De l'architecte à l'archiprogrammeur646
Les patterns « trucs et ficelles »
647
Le pattern Singleton648
Le pattern Adaptateur649
Le patterns Patron de méthode, Proxy, Observer et Memento650
Le pattern Flyweight651
Les patterns Builder et Prototype652
Le pattern Façade654
Les patterns qui se jettent à l'OO
655
Le pattern Command656
Le pattern Décorateur659
Le pattern Composite662
Le pattern Chain of responsability662
Les patterns Strategy, State et Bridge663
Index669