Conception et programmation orientées objet
Bertrand Meyer
Eyrolles
Partie A
Les problèmes1
1. La qualité du logiciel
3
1.1. Facteurs externes et internes3
1.2. Rappel des facteurs externes4
1.3. De la maintenance logicielle17
1.4. Concepts clés introduits dans ce chapitre20
1.5. Notes bibliographiques20
2. Critères d'orientation objet
23
2.1. À propos des critères23
2.2. Méthode et langage24
2.3. Implémentation et environnement33
2.4. Bibliothèques36
2.5. Pour une bande-annonce plus longue37
2.6. Notes bibliographiques et ressources objet37
Partie B
La route de l'orientation objet 39
3. Modularité
41
3.1. Cinq critères42
3.2. Cinq règles48
3.3. Cinq principes55
3.4. Concepts clés introduits dans ce chapitre65
3.5. Notes bibliographiques65
4. Approches de la réutilisabilité
69
4.1. Les objectifs de la réutilisabilité70
4.2. Ce que vous devriez réutiliser72
4.3. Répétition durant le développement logiciel76
4.4. Obstacles non techniques77
4.5. Le problème technique84
4.6. Cinq exigences sur les structures de module86
4.7. Structures modulaires traditionnelles91
4.8. Surcharge et généricité96
4.9. Concepts clés introduits dans ce chapitre101
4.10. Notes bibliographiques102
5. Vers la technologie objet
105
5.1. Les ingrédients du calcul105
5.2. Décomposition fonctionnelle107
5.3. Décomposition orientée objet118
5.4. Construction de logiciel orienté objet120
5.5. Problématique120
5.6. Concepts clés introduits dans ce chapitre122
5.7. Notes bibliographiques123
6. Types abstraits de données
125
6.1. Critères126
6.2. Variations d'implémentation126
6.3. Vers une vue abstraite des objets130
6.4. Formaliser la spécification134
6.5. Des types abstraits de données aux classes145
6.6. Au-delà du logiciel151
6.7. Sujets supplémentaires152
6.8. Concepts clés introduits dans ce chapitre163
6.9. Notes bibliographiques163
Partie C
Techniques orientées objet167
7. La structure statique : les classes
169
7.1. Le sujet n'est pas les objets169
7.2. Éviter la confusion classique170
7.3. Le rôle des classes173
7.4. Un système de types uniforme175
7.5. Une classe simple176
7.6. Conventions de base181
7.7. Le style orienté objet de calcul184
7.8. Exportations sélectives et rétention d'information194
7.9. Regrouper le tout197
7.10. Discussion206
7.11. Concepts clés introduits dans ce chapitre216
7.12. Notes bibliographiques217
8. La structure à l'exécution : les objets
219
8.1. Les objets220
8.2. Les objets comme outils de modélisation230
8.3. Manipuler les objets et les références233
8.4. Procédures de création236
8.5. Approfondir les références240
8.6. Opérations sur les références242
8.7. Objets composites et types expansés252
8.8. Attachement : sémantique par référence et par valeur258
8.9. Utiliser les références : bénéfices et dangers262
8.10. Discussion267
8.11. Concepts clés introduits dans ce chapitre273
8.12. Notes bibliographiques273
9. Gestion de la mémoire
275
9.1. La vie des objets275
9.2. L'approche décontractée286
9.3. Récupérer la mémoire : les problèmes288
9.4. Désallocation gérée par le programmeur289
9.5. L'approche au niveau composant292
9.6. Gestion automatique de la mémoire296
9.7. Le comptage de références297
9.8. Le ramasse-miettes299
9.9. Aspects pratiques du ramasse-miettes304
9.10. Un environnement avec gestion de la mémoire306
9.11. Concepts clés introduits dans ce chapitre309
9.12. Notes bibliographiques310
10. Généricité
311
10.1. Généralisations horizontale et verticale de type311
10.2. La nécessité de paramétrisation de type312
10.3. Classes génériques314
10.4. Tableaux319
10.5. Le coût de la généricité321
10.6. Discussion : ce n'est pas fini322
10.7. Concepts clés introduits dans ce chapitre323
10.8. Notes bibliographiques323
11. Conception par contrat : construire du logiciel fiable
325
11.1. Les mécanismes de base de la fiabilité326
11.2. À propos de la correction logicielle326
11.3. Exprimer une spécification328
11.4. Introduire des assertions dans les textes logiciels331
11.5. Préconditions et postconditions331
11.6. Contrat de fiabilité logicielle335
11.7. Travailler avec des assertions341
11.8. Invariants de classe354
11.9. Quand une classe est-elle correcte ?359
11.10. La connexion avec les ADT363
11.11. Une instruction d'assertion368
11.12. Invariants et variantes de boucle370
11.13. Utiliser les assertions377
11.14. Discussion386
11.15. Concepts clés introduits dans ce chapitre394
11.16. Notes bibliographiques395
11.17. Post scriptum : Le crash d'Ariane 5397
12. Quand le contrat est rompu : le traitement des exceptions
399
12.1. Concepts de base du traitement des exceptions399
12.2. Traitement des exceptions402
12.3. Un mécanisme d'exception406
12.4. Exemples de traitement d'exceptions409
12.5. La tâche d'une clause de récupération415
12.6. Traitement avancé des exceptions418
12.7. Discussion422
12.8. Concepts clés introduits dans ce chapitre423
12.9. Notes bibliographiques424
13. Mécanismes supplémentaires
425
13.1. Interface avec du logiciel non OO425
13.2. Passage d'arguments430
13.3. Instructions432
13.4. Expressions437
13.5. Chaînes441
13.6. Entrées et sorties442
13.7. Conventions lexicales442
13.8. Concepts clés introduits dans ce chapitre443
14. Introduction à l'héritage
445
14.1. Polygones et rectangles446
14.2. Polymorphisme454
14.3. Typage de l'héritage457
14.4. Liaison dynamique465
14.5. Caractéristiques et classe retardées467
14.6. Techniques de redéclaration475
14.7. Le sens de l'héritage478
14.8. Le rôle des classes retardées484
14.9. Discussion491
14.10. Concepts clés introduits dans ce chapitre500
14.11. Notes bibliographiques501
15. Héritage multiple
503
15.1. Exemples d'héritage multiple503
15.2. Renommer les caractéristiques518
15.3. Aplatir la structure524
15.4. Héritage répété526
15.5. Discussion545
15.6. Concepts clés introduits dans ce chapitre548
15.7. Notes bibliographiques548
16. Techniques d'héritage
551
16.1. Héritage et assertions551
16.2. La structure globale d'héritage562
16.3. Caractéristiques gelées564
16.4. Généricité contrainte567
16.5. La tentative d'affectation572
16.6. Typage et redéclaration576
16.7. Déclaration ancrée580
16.8. Héritage et rétention d'information586
16.9. Concepts clés introduits dans ce chapitre591
16.10. Note bibliographique592
17. Typage
593
17.1. Le problème du typage593
17.2. Typage statique : pourquoi et comment597
17.3. Covariance et rétention de descendance603
17.4. Premières approches de la validité de système610
17.5. Compter sur les types ancrés612
17.6. Analyse globale615
17.7. Attention aux appels cat polymorphes !618
17.8. Une évaluation621
17.9. L'accord parfait622
17.10. Concepts clés introduits dans ce chapitre623
17.11. Notes bibliographiques623
18. Objets globaux et constantes
625
18.1. Constantes de type de base626
18.2. Utilisation des constantes627
18.3. Constantes de type de classe628
18.4. Applications des routines à exécution unique630
18.5. Constantes de type chaine635
18.6. Valeurs uniques636
18.7. Discussion637
18.8. Concepts clés introduits dans ce chapitre641
18.9. Notes bibliographiques641
Partie D
Méthodologie orienté objet : bien appliquer la méthode643
19. De la méthodologie
645
19.1. Méthodologie logicielle : quoi et pourquoi645
19.2. Concevoir de bonnes règles : conseil aux conseillers646
19.3. De l'utilisation des métaphores653
19.4. De l'importance d'être humble654
19.5. Notes bibliographiques655
20. Schéma de conception : systèmes interactifs à écrans multiples
657
20.1. Systèmes à écrans multiples657
20.2. Une tentative simpliste659
20.3. Une solution fonctionnelle descendante660
20.4. Une critique de la solution663
20.5. Une architecture orientée objet665
20.6. Discussion674
20.7. Notes bibliographique674
21. Étude de cas d'héritage : « défaire » dans un système interactif
675
21.1. Perseverare diabolicum675
21.2. Trouver les abstractions679
21.3. Défaire-refaire à niveaux multiples684
21.4. Questions d'implémentation686
21.5. Une interface utilisateur pour défaire et refaire690
21.6. Discussion691
21.7. Notes bibliographiques694
22. Comment trouver les classes
697
22.1. Étudier un document d'exigences698
22.2. Les signaux de danger703
22.3. Heuristiques générales pour trouver les classes709
22.4. Autres sources de classes713
22.5. Réutilisation718
22.6. La méthode pour obtenir des classes719
22.7. Concepts clés introduits dans ce chapitre720
22.8. Notes bibliographiques721
23. Principes de conception des classes
723
23.1. Effets de bord dans les fonctions724
23.2. Combien d'arguments par caractéristique ?739
23.3. Taille de classe : l'approche de la liste de commissions745
23.4. Structures de données actives749
23.5. Exportation sélective768
23.6. Traiter les cas anormaux769
23.7. Évolution de classe : la clause obsolète774
23.8. Documenter une classe et un système775
23.9. Concepts clés introduits dans ce chapitre778
23.10. Notes bibliographiques778
24. Bien utiliser l'héritage
781
24.1. Comment ne pas utiliser l'héritage781
24.2. Préféreriez-vous acheter ou hériter ?784
24.3. Une application : la technique du handle789
24.4. Taxomanie791
24.5. Utiliser l'héritage : une taxonomie de la taxonomie793
24.6. Un mécanisme, ou plusieurs ?804
24.7. Héritage de sous-type et rétention de descendant806
24.8. Héritage d'implémentation814
24.9. Héritage de service817
24.10. Critères multiples et héritage de vue821
24.11. Comment développer des structures d'héritage827
24.12. Une vision d'ensemble : bien utiliser l'héritage830
24.13. Concepts clés introduits dans ce chapitre831
24.14. Notes bibliographiques832
24.15. Une brève histoire de la taxonomie832
25. Techniques utiles
841
25.1. Philosophie de conception841
25.2. Classes842
25.3. Techniques d'héritage843
26. Un penchant pour le style
845
26.1. De l'importance du style845
26.2. Choisir les bons noms849
26.3. Utiliser des constantes854
26.4. Commentaires d'en-tête et clauses d'indexation855
26.5. Mise en pages et présentation861
26.6. Fontes869
26.7. Notes bibliographiques870
27. Analyse orientée objet
873
27.1. Les objectifs de l'analyse873
27.2. La nature changeante de l'analyse876
27.3. La contribution de la technologie objet876
27.4. Programmer une station de télévision877
27.5. Exprimer l'analyse : vues multiples883
27.6. Méthodes d'analyse887
27.7. La notation d'objets métiers889
27.8. Bibliographie892
28. Le processus de construction logicielle
893
28.1. Groupes893
28.2. Ingénierie concurrente894
28.3. Étapes et tâches896
28.4. Le modèle de groupe du cycle de vie logiciel896
28.5. Généralisation898
28.6. Intégration et réversibilité900
28.7. Chez nous, tout est comme le visage902
28.8. Concepts clés introduits dans ce chapitre903
28.9. Notes bibliographiques904
29. Enseigner la méthode
905
29.1. Formation industrielle905
29.2. Cours d'introduction907
29.3. Autres cours910
29.4. Vers une nouvelle pédagogie logicielle912
29.5. Un plan orienté objet916
29.6. Concepts clés introduits dans ce chapitre918
29.7. Notes bibliographiques918
Partie E
Aspects avancés919
30. Concurrence, répartition, client-serveur et Internet
921
30.1. Un aperçu921
30.2. L'essort de la concurrence923
30.3. Des processus aux objets927
30.4. Introduction de l'exécution concurrente934
30.5. Questions de synchronisation946
30.6. Accès aux objets séparés951
30.7. Conditions d'attente960
30.8. Demander un service spécial967
30.9. Exemples972
30.10. Vers une règle de preuve988
30.11. Résumé du mécanisme990
30.12. Discussion993
30.13. Concepts clés introduits dans ce chapitre997
30.14. Notes bibliographiques998
31. Persistance d'objets et bases de données
1003
31.1. Persistance dans le langage1003
31.2. Au-delà de la fermeture de persistance1005
31.3. Évolution de schéma1007
31.4. De la persistance aux bases de données1013
31.5. Interopérabilité objet-relationnel1014
31.6. Fondements des bases de données orientées objet1016
31.7. Systèmes de bases de données OO : Exemples1022
31.8. Discussion : au-delà des bases de données1024
31.9. Concepts clés introduits dans ce chapitre1027
31.10. Notes bibliographiques1027
32. Quelques techniques OO pour applications graphiques interactives
1029
32.1. Outils requis1030
32.2. Portabilité et adaptation de la plate-forme1033
32.3. Abstractions graphiques1035
32.4. Mécanismes d'interaction1037
32.5. Traitement des événements1039
32.6. Un modèle mathématique1043
32.7. Notes bibliographiques1043
Partie F
Appliquer la méthode dans divers langages et environnements1045
33. Programmation OO et Ada
1047
33.1. Rappel historique1047
33.2. Paquetages1049
33.3. Une implémentation de pile1049
33.4. Cacher la représentation : l'histoire privée1053
33.5. Exceptions1055
33.6. Tâches1058
33.7. D'ADA à ADA 951059
33.8. Concepts clés introduits dans ce chapitre1064
33.9. Notes bibliographiques1064
34. Émulation de la technologie objet dans les environnements non OO
1067
34.1. Niveaux de prise en compte par le langage1067
34.2. Programmation orientée objet en pascal ?1069
34.3. Fortran1070
34.4. Programmation orientée objet et C1073
34.5. Notes bibliographiques1080
35. De Simula à Java et au-delà : principaux langages et environnement OO
1081
35.1. Simula1081
35.2. Smalltalk1094
35.3. Extensions lisp1097
35.4. Extensions C1098
35.5. Java1103
35.6. Autres langages OO1104
35.7. Notes bibliographiques1104
Partie G
Faire les choses bien1109
36. Un environnement orienté objet
1111
36.1. Composants1111
36.2. Langage1112
36.3. Technologie de compilation1112
36.4. Outils1116
36.5. Bibliothèques1119
36.6. Mécanismes d'interface1120
36.7. Notes bibliographiques1127
Épilogue : le langage dévoilé
1129
Partie H
Annexes1131
A. Extraits des bibliothèques Base
1133
B. Généricité et héritage
1135
C. Glossaire de la technologie objet
1155
D. Bibliographie
1167
Index
1193