Software modular bauen - Architektur von langlebigen Softwaresystemen - Grundlagen und Anwendung mit OSGi und Java
von: Ulf Fildebrandt
dpunkt, 2012
ISBN: 9783864911835
Sprache: Deutsch
332 Seiten, Download: 6989 KB
Format: EPUB, PDF, auch als Online-Lesen
Mehr zum Inhalt
Software modular bauen - Architektur von langlebigen Softwaresystemen - Grundlagen und Anwendung mit OSGi und Java
Inhaltsverzeichnis | 7 | ||
1 Einleitung | 11 | ||
1.1 Über dieses Buch | 12 | ||
1.1.1 Zielgruppe | 12 | ||
1.1.2 Aufbau | 13 | ||
1.1.3 Herangehensweise | 14 | ||
1.2 Motivation | 14 | ||
1.3 Nachstellen der Beispiele | 16 | ||
1.3.1 Voraussetzungen | 16 | ||
1.3.2 Synchronisieren von Projekten | 17 | ||
1.3.3 Ausführen der Projekte | 18 | ||
1.4 Regeln | 18 | ||
2 Grundlagen | 21 | ||
2.1 Definitionen | 21 | ||
2.2 Grundthese | 22 | ||
2.2.1 Komponenten und Module | 23 | ||
2.2.2 Selbstähnlichkeit von Architektur | 23 | ||
2.2.3 Schnittstelle und Implementierung | 25 | ||
2.3 Prinzipien und Konzepte | 26 | ||
2.4 Modularity Patterns | 31 | ||
2.4.1 Modularity Patterns in der Coding-Architektur | 31 | ||
2.4.2 Modularity Patterns in der Komponentenarchitektur | 32 | ||
2.4.3 Modularity Patterns in der Systemarchitektur | 33 | ||
2.5 Vorgehen zur Definition modularer Architektur | 35 | ||
2.5.1 Anforderungsanalyse | 35 | ||
2.5.2 Sichten | 36 | ||
2.5.3 Vorgehensmodelle während der Entwicklung | 37 | ||
2.6 Modularitätsmodell (Modularity Maturity Model) | 39 | ||
3 Coding-Architektur: Erweiterbarkeit | 43 | ||
3.1 Hintergrund von Coding Best Practices | 43 | ||
3.1.1 Design Patterns | 44 | ||
3.1.2 SOLID | 45 | ||
3.1.3 Modularity Patterns in diesem Kapitel | 46 | ||
3.2 Beschreibung des Anwendungsbeispiels | 46 | ||
3.3 Factory Pattern | 50 | ||
3.3.1 Umsetzung im Beispiel | 52 | ||
3.4 Decision Map | 55 | ||
3.4.1 Umsetzung im Beispiel | 55 | ||
3.4.2 Cyclomatic Complexity | 57 | ||
3.5 Single Responsibility | 59 | ||
3.5.1 Umsetzung im Beispiel | 60 | ||
3.6 Nachstellen des Beispiels | 61 | ||
3.7 Exkurs: Adapter und Facade | 61 | ||
3.7.1 Facade in Coding | 62 | ||
3.7.2 Traditionelle Adapter | 63 | ||
3.7.3 Modulare Adapter im Coding | 64 | ||
3.7.4 Nachstellen des Beispiels | 67 | ||
3.8 Zusammenfassung | 67 | ||
4 Komponentenarchitektur: Grundlagen | 69 | ||
4.1 Hintergrund eines modularen Laufzeitsystems | 69 | ||
4.1.1 Module | 69 | ||
4.1.2 Services zur Kommunikation | 71 | ||
4.1.3 Zusammenspiel von Modulen und Services | 73 | ||
4.1.4 Kohäsion | 73 | ||
4.1.5 Modulare Laufzeitsysteme im Vergleich | 77 | ||
4.1.6 Modularity Patterns in diesem Kapitel | 81 | ||
4.2 Umsetzung der Grundkonzepte am Beispiel OSGi | 81 | ||
4.2.1 Moduldefinition | 82 | ||
4.2.2 Sichtbarkeit von Klassen | 83 | ||
4.2.3 Services | 87 | ||
4.2.4 Versionierung von Bundles | 89 | ||
4.3 Auswirkungen eines modularen Laufzeitsystems auf Patterns | 90 | ||
4.3.1 Facade | 91 | ||
4.3.2 Adapter | 93 | ||
4.4 Umsetzung von Modularität in verschiedenen Laufzeitumgebungen | 95 | ||
4.4.1 Eingebettete OSGi-Container | 96 | ||
4.4.2 Eigenständiger OSGi-Container | 98 | ||
4.4.3 Vergleich | 99 | ||
4.5 Modularisierung durch Refactoring | 99 | ||
4.5.1 Kohäsion am Refactoring-Beispiel | 104 | ||
4.6 Zusammenfassung | 106 | ||
5 Komponentenarchitektur: Entkopplung | 109 | ||
5.1 Hintergrund modularisierter Software | 109 | ||
5.1.1 Schnittstelle von Modulen | 109 | ||
5.1.2 Dependency Injection | 110 | ||
5.1.3 Modularität ohne Schnittstellen | 112 | ||
5.1.4 Modularity Patterns in diesem Kapitel | 114 | ||
5.2 Grundlagen von Declarative Services | 114 | ||
5.2.1 Declarative Services als Dependency-Injection-Framework | 116 | ||
5.3 Entkopplung in der Beispielanwendung | 116 | ||
5.3.1 Entkopplung der Datenquellen | 119 | ||
5.3.2 Nachstellen des Beispiels | 122 | ||
5.3.3 Laufzeitdynamik von Datenquellen | 122 | ||
5.4 Exkurs: Zwei weitere SOLID-Prinzipien | 125 | ||
5.4.1 Single-Responsibility-Prinzip für Module | 126 | ||
5.4.2 Open-Closed-Prinzip für Module | 126 | ||
5.5 Hierarchien in der Beispielanwendung | 129 | ||
5.6 Schnittstellen in Modulen | 131 | ||
5.7 Zusammenfassung | 132 | ||
6 Systemarchitektur: Schichten | 135 | ||
6.1 Hintergrund von Schichten in der Architektur | 135 | ||
6.1.1 Schichtenarchitektur | 136 | ||
6.1.2 Schichten in den Ebenen der Architektur | 137 | ||
6.1.3 Modularity Patterns in diesem Kapitel | 138 | ||
6.2 Entkoppelte Komponenten in der Beispielanwendung | 138 | ||
6.2.1 Arbeit mit der OSGi Service Registry | 143 | ||
6.2.2 Nachstellen des Beispiels | 144 | ||
6.3 Gruppierung von Bundles | 144 | ||
6.3.1 Eclipse Feature | 145 | ||
6.3.2 Application im Apache-Aries-Projekt | 145 | ||
6.3.3 OSGi-Subsystem-Spezifikation | 146 | ||
6.3.4 Vergleich | 146 | ||
6.4 Schichtenarchitektur mit OSGi | 147 | ||
6.4.1 Arten der Abhängigkeiten zwischen Schichten | 149 | ||
6.4.2 Schichten in der Beispielanwendung | 152 | ||
6.4.3 Data Transfer Objects (DTO) in den Schichten | 154 | ||
6.4.4 Testen der einzelnen Schichten | 155 | ||
6.5 Exkurs: Testbarkeit | 158 | ||
6.5.1 Prinzip: Dependency Injection | 159 | ||
6.5.2 Prinzip: Vermeidung von globalem Zustand | 160 | ||
6.5.3 Prinzip: Law of Demeter | 161 | ||
6.6 Zusammenfassung | 162 | ||
7 Systemarchitektur: Erweiterbarkeit | 163 | ||
7.1 Hintergrund von Schnittstellen | 163 | ||
7.1.1 Schnittstellendesign | 164 | ||
7.1.2 Ersetzbarkeit | 169 | ||
7.1.3 Modularity Patterns in diesem Kapitel | 169 | ||
7.2 Schnittstellen in der Beispielanwendung | 170 | ||
7.2.1 Beispiel des API-Designs | 172 | ||
7.2.2 Anwendung auf OSGi | 174 | ||
7.3 Erweiterung der Schnittstellen | 176 | ||
7.3.1 Abstrakte Klassen | 177 | ||
7.3.2 Data Transfer Object (DTO) | 179 | ||
7.3.3 Schnittstellenevolution | 180 | ||
7.3.4 Unterschiede zwischen API- und SPI-Evolution | 182 | ||
7.4 Erweiterbarkeit mit OSGi | 182 | ||
7.4.1 Design von Schnittstellen in Modulen | 183 | ||
7.5 Ersetzbarkeit von Implementierungen | 184 | ||
7.6 Kohäsion in der Beispielanwendung | 186 | ||
7.7 Zusammenfassung | 188 | ||
8 Systemarchitektur: Wiederverwendbarkeit entkoppelter Komponenten | 191 | ||
8.1 Hintergrund entkoppelter wiederverwendbarer Komponenten | 191 | ||
8.1.1 Abhängigkeiten zu externen Komponenten | 192 | ||
8.1.2 Gemeinsam genutzte Aspekte | 192 | ||
8.1.3 Modularity Patterns in diesem Kapitel | 196 | ||
8.2 Entkopplung von externen Abhängigkeiten | 196 | ||
8.2.1 Ein Adapter für eine externe Komponente in der Beispielanwendung | 198 | ||
8.2.2 Weiterentwicklung mit externen Komponenten | 201 | ||
8.2.3 Nachstellen des Beispiels | 202 | ||
8.3 Gemeinsam genutzte Aspekte | 203 | ||
8.3.1 Validierung | 204 | ||
8.3.2 Transaktionen | 206 | ||
8.4 Zusammenfassung | 207 | ||
9 Systemarchitektur: Funktionale Entkopplung | 209 | ||
9.1 Hintergrund funktionaler Entkopplung | 209 | ||
9.1.1 Parallele Verarbeitung im System | 210 | ||
9.1.2 Versionierung von Modulen | 216 | ||
9.1.3 Modularity Patterns in diesem Kapitel | 218 | ||
9.2 Parallele Verarbeitung in der Beispielanwendung | 218 | ||
9.2.1 Nachrichtenbasierte Verarbeitung | 219 | ||
9.2.2 Nachstellen des Beispiels | 224 | ||
9.2.3 Exkurs: Weitere Konzepte der parallelen Verarbeitung | 225 | ||
9.3 Versionierung in der Beispielanwendung | 229 | ||
9.3.1 Neue Implementierungen | 230 | ||
9.3.2 Änderungen an einer Schnittstelle | 232 | ||
9.3.3 Umsetzung im Projekt | 238 | ||
9.3.4 Vorteile der Versionierung | 241 | ||
9.3.5 Nachstellen des Beispiels | 241 | ||
9.4 Zusammmenfassung | 242 | ||
10 Komponentenarchitektur: Frameworks | 243 | ||
10.1 Hintergrund der Frameworks | 244 | ||
10.1.1 Geschichte der Frameworks | 244 | ||
10.1.2 Frameworks für Dependency Injection | 246 | ||
10.1.3 Java EE | 247 | ||
10.1.4 Maven | 249 | ||
10.1.5 Vergleich der Frameworks bezüglich Modularität | 250 | ||
10.2 Umsetzung der Beispielanwendung mit CDI | 257 | ||
10.2.1 Struktur der Beispielanwendung | 258 | ||
10.2.2 Anpassungen an Weld | 258 | ||
10.3 Umsetzung der Beispielanwendung mit Spring | 263 | ||
10.3.1 Struktur der Beispielanwendung mit Spring | 263 | ||
10.4 Umsetzung der Beispielanwendung mit Maven | 267 | ||
10.5 Nachstellen des Beispiels | 268 | ||
10.6 Exkurs: Verwendung von OSGi | 269 | ||
10.6.1 Eclipse | 269 | ||
10.6.2 JBoss Application Server | 269 | ||
10.6.3 GlassFish | 269 | ||
10.6.4 IBM WebSphere | 270 | ||
10.7 Zusammenfassung | 270 | ||
11 Systemarchitektur: Product Line Engineering | 273 | ||
11.1 Hintergrund zu Product Line Engineering | 273 | ||
11.1.1 Domänen- und Anwendungsentwicklung | 274 | ||
11.1.2 Variabilität | 275 | ||
11.1.3 Variabilität und Schnittstellen | 276 | ||
11.2 Anwendung von PLE auf die Beispielanwendung | 276 | ||
11.2.1 OSGi und PLE | 278 | ||
11.2.2 Core Assets in OSGi | 279 | ||
11.2.3 Variabilität in OSGi – Extension Point | 280 | ||
11.2.4 Variabilität in OSGi – Konfiguration | 282 | ||
11.2.5 Variabilität in OSGi – DSL | 283 | ||
11.3 Mehrere Produkte | 283 | ||
11.4 Nachstellen des Beispiels | 286 | ||
11.5 Zusammenfassung | 287 | ||
12 Systemarchitektur: Repository | 289 | ||
12.1 Hintergrund von Repositories | 289 | ||
12.1.1 Anwendungsfälle für ein Repository | 290 | ||
12.1.2 Modularity Patterns in diesem Kapitel | 291 | ||
12.2 Ein Repository für OSGi | 291 | ||
12.2.1 Verwendung von p2 in Eclipse | 292 | ||
12.3 Das p2-Repository für die Beispielanwendung | 294 | ||
12.3.1 Abhängigkeiten zwischen Features | 295 | ||
12.3.2 Eclipse-Support für Update-Site und Features | 297 | ||
12.4 Verschiedene Einsatzmöglichkeiten | 298 | ||
12.4.1 Verwendung von p2 per API | 299 | ||
12.5 Maven-Repository | 301 | ||
12.6 Zusammenfassung | 302 | ||
13 Schlusswort | 305 | ||
13.1 Zusammenfassung | 305 | ||
13.1.1 Anwendung der Modularitätsstufen | 306 | ||
13.1.2 Einordnung von OSGi bezüglich Produktivität | 308 | ||
13.2 Ausblick | 309 | ||
A Appendix A: Tools zur Architekturvalidierung | 311 | ||
A.1 Korrektheit | 311 | ||
A.1.1 FindBugs | 312 | ||
A.1.2 PMD | 312 | ||
A.2 Metriken | 312 | ||
A.2.1 Eclipse Metrics | 313 | ||
A.3 Redundanz | 313 | ||
A.3.1 CPD | 313 | ||
B Appendix B: Projekt Jigsaw | 315 | ||
B.1 Designprinzipien | 315 | ||
B.2 Definitionen | 316 | ||
B.2.1 Modul | 316 | ||
B.2.2 Auflösung | 316 | ||
B.2.3 Phasen | 316 | ||
B.3 Moduldeklaration | 316 | ||
B.3.1 Exports | 317 | ||
B.3.2 Abhängigkeiten | 318 | ||
B.3.3 Services | 318 | ||
B.4 Vergleich mit OSGi | 319 | ||
C Appendix C: OSGi in der Praxis | 321 | ||
C.1 Lifecycle von Bundles | 321 | ||
C.2 Statusinformationen eines OSGi-Laufzeitsystems | 323 | ||
Referenzen | 325 | ||
Index | 329 | ||
A | 329 | ||
B | 329 | ||
C | 329 | ||
D | 329 | ||
E | 329 | ||
F | 329 | ||
G | 330 | ||
I | 330 | ||
J | 330 | ||
K | 330 | ||
L | 330 | ||
M | 330 | ||
N | 330 | ||
O | 330 | ||
P | 330 | ||
R | 331 | ||
S | 331 | ||
T | 331 | ||
V | 331 | ||
www.dpunkt.de | 0 |