|
Übersicht |
8 |
|
|
Inhaltsverzeichnis |
10 |
|
|
1 Einleitung |
20 |
|
|
1.1 Über dieses Buch |
20 |
|
|
1.1.1 Motivation |
20 |
|
|
1.1.2 Was leistet dieses Buch und was nicht? |
21 |
|
|
1.1.3 Wie und was soll mithilfe des Buchs gelernt werden? |
21 |
|
|
1.1.4 Wer sollte dieses Buch lesen? |
23 |
|
|
1.2 Aufbau des Buchs |
23 |
|
|
1.2.1 Gliederung des Buchs |
24 |
|
|
1.2.2 Kapitelübersicht |
25 |
|
|
1.3 Konventionen |
30 |
|
|
1.4 Danksagungen |
32 |
|
|
Teil I Java-Grundlagen, Analyse und Design |
34 |
|
|
2 Professionelle Arbeitsumgebung |
36 |
|
|
2.1 Vorteile von IDEs am Beispiel von Eclipse |
36 |
|
|
2.2 Projektorganisation |
37 |
|
|
2.3 Einsatz von Versionsverwaltungen |
39 |
|
|
2.3.1 Arbeiten mit Versionsverwaltungen |
42 |
|
|
2.3.2 Tagging und Branching |
43 |
|
|
2.3.3 CVS und SVN im Vergleich |
46 |
|
|
2.4 Einsatz eines Unit-Test-Frameworks |
47 |
|
|
2.4.1 Das JUnit-Framework |
48 |
|
|
2.4.2 Schreiben und Ausführen von Tests |
50 |
|
|
2.5 Einsatz eines IDE-unabhängigen Build-Prozesses |
53 |
|
|
2.5.1 Motivation für ein IDE-unabhängiges Build-System |
53 |
|
|
2.5.2 Ant-Build |
54 |
|
|
2.6 Weiterführende Literatur |
63 |
|
|
3 Objektorientiertes Design |
64 |
|
|
3.1 OO-Grundlagen |
65 |
|
|
3.1.1 Grundbegriffe |
65 |
|
|
3.1.2 Beispielentwurf: Ein Zähler |
73 |
|
|
3.1.3 Diskussion der OO-Grundgedanken |
80 |
|
|
3.1.4 Wissenswertes zum Objektzustand |
84 |
|
|
3.2 Grundlegende OO-Techniken |
93 |
|
|
3.2.1 Abstrakte Basisklassen |
93 |
|
|
3.2.2 Schnittstellen (Interfaces) |
95 |
|
|
3.2.3 Interfaces und abstrakte Basisklassen |
97 |
|
|
3.3 Vom imperativen zum objektorientierten Entwurf |
98 |
|
|
3.4 Fortgeschrittenere OO-Techniken |
102 |
|
|
3.4.1 Read-only-Interface |
103 |
|
|
3.4.2 Immutable-Klasse |
109 |
|
|
3.4.3 Delegation statt Vererbung |
114 |
|
|
3.4.4 Marker-Interface |
118 |
|
|
3.4.5 Konstantensammlungen, Aufzählungen und das Enum-Muster |
119 |
|
|
3.4.6 Value Object |
124 |
|
|
3.5 Formen der Varianz |
127 |
|
|
3.5.1 Grundlagen der Varianz |
127 |
|
|
3.5.2 Kovariante Rückgabewerte |
130 |
|
|
3.6 Generische Typen (Generics) |
132 |
|
|
3.6.1 Einführung |
132 |
|
|
3.6.2 Generics und Auswirkungen der Type Erasure |
137 |
|
|
3.6.3 Containerklassen: Generics und Varianz |
144 |
|
|
3.7 Weiterführende Literatur |
156 |
|
|
4 Java-Grundlagen |
158 |
|
|
4.1 Die Klasse Object |
158 |
|
|
4.1.1 Die Methode toString() |
160 |
|
|
4.1.2 Die Methode equals() |
164 |
|
|
4.2 Primitive Datentypen und Wrapper-Klassen |
175 |
|
|
4.2.1 Konvertierung von Werten |
176 |
|
|
4.2.2 Ausgabe und Verarbeitung von Zahlen |
182 |
|
|
4.3 Stringverarbeitung |
185 |
|
|
4.3.1 Die Klasse String |
185 |
|
|
4.3.2 Die Klassen StringBuffer und StringBuilder |
189 |
|
|
4.3.3 Ausgaben mit format() und printf() |
192 |
|
|
4.3.4 Die Klasse StringTokenizer |
194 |
|
|
4.3.5 Die Methode split() und das 1x1 der regulären Ausdrücke |
195 |
|
|
4.4 Datumsverarbeitung |
200 |
|
|
4.4.1 Fallstricke der Datums-APIs |
201 |
|
|
4.4.2 Das Date-API |
202 |
|
|
4.4.3 Das Calendar-API |
205 |
|
|
4.5 Interfaces und innere Klassen |
207 |
|
|
4.5.1 Interfaces |
207 |
|
|
4.5.2 Varianten innerer Klassen |
208 |
|
|
4.5.3 Designbeispiel mit inneren Klassen und Interfaces |
211 |
|
|
4.5.4 Lokal definierte Klassen und Interfaces |
213 |
|
|
4.6 Ein- und Ausgabe (I/O) |
216 |
|
|
4.6.1 Dateibehandlung und die Klasse File |
216 |
|
|
4.6.2 Ein- und Ausgabestreams |
223 |
|
|
4.6.3 Speichern und Laden von Daten und Objekten |
230 |
|
|
4.6.4 Grundlagen der Netzwerkprogrammierung |
237 |
|
|
4.7 Fehlerbehandlung |
242 |
|
|
4.7.1 Exception Handling |
244 |
|
|
4.7.2 Assertions |
250 |
|
|
4.8 Weiterführende Literatur |
253 |
|
|
Teil II Bausteine stabiler Java-Applikationen |
254 |
|
|
5 Das Collections-Framework |
256 |
|
|
5.1 Datenstrukturen |
256 |
|
|
5.1.1 Wahl einer geeigneten Datenstruktur |
257 |
|
|
5.1.2 Arrays |
259 |
|
|
5.1.3 Das Interface Collection |
261 |
|
|
5.1.4 Listen und das Interface List |
266 |
|
|
5.1.5 Mengen und das Interface Set |
272 |
|
|
5.1.6 Grundlagen von hashbasierten Containern |
274 |
|
|
5.1.7 Grundlagen automatisch sortierender Container |
283 |
|
|
5.1.8 Die Methoden equals(), hashCode() und |
290 |
|
|
5.1.9 Konkrete Realisierungen von Mengen |
292 |
|
|
5.1.10 Schlüssel-Wert-Abbildungen und das Interface Map |
295 |
|
|
5.1.11 Erweiterungen am Beispiel der Klasse HashMap |
302 |
|
|
5.1.12 Entscheidungshilfe zur Wahl von Datenstrukturen |
305 |
|
|
5.2 Suchen, Sortieren und Filtern |
306 |
|
|
5.2.1 Suchen |
307 |
|
|
5.2.2 Sortieren mit Komparatoren |
309 |
|
|
5.2.3 Filtern von Collections |
315 |
|
|
5.3 Utility-Klassen und Hilfsmethoden |
321 |
|
|
5.3.1 Nützliche Hilfsmethoden |
322 |
|
|
5.3.2 Dekorierer synchronized, unmodifiable und |
323 |
|
|
5.3.3 Vordefinierte Algorithmen |
328 |
|
|
5.3.4 Design eines Zugriffsinterface |
331 |
|
|
5.4 Probleme im Collections-Framework |
335 |
|
|
5.4.1 Merkwürdigkeiten in Arrays |
335 |
|
|
5.4.2 Probleme von Stack, Queue und Deque |
337 |
|
|
5.5 Weiterführende Literatur |
340 |
|
|
6 Applikationsbausteine |
342 |
|
|
6.1 Einsatz von Bibliotheken am Beispiel |
342 |
|
|
6.2 Wertebereichs- und Parameterprüfungen |
347 |
|
|
6.2.1 Prüfung einfacher Wertebereiche und Wertemengen |
347 |
|
|
6.2.2 Prüfung komplexerer Wertebereiche |
351 |
|
|
6.3 Logging-Frameworks |
359 |
|
|
6.3.1 Apache log4j |
360 |
|
|
6.3.2 Tipps und Tricks zum Einsatz von Logging mit log4j |
367 |
|
|
6.4 Utility-Klassen zur Dateibehandlung |
375 |
|
|
6.4.1 Die Klasse FileUtils |
375 |
|
|
6.4.2 Die Klasse StreamUtils |
377 |
|
|
6.4.3 Implementierung von Stringstreams |
382 |
|
|
6.5 Konfigurationsparameter und -dateien |
384 |
|
|
6.5.1 Einlesen von Kommandozeilenparametern |
384 |
|
|
6.5.2 Verarbeitung von Properties |
393 |
|
|
6.5.3 Die Klasse Preferences |
399 |
|
|
6.5.4 Weitere Möglichkeiten zur Konfigurationsverwaltung |
401 |
|
|
7 Multithreading |
408 |
|
|
7.1 Threads und Runnables |
410 |
|
|
7.1.1 Definition der auszuführenden Aufgabe |
410 |
|
|
7.1.2 Start, Ausführung und Ende von Threads |
411 |
|
|
7.1.3 Lebenszyklus von Threads und Thread-Zustände |
413 |
|
|
7.2 Zusammenarbeit von Threads |
419 |
|
|
7.2.1 Konkurrierende Datenzugriffe |
419 |
|
|
7.2.2 Locks, Monitore und kritische Bereiche |
420 |
|
|
7.2.3 Deadlocks und Starvation |
425 |
|
|
7.2.4 Kritische Bereiche und das Interface Lock |
427 |
|
|
7.3 Kommunikation von Threads |
431 |
|
|
7.3.1 Kommunikation mit Synchronisation |
432 |
|
|
7.3.2 Kommunikation über die Methoden wait(), |
435 |
|
|
7.3.3 Abstimmung von Threads |
444 |
|
|
7.3.4 Unerwartete IllegalMonitorStateExceptions |
448 |
|
|
7.4 Das Java-Memory-Modell |
449 |
|
|
7.4.1 Sichtbarkeit |
450 |
|
|
7.4.2 Atomarität |
451 |
|
|
7.4.3 Reorderings |
453 |
|
|
7.5 Besonderheiten bei Threads |
456 |
|
|
7.5.1 Verschiedene Arten von Threads |
456 |
|
|
7.5.2 Exceptions in Threads |
458 |
|
|
7.5.3 Sicheres Beenden von Threads |
459 |
|
|
7.5.4 Zeitgesteuerte Ausführung |
463 |
|
|
7.6 Die Concurrency Utilities |
466 |
|
|
7.6.1 Concurrent Collections |
467 |
|
|
7.6.2 Das Executor-Framework |
476 |
|
|
7.7 Weiterführende Literatur |
487 |
|
|
8 Fortgeschrittene Java-Themen |
488 |
|
|
8.1 Crashkurs Reflection |
488 |
|
|
8.1.1 Grundlagen |
490 |
|
|
8.1.2 Zugriff auf Methoden und Attribute |
493 |
|
|
8.1.3 Spezialfälle |
498 |
|
|
8.2 Serialisierung |
501 |
|
|
8.2.1 Implementieren der Serialisierung |
501 |
|
|
8.2.2 Die Serialisierung anpassen |
506 |
|
|
8.2.3 Versionsverwaltung der Serialisierung |
510 |
|
|
8.2.4 Optimierung der Serialisierung |
513 |
|
|
8.3 Objektkopien und das Interface Cloneable |
518 |
|
|
8.3.1 Das Interface Cloneable |
519 |
|
|
8.3.2 Alternativen zur Methode clone() |
528 |
|
|
8.4 Internationalisierung |
530 |
|
|
8.4.1 Grundlagen |
531 |
|
|
8.4.2 Die Klasse Locale |
532 |
|
|
8.4.3 Die Klasse PropertyResourceBundle |
535 |
|
|
8.4.4 Formatierte Ein- und Ausgabe |
539 |
|
|
8.4.5 Zahlen und die Klasse NumberFormat |
540 |
|
|
8.4.6 Datumswerte und die Klasse DateFormat |
543 |
|
|
8.4.7 Textmeldungen und die Klasse MessageFormat |
548 |
|
|
8.5 Programmbausteine zur Internationalisierung |
550 |
|
|
8.5.1 Unterstützung mehrerer Datumsformate |
550 |
|
|
8.5.2 Nutzung mehrerer Sprachdateien |
555 |
|
|
8.6 Multithreading und Swing |
565 |
|
|
8.6.1 Crashkurs Event Handling in Swing |
565 |
|
|
8.6.2 Ausführen von Aktionen |
567 |
|
|
8.6.3 Die Klasse SwingWorker |
571 |
|
|
8.7 Garbage Collection |
575 |
|
|
8.7.1 Einflussfaktoren auf die Garbage Collection |
575 |
|
|
8.7.2 Algorithmen zur Garbage Collection |
579 |
|
|
8.7.3 Optimierungen der Garbage Collection |
581 |
|
|
8.7.4 Memory Leaks: Gibt es die auch in Java?! |
582 |
|
|
8.7.5 Objektzerstörung und finalize() |
584 |
|
|
8.8 Weiterführende Literatur |
586 |
|
|
9 Neuerungen in JDK 7 |
588 |
|
|
9.1 Erweiterungen der Sprache selbst |
588 |
|
|
9.2 Erweiterungen des NIO in JDK 7 |
596 |
|
|
9.2.1 Dateibehandlung in JDK 7 |
596 |
|
|
9.2.2 Asynchronous I/O |
602 |
|
|
9.3 Multithreading |
603 |
|
|
9.4 Neuerungen in AWT und Swing |
606 |
|
|
9.5 Collections |
607 |
|
|
9.6 Der Garbage Collector »G1« |
608 |
|
|
9.7 Geplante Datumsverarbeitung mit dem neuen Datums-API |
609 |
|
|
Teil III Fallstricke und Lösungen im Praxisalltag |
614 |
|
|
10 Bad Smells |
616 |
|
|
10.1 Programmdesign |
618 |
|
|
10.1.1 Bad Smell: Verwenden von Magic Numbers |
618 |
|
|
10.1.2 Bad Smell: Konstanten in Interfaces definieren |
619 |
|
|
10.1.3 Bad Smell: System.exit() mitten im Programm |
622 |
|
|
10.1.4 Bad Smell: Zusammengehörende Konstanten nicht als Typ definiert |
623 |
|
|
10.1.5 Bad Smell: Programmcode im Logging-Code |
625 |
|
|
10.1.6 Bad Smell: Unvollständige Betrachtung aller Alternativen |
626 |
|
|
10.1.7 Bad Smell: Unvollständige Änderungen nach Copy-Paste |
627 |
|
|
10.1.8 Bad Smell: Casts auf unbekannte Subtypen |
629 |
|
|
10.1.9 Bad Smell: Pre-/Post-Increment in komplexeren Statements |
631 |
|
|
10.1.10 Bad Smell: Keine Klammern um Blöcke |
633 |
|
|
10.1.11 Bad Smell: Variablendeklaration nicht im kleinstmöglichen Sichtbarkeitsbereich |
635 |
|
|
10.1.12 Bad Smell: Mehrere aufeinanderfolgende Parameter gleichen Typs |
636 |
|
|
10.1.13 Bad Smell: Grundloser Einsatz von Reflection |
637 |
|
|
10.2 Klassendesign |
639 |
|
|
10.2.1 Bad Smell: Unnötigerweise veränderliche Attribute |
639 |
|
|
10.2.2 Bad Smell: Aufruf abstrakter Methoden im Konstruktor |
641 |
|
|
10.2.3 Bad Smell: Herausgabe von this im Konstruktor |
645 |
|
|
10.2.4 Bad Smell: Referenzierung von Subklassen in Basisklassen |
646 |
|
|
10.2.5 Bad Smell: Mix abstrakter und konkreter Basisklassen |
648 |
|
|
10.2.6 Bad Smell: Öffentlicher Defaultkonstruktor lediglich zum Zugriff auf Hilfsmethoden |
650 |
|
|
10.3 Fehlerbehandlung und Exception Handling |
652 |
|
|
10.3.1 Bad Smell: Unbehandelte Exception |
652 |
|
|
10.3.2 Bad Smell: Unpassender Exception-Typ |
653 |
|
|
10.3.3 Bad Smell: Exceptions zur Steuerung des Kontrollflusses |
655 |
|
|
10.3.4 Bad Smell: Fangen der allgemeinsten Exception |
656 |
|
|
10.3.5 Bad Smell: Rückgabe von null statt Exception im Fehlerfall |
658 |
|
|
10.3.6 Bad Smell: Unbedachte Rückgabe von null |
660 |
|
|
10.3.7 Bad Smell: Sonderbehandlung von Randfällen |
662 |
|
|
10.3.8 Bad Smell: Keine Gültigkeitsprüfung von Eingabeparametern |
663 |
|
|
10.3.9 Bad Smell: Fehlerhafte Fehlerbehandlung |
665 |
|
|
10.3.10 Bad Smell: I/O ohne finally bzw. finalize() |
667 |
|
|
10.3.11 Bad Smell: Resource Leaks durch Exceptions im Konstruktor |
669 |
|
|
10.4 Häufige Fallstricke |
673 |
|
|
10.5 Weiterführende Literatur |
681 |
|
|
11 Refactorings |
682 |
|
|
11.1 Das Standardvorgehen |
690 |
|
|
11.2 Der Refactoring-Katalog |
693 |
|
|
11.2.1 Reduziere die Sichtbarkeit von Attributen |
693 |
|
|
11.2.2 Minimiere veränderliche Attribute |
696 |
|
|
11.2.3 Reduziere die Sichtbarkeit von Methoden |
700 |
|
|
11.2.4 Ersetze Mutator- durch Business-Methode |
701 |
|
|
11.2.5 Minimiere Zustandsänderungen (Refactoring-Kombination) |
702 |
|
|
11.2.6 Führe ein Interface ein |
702 |
|
|
11.2.7 Aufspalten eines Interface |
703 |
|
|
11.2.8 Einführen eines Read-only-Interface |
704 |
|
|
11.2.9 Einführen eines Read-Write-Interface |
704 |
|
|
11.2.10 Einführen von Convenience-Methoden |
705 |
|
|
11.2.11 Einführen einer Zustandsprüfung |
707 |
|
|
11.2.12 Überprüfung von Eingabeparametern |
709 |
|
|
11.2.13 Trenne Informationsbeschaffung und -verarbeitung |
713 |
|
|
11.2.14 Konstantensammlung in enum umwandeln |
718 |
|
|
11.2.15 Entferne Exceptions zur Steuerung des Kontrollflusses |
721 |
|
|
11.2.16 Umwandlung in Utility-Klasse mit statischen Hilfsmethoden |
724 |
|
|
11.3 Weiterführende Literatur |
727 |
|
|
12 Entwurfsmuster |
728 |
|
|
12.1 Erzeugungsmuster |
731 |
|
|
12.1.1 Erzeugungsmethode |
731 |
|
|
12.1.2 Fabrikmethode (Factory method) |
734 |
|
|
12.1.3 Erbauer (Builder) |
737 |
|
|
12.1.4 Singleton |
740 |
|
|
12.1.5 Prototyp (Prototype) |
744 |
|
|
12.2 Strukturmuster |
748 |
|
|
12.2.1 Fassade (Façade) |
749 |
|
|
12.2.2 Adapter |
751 |
|
|
12.2.3 Dekorierer (Decorator) |
753 |
|
|
12.2.4 Kompositum (Composite) |
756 |
|
|
12.3 Verhaltensmuster |
760 |
|
|
12.3.1 Iterator |
761 |
|
|
12.3.2 Null-Objekt (Null Object) |
763 |
|
|
12.3.3 Schablonenmethode (Template method) |
766 |
|
|
12.3.4 Strategie (Strategy) |
770 |
|
|
12.3.5 Befehl (Command) |
778 |
|
|
12.3.6 Proxy |
785 |
|
|
12.3.7 Zuständigkeitskette (Chain of Responsibility) |
787 |
|
|
12.3.8 Beobachter (Observer) |
789 |
|
|
12.3.9 MVC-Architektur |
798 |
|
|
12.4 Weiterführende Literatur |
799 |
|
|
Teil IV Qualitätssicherungsmaßnahmen |
800 |
|
|
13 Programmierstil und Coding Conventions |
802 |
|
|
13.1 Grundregeln eines guten Programmierstils |
802 |
|
|
13.1.1 Keep It Human-Readable |
803 |
|
|
13.1.2 Keep It Simple And Short |
803 |
|
|
13.1.3 Keep It Natural |
803 |
|
|
13.1.4 Keep It Clean |
803 |
|
|
13.2 Die Psychologie beim Sourcecode-Layout |
804 |
|
|
13.2.1 Faktor der Ähnlichkeit |
804 |
|
|
13.2.2 Faktor der Nähe |
805 |
|
|
13.3 Coding Conventions |
807 |
|
|
13.3.1 Grundlegende Namens- und Formatierungsregeln |
808 |
|
|
13.3.2 Namensgebung |
811 |
|
|
13.3.3 Dokumentation |
813 |
|
|
13.3.4 Programmdesign |
815 |
|
|
13.3.5 Klassendesign |
820 |
|
|
13.3.6 Parameterlisten |
823 |
|
|
13.3.7 Logik und Kontrollfluss |
825 |
|
|
13.4 Sourcecode-Überprüfung mit Tools |
827 |
|
|
13.4.1 Metriken |
828 |
|
|
13.4.2 Sourcecode-Überprüfung im Build-Prozess |
832 |
|
|
14 Unit Tests |
840 |
|
|
14.1 Überblick |
840 |
|
|
14.1.1 Arten von Tests |
840 |
|
|
14.1.2 Äußere vs. innere Qualität |
843 |
|
|
14.1.3 Auswirkungen von Unit Tests auf die Qualität |
844 |
|
|
14.2 Motivation für Unit Tests aus der Praxis |
846 |
|
|
14.2.1 Unit Tests für Neuentwicklungen |
846 |
|
|
14.2.2 Unit Tests und Legacy-Code |
853 |
|
|
14.3 Fortgeschrittene Unit-Test-Techniken |
864 |
|
|
14.3.1 Testen mit Stubs |
864 |
|
|
14.3.2 Testen mit Mocks |
866 |
|
|
14.3.3 Unit Tests von privaten Methoden |
869 |
|
|
14.4 Unit Tests mit Threads und Timing |
870 |
|
|
14.5 Nützliche Tools für Unit Tests |
875 |
|
|
14.5.1 Hamcrest |
875 |
|
|
14.5.2 Infinitest |
879 |
|
|
14.5.3 Cobertura |
880 |
|
|
14.6 Weiterführende Literatur |
886 |
|
|
15 Codereviews |
888 |
|
|
15.1 Definition |
888 |
|
|
15.2 Probleme und Tipps zur Durchführung |
890 |
|
|
15.3 Vorteile von Codereviews |
892 |
|
|
15.4 Codereview-Tools |
895 |
|
|
15.5 Codereview-Checkliste |
897 |
|
|
16 Optimierungen |
898 |
|
|
16.1 Grundlagen |
899 |
|
|
16.1.1 Optimierungsebenen und Einflussfaktoren |
900 |
|
|
16.1.2 Optimierungstechniken |
901 |
|
|
16.1.3 CPU-bound-Optimierungsebenen am Beispiel |
903 |
|
|
16.1.4 Messungen – Erkennen kritischer Bereiche |
907 |
|
|
16.1.5 Abschätzungen mit der O-Notation |
914 |
|
|
16.2 Einsatz geeigneter Datenstrukturen |
917 |
|
|
16.2.1 Einfluss von Arrays und Listen |
918 |
|
|
16.2.2 Optimierungen für Set und Map |
922 |
|
|
16.2.3 API-Design Collection vs. Iterator |
924 |
|
|
16.3 Lazy Initialization |
925 |
|
|
16.3.1 Lazy Initialization am Beispiel |
926 |
|
|
16.3.2 Konsequenzen des Einsatzes der Lazy Initialization |
929 |
|
|
16.3.3 Lazy Initialization mithilfe des PROXY-Musters |
931 |
|
|
16.4 Optimierungen am Beispiel |
933 |
|
|
16.5 I/O-bound-Optimierungen |
941 |
|
|
16.5.1 Technik – Wahl passender Strategien |
941 |
|
|
16.5.2 Technik – Caching und Pooling |
944 |
|
|
16.5.3 Technik – Vermeidung unnötiger Aktionen |
945 |
|
|
16.6 Memory-bound-Optimierungen |
948 |
|
|
16.6.1 Technik – Wahl passender Strategien |
948 |
|
|
16.6.2 Technik – Caching und Pooling |
951 |
|
|
16.6.3 Optimierungen der Stringverarbeitung |
956 |
|
|
16.6.4 Technik – Vermeidung unnötiger Aktionen |
959 |
|
|
16.7 CPU-bound-Optimierungen |
961 |
|
|
16.7.1 Technik – Wahl passender Strategien |
962 |
|
|
16.7.2 Technik – Caching und Pooling |
962 |
|
|
16.7.3 Technik – Vermeidung unnötiger Aktionen |
963 |
|
|
16.8 Weiterführende Literatur |
965 |
|
|
Teil V Anhang |
966 |
|
|
A Einführung in die UML |
968 |
|
|
A.1 Die UML im Überblick |
968 |
|
|
A.2 Strukturdiagramme – statische Modelle |
972 |
|
|
A.2.1 Klassendiagramme |
972 |
|
|
A.2.2 Objektdiagramme |
976 |
|
|
A.2.3 Komponentendiagramme |
976 |
|
|
A.2.4 Paketdiagramme |
977 |
|
|
A.3 Verhaltensdiagramme – dynamische Modelle |
978 |
|
|
A.3.1 Anwendungsfalldiagramme |
978 |
|
|
A.3.2 Sequenzdiagramme |
979 |
|
|
A.3.3 Kommunikationsdiagramme |
983 |
|
|
A.3.4 Zustandsdiagramme |
984 |
|
|
A.3.5 Aktivitätsdiagramme |
986 |
|
|
A.4 Weiterführende Literatur |
987 |
|
|
B Überblick über den Softwareentwicklungsprozess |
988 |
|
|
B.1 Vorgehensmodelle |
988 |
|
|
B.1.1 Aufgaben und Phasen beim Softwareentwurf |
988 |
|
|
B.1.2 Wasserfallmodell und V-Modell |
989 |
|
|
B.1.3 Extreme Programming (XP) |
991 |
|
|
B.1.4 Test-Driven Development (TDD) |
993 |
|
|
B.1.5 Diskussion |
994 |
|
|
Literaturverzeichnis |
996 |
|
|
Index |
1000 |
|