Inhalt | 7 |
1 Einleitung | 13 |
1.1 Was ist Objektorientierung? | 13 |
1.2 Hallo liebe Zielgruppe | 14 |
1.3 Was bietet dieses Buch (und was nicht)? | 15 |
1.3.1 Bausteine des Buchs | 16 |
1.3.2 Crosscutting Concerns: übergreifende Anliegen | 19 |
1.3.3 Die Rolle von Programmiersprachen | 20 |
1.4 Warum überhaupt Objektorientierung? | 22 |
1.4.1 Gute Software: Was ist das eigentlich? | 23 |
1.4.2 Die Rolle von Prinzipien | 24 |
1.4.3 Viele mögliche Lösungen für ein Problem | 25 |
2 Die Basis der Objektorientierung | 27 |
2.1 Die strukturierte Programmierung als Vorläufer der Objektorientierung | 28 |
2.2 Die Kapselung von Daten | 31 |
2.3 Polymorphie | 32 |
2.4 Die Vererbung | 34 |
2.4.1 Vererbung der Spezifikation | 34 |
2.4.2 Erben von Umsetzungen (Implementierungen) | 35 |
3 Die Prinzipien des objektorientierten Entwurfs | 39 |
3.1 Prinzip 1: Prinzip einer einzigen Verantwortung | 40 |
3.2 Prinzip 2: Trennung der Anliegen | 45 |
3.3 Prinzip 3: Wiederholungen vermeiden | 47 |
3.4 Prinzip 4: Offen für Erweiterung, geschlossen für Änderung | 50 |
3.5 Prinzip 5: Trennung der Schnittstelle von der Implementierung | 53 |
3.6 Prinzip 6: Umkehr der Abhängigkeiten | 56 |
3.6.1 Umkehrung des Kontrollflusses | 60 |
3.7 Prinzip 7: Mach es testbar | 62 |
4 Die Struktur objektorientierter Software | 65 |
4.1 Die Basis von allem: das Objekt | 65 |
4.1.1 Eigenschaften von Objekten: Objekte als Datenkapseln | 67 |
4.1.2 Operationen und Methoden von Objekten | 74 |
4.1.3 Kontrakte: Ein Objekt trägt Verantwortung | 79 |
4.1.4 Die Identität von Objekten | 81 |
4.1.5 Objekte haben Beziehungen | 83 |
4.2 Klassen: Objekte haben Gemeinsamkeiten | 84 |
4.2.1 Klassen sind Modellierungsmittel | 84 |
4.2.2 Kontrakte: die Spezifikation einer Klasse | 88 |
4.2.3 Klassen sind Datentypen | 92 |
4.2.4 Klassen sind Module | 102 |
4.2.5 Sichtbarkeit von Daten und Methoden | 105 |
4.2.6 Klassenbezogene Methoden und Attribute | 112 |
4.2.7 Singleton-Methoden: Methoden für einzelne Objekte | 116 |
4.3 Beziehungen zwischen Objekten | 117 |
4.3.1 Rollen und Richtung einer Assoziation | 119 |
4.3.2 Navigierbarkeit | 120 |
4.3.3 Multiplizität | 120 |
4.3.4 Qualifikatoren | 125 |
4.3.5 Beziehungsklassen, Attribute einer Beziehung | 126 |
4.3.6 Implementierung von Beziehungen | 128 |
4.3.7 Komposition und Aggregation | 129 |
4.3.8 Attribute | 132 |
4.3.9 Beziehungen zwischen Objekten in der Übersicht | 133 |
4.4 Klassen von Werten und Klassen von Objekten | 133 |
4.4.1 Werte in den objektorientierten Programmiersprachen | 134 |
4.4.2 Entwurfsmuster »Fliegengewicht« | 137 |
4.4.3 Aufzählungen (Enumerations) | 140 |
4.4.4 Identität von Objekten | 147 |
5 Vererbung und Polymorphie | 155 |
5.1 Die Vererbung der Spezifikation | 155 |
5.1.1 Hierarchien von Klassen und Unterklassen | 155 |
5.1.2 Unterklassen erben die Spezifikation von Oberklassen | 157 |
5.1.3 Das Prinzip der Ersetzbarkeit | 161 |
5.1.4 Abstrakte Klassen, konkrete Klassen und Schnittstellen-Klassen | 167 |
5.1.5 Vererbung der Spezifikation und das Typsystem | 176 |
5.1.6 Sichtbarkeit im Rahmen der Vererbung | 183 |
5.2 Polymorphie und ihre Anwendungen | 193 |
5.2.1 Dynamische Polymorphie am Beispiel | 195 |
5.2.2 Methoden als Implementierung von Operationen | 200 |
5.2.3 Anonyme Klassen | 208 |
5.2.4 Single und Multiple Dispatch | 210 |
5.2.5 Die Tabelle für virtuelle Methoden | 228 |
5.3 Die Vererbung der Implementierung | 239 |
5.3.1 Überschreiben von Methoden | 241 |
5.3.2 Das Problem der instabilen Basisklassen | 249 |
5.3.3 Problem der Gleichheitsprüfung bei geerbter Implementierung | 254 |
5.4 Mehrfachvererbung | 261 |
5.4.1 Mehrfachvererbung: Möglichkeiten und Probleme | 261 |
5.4.2 Delegation statt Mehrfachvererbung | 268 |
5.4.3 Mixin-Module statt Mehrfachvererbung | 271 |
5.4.4 Die Problemstellungen der Mehrfachvererbung | 273 |
5.5 Statische und dynamische Klassifizierung | 289 |
5.5.1 Dynamische Änderung der Klassenzugehörigkeit | 290 |
5.5.2 Entwurfsmuster »Strategie« statt dynamischer Klassifizierung | 294 |
6 Persistenz | 299 |
6.1 Serialisierung von Objekten | 299 |
6.2 Speicherung in Datenbanken | 300 |
6.2.1 Relationale Datenbanken | 300 |
6.2.2 Struktur der relationalen Datenbanken | 301 |
6.2.3 Begriffsdefinitionen | 302 |
6.3 Abbildung auf relationale Datenbanken | 307 |
6.3.1 Abbildung von Objekten in relationalen Datenbanken | 307 |
6.3.2 Abbildung von Beziehungen in relationalen Datenbanken | 311 |
6.3.3 Abbildung von Vererbungsbeziehungen auf eine relationale Datenbank | 315 |
6.4 Normalisierung und Denormalisierung | 320 |
6.4.1 Die erste Normalform: Es werden einzelne Fakten gespeichert | 322 |
6.4.2 Die zweite Normalform: Alles hängt vom ganzen Schlüssel ab | 323 |
6.4.3 Die dritte Normalform: Keine Abhängigkeiten unter den Nichtschlüssel-Spalten | 326 |
6.4.4 Die vierte Normalform: Trennen unabhängiger Relationen | 330 |
6.4.5 Die fünfte Normalform: Einfacher geht’s nicht | 332 |
7 Abläufe in einem objektorientierten System | 337 |
7.1 Erzeugung von Objekten mit Konstruktoren und Prototypen | 338 |
7.1.1 Konstruktoren: Klassen als Vorlagen für ihre Exemplare | 338 |
7.1.2 Prototypen als Vorlagen für Objekte | 342 |
7.1.3 Entwurfsmuster »Prototyp« | 348 |
7.2 Fabriken als Abstraktionsebene für die Objekterzeugung | 349 |
7.2.1 Statische Fabriken | 352 |
7.2.2 Abstrakte Fabriken | 355 |
7.2.3 Konfigurierbare Fabriken | 360 |
7.2.4 Registraturen für Objekte | 364 |
7.2.5 Fabrikmethoden | 368 |
7.2.6 Erzeugung von Objekten als Singletons | 377 |
7.2.7 Dependency Injection | 386 |
7.3 Objekte löschen | 397 |
7.3.1 Speicherbereiche für Objekte | 397 |
7.3.2 Was ist eine Garbage Collection? | 399 |
7.3.3 Umsetzung einer Garbage Collection | 400 |
7.4 Objekte in Aktion und in Interaktion | 412 |
7.4.1 UML: Diagramme zur Beschreibung von Abläufen | 412 |
7.4.2 Nachrichten an Objekte | 421 |
7.4.3 Iteratoren und Generatoren | 421 |
7.4.4 Funktionsobjekte und ihr Einsatz als Eventhandler | 433 |
7.4.5 Kopien von Objekten | 442 |
7.4.6 Sortierung von Objekten | 452 |
7.5 Kontrakte: Objekte als Vertragspartner | 455 |
7.5.1 Überprüfung von Kontrakten | 455 |
7.5.2 Übernahme von Verantwortung: Unterklassen in der Pflicht | 457 |
7.5.3 Prüfungen von Kontrakten bei Entwicklung und Betrieb | 470 |
7.6 Exceptions: Wenn der Kontrakt nicht eingehalten werden kann | 471 |
7.6.1 Exceptions in der Übersicht | 472 |
7.6.2 Exceptions und der Kontrollfluss eines Programms | 478 |
7.6.3 Exceptions im Einsatz bei Kontraktverletzungen | 484 |
7.6.4 Exceptions als Teil eines Kontraktes | 488 |
7.6.5 Der Umgang mit Checked Exceptions | 493 |
7.6.6 Exceptions in der Zusammenfassung | 501 |
8 Module und Architektur | 503 |
8.1 Module als konfigurierbare und änderbare Komponenten | 503 |
8.1.1 Relevanz der Objektorientierung für Softwarearchitektur | 503 |
8.1.2 Erweiterung von Modulen | 505 |
8.2 Die Präsentationsschicht: Model, View, Controller (MVC) | 511 |
8.2.1 Das Beobachter-Muster als Basis von MVC | 512 |
8.2.2 MVC in Smalltalk: Wie es ursprünglich mal war | 513 |
8.2.3 MVC: Klärung der Begriffe | 514 |
8.2.4 MVC in Webapplikationen: genannt »Model 2« | 518 |
8.2.5 MVC mit Fokus auf Testbarkeit: Model-View-Presenter | 523 |
9 Aspekte und Objektorientierung | 527 |
9.1 Trennung der Anliegen | 527 |
9.1.1 Kapselung von Daten | 531 |
9.1.2 Lösungsansätze zur Trennung von Anliegen | 532 |
9.2 Aspektorientiertes Programmieren | 539 |
9.2.1 Integration von aspektorientierten Verfahren in Frameworks | 539 |
9.2.2 Bestandteile der Aspekte | 541 |
9.2.3 Dynamisches Crosscutting | 541 |
9.2.4 Statisches Crosscutting | 548 |
9.3 Anwendungen der Aspektorientierung | 550 |
9.3.1 Zusätzliche Überprüfungen während der Übersetzung | 551 |
9.3.2 Logging | 552 |
9.3.3 Transaktionen und Profiling | 553 |
9.3.4 Design by Contract | 556 |
9.3.5 Introductions | 559 |
9.3.6 Aspektorientierter Observer | 560 |
9.4 Annotations | 562 |
9.4.1 Zusatzinformation zur Struktur eines Programms | 563 |
9.4.2 Annotations im Einsatz in Java und C# | 565 |
9.4.3 Beispiele für den Einsatz von Annotations | 566 |
10 Objektorientierung am Beispiel: Eine Web-Applikation mit PHP 5 und Ajax | 573 |
10.1 OOP in PHP | 574 |
10.1.1 Klassen in PHP | 574 |
10.1.2 Dynamische Natur von PHP | 578 |
10.2 Das entwickelte Framework - Trennung der Anliegen - Model View Controller | 578 |
10.2.1 Trennung der Daten von der Darstellung | 579 |
10.3 Ein Dienst in PHP | 580 |
10.3.1 Datenmodell | 581 |
10.3.2 Dienste - Version 1 | 583 |
10.4 Ein Klient in Ajax | 586 |
10.4.1 Bereitstellung der Daten | 587 |
10.4.2 Darstellung der Daten | 589 |
10.5 Ein Container für Dienste in PHP | 598 |
10.5.1 Dispatcher | 601 |
10.5.2 Fabrik | 603 |
10.5.3 Dependency Injection | 604 |
10.5.4 Sicherheit | 610 |
10.6 Ein Klient ohne JavaScript | 615 |
10.7 Was noch übrigbleibt | 619 |
A Verwendete Programmiersprachen | 623 |
A.1 C++ | 623 |
A.2 Java | 626 |
A.3 C# | 629 |
A.4 JavaScript | 629 |
A.5 CLOS | 632 |
A.6 Python | 635 |
A.7 Ruby | 637 |
B Literaturverzeichnis | 641 |
B.1 Allgemeine Bücher zur Softwareentwicklung | 641 |
B.2 Bücher über die UML und die verwendeten Programmiersprachen | 643 |
Index | 645 |