Grobentwurf
This commit is contained in:
		
							parent
							
								
									6ca5c8a293
								
							
						
					
					
						commit
						85583daa9a
					
				| @ -771,9 +771,712 @@ Pflichtenheft (Beispiel) | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Grobentwurf | # Grobentwurf | ||||||
|  | ## Einführung | ||||||
|  | Systementwurf – Aufgabe | ||||||
|  | - Sicht des geplanten Systems von innen (Entwickler) | ||||||
|  | - Wie sollen vereinbartes Verhalten und Funktionen (Analysemodell) intern realisiert werden? | ||||||
|  | - Von Spezifikation von Anforderungen und Funktionen -> Vorbereitung der Implementierung | ||||||
|  | - Formal: Transformation des Analysemodells in ein Systementwurfsmodell | ||||||
|  | - System(grob)entwurf, Feinentwurf/Objektentwurf | ||||||
| 
 | 
 | ||||||
|  | Teile und herrsche | ||||||
|  | - Grobentwurf | ||||||
|  |   - Entwurfsziele identifizieren | ||||||
|  |   - Grobe Systemstruktur festlegen (Architektur) | ||||||
|  |   - Zerlegung in Subsysteme, Spezifikation | ||||||
|  |     - Schichten, Pakete, Komponenten | ||||||
|  |   - Bewerten der Zerlegung anhand der Entwurfsziele | ||||||
|  |   - Schnittstellen festlegen | ||||||
|  | - Feinentwurf | ||||||
|  |   - Subsysteme im Detail entwerfen | ||||||
|  |     - Strukturierung der Komponenten | ||||||
|  |     - Klassen, Objekte, Funktionen, Datenstrukturen | ||||||
|  |     - Verhalten, Algorithmen – Teillösungen | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Systemzerlegung | ||||||
|  | Vorgehen | ||||||
|  | - Zerlegung eines Systems in Subsysteme | ||||||
|  | - Betrachtung der Lösungsdomäne! | ||||||
|  | - Subsysteme weiter zerlegen bis Komplexität ausreichend klein ist z.B. für Arbeitspakete | ||||||
|  | 
 | ||||||
|  | Was macht ein Subsystem aus? | ||||||
|  | - Schnittstellen, Funktionen, „Verantwortung“ | ||||||
|  | - Was bietet es an? | ||||||
|  | - Was benutzt es? | ||||||
|  | - Was tut es intern? | ||||||
|  | 
 | ||||||
|  | Operation | ||||||
|  | - Name und Parameter | ||||||
|  | - Funktion, Prozedur, Methode, Eintrittspunkt ... | ||||||
|  | 
 | ||||||
|  | Dienst | ||||||
|  | - Satz von Operationen, die bereitgestellt werden | ||||||
|  | 
 | ||||||
|  | Abhängigkeiten von Subsystemen | ||||||
|  | - Subsysteme untereinander: Kopplung (coupling) | ||||||
|  | - Maß für die Abhängigkeit von Subsystemen | ||||||
|  | 
 | ||||||
|  | Möglichst lose Kopplung | ||||||
|  | - Änderungen in einem beteiligten Subsystem haben geringe Auswirkungen (Stabilität) | ||||||
|  | - Erleichtert Wartbarkeit und Arbeitsteilung | ||||||
|  | 
 | ||||||
|  | Mittel zur Verringerung der Kopplung | ||||||
|  | - Zusätzliche Unterteilung in Subsysteme | ||||||
|  | - Aber: dann größere Komplexität! | ||||||
|  | 
 | ||||||
|  | Abhängigkeiten von Subsystemen | ||||||
|  | | Kopplungsart | Bemerkung | | ||||||
|  | | -- | -- | | ||||||
|  | | Datenkopplung (gemeinsame Daten) | Möglichst vermeiden! Wenn nicht möglich, Verwaltung zentralisieren und Zugriff über Schnittstelle | | ||||||
|  | | Schnittstellenkopplung (gegenseitiger Aufruf) | Akzeptabel | | ||||||
|  | | Strukturkopplung (gemeinsame Strukturelemente) | Vermeiden! (z.B. keine Vererbung über Paketgrenzen hinweg) | | ||||||
|  | 
 | ||||||
|  | - Elemente eines Subsystems: Kohäsion (cohesion) | ||||||
|  | - Maß für Zusammengehörigkeit der Elemente | ||||||
|  | - Möglichst hohe Kohäsion | ||||||
|  |   - Enge Beziehung oder ähnliche Aufgaben der Elemente | ||||||
|  |   - Erleichtert Verständnis, Wartung und Anpassung | ||||||
|  | - Mittel zum Erreichen hoher Kohäsion | ||||||
|  |   - Datenkapselung, Objektorientierung | ||||||
|  |   - Benutzung geeigneter Patterns (Kapitel 5) | ||||||
|  | 
 | ||||||
|  | Metriken für modulare Entwürfe | ||||||
|  | - Fan-in / fan-out-Metrik [S.Henry, D. Kafura 1981]: | ||||||
|  |   - Fan-in: Anzahl der Stellen, wo Kontrollfluss auf das betrachtete Modul M übergeht (Aufrufe von Funktionen / Prozeduren in M) + Anzahl globaler Variablen, die in M zugänglich sind | ||||||
|  |   - Fan-out: Anzahl von Stellen, an denen M andere Module aufruft + Anzahl der globalen Variablen, die von M verändert werden | ||||||
|  | - Heuristik Kopplung / Kohäsion | ||||||
|  |   - Hoher Fan-out bedeutet hohe Kopplung, minimieren | ||||||
|  |   - Hoher Fan-in kann auf geringe Kohäsion von M hindeuten | ||||||
|  | 
 | ||||||
|  | Komplexität beherrschen: "Wenn Du es nicht in fünf Minuten erklären kannst, hast Du es entweder selbst nicht verstanden oder es funktioniert nicht." [Rechtin, Maier: The Art of Systems Architecting 2000] | ||||||
|  | 
 | ||||||
|  | Vorgehen: Heuristiken und Erfahrungen | ||||||
|  | - „Erfahrung ist die härteste Lehrerin. Sie gibt Dir zuerst den Test und anschließend den Unterricht.“ [Ruth 1993] | ||||||
|  | - „Ein Architekt der zu Beginn seiner Arbeit vollständige und konsistente Anforderungen benötigt, mag ein brillanter Entwickler sein – aber er ist kein Architekt“ [Rechtin 2000] | ||||||
|  | - „Das Leben von Software-Architekten besteht aus einer langen und schnellen Abfolge suboptimaler Entwurfs-entscheidungen, die teilweise im Dunkeln getroffen werden.“ [Kruchten2001] | ||||||
|  | 
 | ||||||
|  | Wie organisiert man Subsysteme? | ||||||
|  | - Innerhalb einer Verfeinerungsstufe: fachlich orientierte Zerlegung | ||||||
|  | - Mehrfache Zerlegung: Hierarchie-Graph der Verfeinerung | ||||||
|  | 
 | ||||||
|  | Schicht | ||||||
|  | - Gruppe von Subsystemen in der Zerlegungshierarchie | ||||||
|  | - Verwandte Dienste | ||||||
|  | - Ähnlicher Abstraktionsgrad | ||||||
|  | - Abhängigkeit nur von darunter liegenden! | ||||||
|  | 
 | ||||||
|  | - Geschlossene Schichtenarchitektur | ||||||
|  |   - Beispiel: OSI-Modell für Kommunikationssysteme | ||||||
|  | - Offene Schichtenarchitektur | ||||||
|  |   - Beispiel: Java Swing auf X11-Plattform | ||||||
|  | 
 | ||||||
|  | Prinzipien des OO-Entwurfs | ||||||
|  | - So-einfach-wie-möglich-Prinzip (KISS) | ||||||
|  | - Fehler berücksichtigen (Strukturierung, Kapselung, Modularisierung, Wiederverwendung) | ||||||
|  | - Entwerfen nach Verantwortlichkeiten | ||||||
|  | - Hohe Kohäsion / Geringe Kopplung | ||||||
|  | - Zyklische Abhängigkeiten vermeiden | ||||||
|  | - Auf Schnittstellen konzentrieren | ||||||
|  |   - Abhängigkeiten nur von Schnittstellen | ||||||
|  |   - Abtrennung von Schnittstellen (eher viele kleine als eine große) | ||||||
|  |   - Umkehr der Abhängigkeiten (dependency inversion-Prinzip) | ||||||
|  | - Offen / Geschlossen Prinzip | ||||||
|  | 
 | ||||||
|  | Zyklische Abhängigkeiten vermeiden | ||||||
|  | - Änderungen wirken sich auf beide Komponenten aus | ||||||
|  | - Probleme beim Löschen und Initialisieren | ||||||
|  | - Auflösen durch | ||||||
|  |   - Gemeinsame Klassen in separates Paket | ||||||
|  |   - Gemeinsame Schnittstellen definieren | ||||||
|  | 
 | ||||||
|  | Symptome schlechten Designs | ||||||
|  | - Starrheit | ||||||
|  |   - Einfache Änderungen schwierig realisierbar | ||||||
|  |   - Einfache Änderungen führen zur Modifikation einer Vielzahl von Komponenten | ||||||
|  | - Zerbrechlichkeit | ||||||
|  |   - Änderungen an einer Stelle führen zu Fehlern an völlig anderer Stelle | ||||||
|  | - Schlechte Wiederverwendbarkeit | ||||||
|  |   - Komponenten können Aufgrund spezieller Anhängigkeiten kaum wiederverwendet werden | ||||||
|  | 
 | ||||||
|  | Wann ist ein Entwurf „gut“? | ||||||
|  | - Korrekt | ||||||
|  |   - Erfüllung der Anforderungen | ||||||
|  |   - Wiedergabe aller Funktionen des Systemmodells | ||||||
|  |   - Sicherstellung der nichtfunktionalen Anforderungen | ||||||
|  | - Verständlich und präzise, gut dokumentiert | ||||||
|  | - Anpassbar | ||||||
|  | - Hohe Kohäsion innerhalb der Komponenten | ||||||
|  | - Schwache Kopplung zwischen den Komponenten | ||||||
|  | - Wiederverwendung | ||||||
|  | - Kriterien gelten auf allen Ebenen des Entwurfs! (Architektur, Subsysteme, Komponenten) | ||||||
|  | 
 | ||||||
|  | ## Architekturmodelle | ||||||
|  | - Modellierung mit UML | ||||||
|  |   - Bisher: logische Sicht | ||||||
|  |   - Technisch: Organisation in Paketen, Namensraum, Import | ||||||
|  | - Paketdiagramm | ||||||
|  |   - Gliederung (Strukturierung) des Systems in Teile | ||||||
|  |   - Zuordnung von Elementen zu einem Paket | ||||||
|  |   - Hierarchien und Abhängigkeiten zwischen den Paketen | ||||||
|  |   - Anwendung: Definition von Schichten | ||||||
|  | - Enthält-Beziehung | ||||||
|  |   - Definiert, in welchem Paket ein Element enthalten ist | ||||||
|  |   - Ermöglicht qualifizierten Zugriff auf enthaltene Elemente | ||||||
|  |   - Löschen des Pakets bewirkt Löschen beinhalteter Elemente | ||||||
|  |   - Definition von Sichtbarkeit / Zugriffsrechte | ||||||
|  |     - Auswirkung auf weitere Enthält-Beziehung | ||||||
|  |     - '+' - public (default) | ||||||
|  |     - '-' - private | ||||||
|  | - Paket- / Element-Import | ||||||
|  |   - Unqualifizierter Zugriff auf Elemente eines anderen Namensraums (Paketes) | ||||||
|  | - Komponentendiagramm | ||||||
|  |   - Komponente – modulare, austauschbare Einheit | ||||||
|  |   - Strukturierung des Systems durch Komponenten | ||||||
|  |   - Modellierung der | ||||||
|  |     - Abhängigkeiten zwischen Komponenten | ||||||
|  |     - inneren Struktur von Komponenten | ||||||
|  |   - Definition von Schnittstellen | ||||||
|  |   - Verwendung von Elementen aus Klassen- und Objektdiagramm | ||||||
|  |   - Stärkere dynamische Sicht -> kein Verhalten | ||||||
|  |   - Komponente <<component>> | ||||||
|  |     - Kapselt Funktionalitäten (Physisch gruppierte Klassen) | ||||||
|  |     - „Spezialisierte“ Klasse (Vererbung, Exemplare möglich) | ||||||
|  |     - Stellt Funktionalitäten über Schnittstellen bereit | ||||||
|  |     - Definiert benötigte Schnittstellen | ||||||
|  |     - Enthält Klassen oder weitere Komponenten | ||||||
|  |     - Modulares Element: Substitution (Austauschbarkeit) steht im Vordergrund | ||||||
|  |   - Black-Box-Darstellung | ||||||
|  |     - Zur Verfügung gestellte Funktionalität `<<provided interfaces>>` | ||||||
|  |     - Benötigte Funktionalität `<<required interfaces>>`‚ | ||||||
|  |   - White-Box-Darstellung | ||||||
|  |     - Interner Aufbau der Komponente `<<realization>>` | ||||||
|  |     - Artefakte `<<artifacts>>`‚ Realisierende physische Einheit (z.B.: .dll) | ||||||
|  | 
 | ||||||
|  | Schnittstellen / Interfaces | ||||||
|  | - Definition Diagrammunabhängig | ||||||
|  |   - Meist Klassendiagramm  | ||||||
|  | - Ähnlich Semantik einer Klasse | ||||||
|  |   - Nur public-Attribute und Operationen | ||||||
|  | - Definiert Verpflichtung zur Implementierung von | ||||||
|  |   - Operationen | ||||||
|  |   - Merkmale -> Attribute dürfen definiert werden | ||||||
|  |   - Verpflichtungen (z.B.: Vor- / Nachbedingungen) | ||||||
|  | - Meist abstrakte Klassen mit abstrakten Operationen | ||||||
|  | - Abstrakt – muss überschrieben werden | ||||||
|  | - Notation | ||||||
|  |   - Stereotyp: <<Interface>> | ||||||
|  |   - Meist kursiv geschrieben, da abstrakte Klasse | ||||||
|  | 
 | ||||||
|  | Schnittstellenrealisierung, Implementierungsbeziehung | ||||||
|  | - Schnittstellen werden realisiert, nicht instanziiert | ||||||
|  | - Schnittstellenkonform | ||||||
|  |   - Klasse realisiert alle Attribute und Operationen | ||||||
|  | - Schnittstelle kann von anderen Schnittstellen erben | ||||||
|  | - Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen -> Generalisierung verwenden | ||||||
|  | - Darstellung | ||||||
|  |   - Gestrichelte Linie mit nicht gefülltem Dreieck an der Seite der Superklasse | ||||||
|  |   - Alternativ: Lollipop-Darstellung | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Softwarearchitekturmuster | ||||||
|  | - Wiederverwendung auf sehr hoher Abstraktionsstufe | ||||||
|  | - Falls geplante Anwendung passt, anwenden! | ||||||
|  | 
 | ||||||
|  | Schichten-Architektur (layers) | ||||||
|  | - Problem | ||||||
|  |   - Komplexität: Strukturierung des Systems, unterschiedliche Abstraktionsebenen | ||||||
|  |   - Änderungen sollen möglichst lokal bleiben | ||||||
|  |   - Teilsysteme sollen austauschbar, wiederverwendbar und getrennt entwickelbar sein | ||||||
|  |   - Schnittstellen sollen stabil sein | ||||||
|  | - Lösung | ||||||
|  |   - Zuordnung von Subsystemen zu horizontalen Schichten gleicher Abstraktionsebene | ||||||
|  |   - Komponenten einer Schicht bieten Dienste der darüber liegenden Schicht an | ||||||
|  | 
 | ||||||
|  | Client-Server (Klient/Anbieter) | ||||||
|  | - Client (front-end) | ||||||
|  |   - Benutzungsschnittstelle | ||||||
|  |   - Einbindung in Geschäftsprozesse | ||||||
|  |   - Entkoppelt von Netztechnologie und Datenhaltung | ||||||
|  | - Server (back-end) | ||||||
|  |   - Datenhaltung, evtl. Fachlogik | ||||||
|  | - Genauer: Two-tier client/server architecture | ||||||
|  | - Asynchroner Kontrollfluss | ||||||
|  | - Aufteilung Funktionen Client / Server | ||||||
|  |   - Mehr Funktionen im Server: | ||||||
|  |     - zentrale Verwaltung, Wartungsaufwand geringer, Portabilität, einfache Client-Hardware (Net PC) | ||||||
|  |     - „Thin Client“ – nur GUI | ||||||
|  |   - Mehr Funktionen im Client: Flaschenhals Server wird entlastet, individuellere Client-Funktionen | ||||||
|  |     - „Fat Client“ – Teil der Anwendung im Client | ||||||
|  |   - Entscheidet mit über Umsetzung (Java Script, ...) | ||||||
|  | 
 | ||||||
|  | Three-Tier / Four-Tier Architecture | ||||||
|  | - Client/Server mit weiterer Aufteilung ähnlich Repository | ||||||
|  | 
 | ||||||
|  | Bewertung Client-Server | ||||||
|  | - Vorteile | ||||||
|  |   - Leicht verständlich | ||||||
|  |   - Änderungen bleiben lokal | ||||||
|  |   - Geringere Kopplung zwischen den Schichten | ||||||
|  |   - Schichten austauschbar und wiederverwendbar | ||||||
|  |   - Getrennte Entwicklung der Schichten möglich | ||||||
|  |   - Vorhandene / stabilere Schnittstellen | ||||||
|  | - Nachteile | ||||||
|  |   - Geringere Performance | ||||||
|  |   - Zusätzlicher Verwaltungs- oder Datenoverhead | ||||||
|  |   - Manche Änderungen führen zu Änderungen in allen Schichten (z.B. neues Datenfeld) | ||||||
|  | 
 | ||||||
|  | Pipes and Filters | ||||||
|  | - Datenstrom- oder Kontrollflussorientiertes System | ||||||
|  | - Lose verbundene Berechnungskomponenten | ||||||
|  | - Kombination der Berechnungskomponenten nur vom Typ der Ein- und Ausgabedaten abhängig | ||||||
|  | - Leicht erweiterbar System gewünscht | ||||||
|  | - Parallele Verarbeitung vorteilhaft | ||||||
|  | - Verwendung von globalen Steuerungskontrollstrukturen (Parallelisierung, Verzweigung, Schleifen) gewünscht | ||||||
|  | - Vorteile | ||||||
|  |   - Stark entkoppelte Komponenten | ||||||
|  |   - Hohe Flexibilität gegenüber Änderungen & Erweiterungen | ||||||
|  |   - Hoher Wiederverwendungsgrad der Komponenten | ||||||
|  |   - Unabhängige Entwicklung der Komponenten | ||||||
|  |   - Leichte Parallelisierung der Berechnungen möglich | ||||||
|  |   - Überprüfung der Datenkompatibilität dynamisch / statisch | ||||||
|  | - Nachteile | ||||||
|  |   - Schwierige Fehlerbehandlung, kein expliziter Kontrollfluss | ||||||
|  |   - Fehler durch inkompatible Datentypfehler erst zur Laufzeit | ||||||
|  |   - Häufig zusätzliche Datenkonvertierungen notwendig | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Plug-In Architektur (Microkernel) | ||||||
|  | - Zielstellung | ||||||
|  |   - Stabile, verbreitete Standard-Anwendung (Kern) | ||||||
|  |   - Funktionalität soll durch Komponenten leicht erweiterbar sein | ||||||
|  |   - Dritte sollen Komponenten leicht erstellen können | ||||||
|  | - Lösung | ||||||
|  |   - Möglichst schlanker zentraler Kern | ||||||
|  |   - Plugin-Manager verwaltet Komponenten: Laden, Entladen, Zugriffskontrolle, Konfiguration | ||||||
|  | - Plugin | ||||||
|  |   - Komponente mit Standard-Schnittstelle | ||||||
|  |   - Erweitert Funktionalität (extension point) | ||||||
|  | - Vorteile | ||||||
|  |   - Robustes Verhalten | ||||||
|  |   - Trennung der Zuständigkeiten | ||||||
|  |   - Erweiterbar, Austauschbar, Wiederverwendbar | ||||||
|  |   - Geringe Kopplung zu den Komponenten | ||||||
|  |   - Anpassung an eigene Bedürfnisse möglich | ||||||
|  |   - Leichte Aufteilung der Entwicklung der Arbeitspakete | ||||||
|  | - Nachteile | ||||||
|  |   - Höherer initialer Aufwand | ||||||
|  |   - Verwaltungsoverhead zur Laufzeit | ||||||
|  |   - Versionsverwaltung der Komponenten nötig | ||||||
|  |   - Abhängigkeiten unter den Komponenten schwierig realisierbar | ||||||
|  |   - Geschickte Definition der Extension Points nötig | ||||||
|  | 
 | ||||||
|  | Repository (Depot, blackboard) | ||||||
|  | - Zentrale Datenhaltung | ||||||
|  |   - Datenbankmanagementsystem, Dateisystem | ||||||
|  | - Anwendungen tauschen Daten nur über Repository aus | ||||||
|  | - Kontrollfluss z.B. über Signale oder Semaphore | ||||||
|  | - Gut für datenintensive Verarbeitungsaufgaben geeignet | ||||||
|  | 
 | ||||||
|  | Peer-to-peer | ||||||
|  | - Gleichberechtigte Partner, “Föderation” | ||||||
|  | - Verteilte kommunizierende Subsysteme | ||||||
|  | - Orts- und Umgebungsunabhängigkeit | ||||||
|  | 
 | ||||||
|  | Model-View-Controller (MVC) | ||||||
|  | - Modell / Sicht / Steuerung | ||||||
|  | - Trennung verschiedener Aufgabengebiete: | ||||||
|  |   - Model: verwaltet Domänenwissen, Daten und Zustand; häufig Datenbank | ||||||
|  |   - View: Darstellung, Anzeige, GUI | ||||||
|  |   - Controller: Steuerung der Interaktion, Nutzerbefehle | ||||||
|  | - Erlauben Austausch von Anzeige- und Speichersystem  | ||||||
|  | - Kontrollfluss | ||||||
|  |   - Controller steuert | ||||||
|  |   - View wird über Datenänderungen benachrichtigt (callback) | ||||||
|  | - Geeignet für interaktive Systeme | ||||||
|  | - Problem | ||||||
|  |   - Lose Kopplung zwischen verschiedenen Komponenten | ||||||
|  |   - Daten werden in verschiedenen Sichten dargestellt | ||||||
|  |   - Realisierung von GUI‘s | ||||||
|  | - Lösung durch drei Komponenten | ||||||
|  |   - Daten (Model) enthält die Kernfunktionalität / Durchführung der Geschäftsprozesse, kapselt und Speichert die Daten | ||||||
|  |   - Sichten bzw. Dialoge (View) stellt die Daten für den Anwender in unterschiedlicher Art dar | ||||||
|  |   - Logik bzw. Steuerung (Controller) Realisiert die Interaktion mit dem Benutzer, übernimmt die Eingaben vom View und ändert die Daten im Modell, legt die Darstellungsart der Sichten fest | ||||||
|  | - Vorteile | ||||||
|  |   - Unabhängige Entwicklung der Komponenten | ||||||
|  |   - Änderung der Oberfläche ohne Änderung des Modells | ||||||
|  |   - Unterschiedliche Oberflächen für das selbe Modell | ||||||
|  | - Nachteile | ||||||
|  |   - Performance | ||||||
|  |   - Erhöhter initialer Entwicklungsaufwand | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Frameworks | ||||||
|  | Was ist ein Framework? | ||||||
|  | - A framework is a set of prefabricated software building blocks that programmers can use, extend, or customize for specific computing solutions [Taligent] | ||||||
|  | - Ein framework (Rahmenwerk, Anwendungsgerüst) ist eine Menge von zusammengehörigen Klassen, die einen abstrakten Entwurf für eine Problemfamilie darstellen [nach Pomberger/Blaschek] | ||||||
|  | 
 | ||||||
|  | Ziele | ||||||
|  | - Wiederverwendung von Code, Architektur, Entwurfsprinzipien und Verhaltensschema | ||||||
|  | - Ähnliche Benutzungsschnittstelle | ||||||
|  | 
 | ||||||
|  | Klassifikation I | ||||||
|  | - Anwendungs-Framework (application framework) | ||||||
|  |   - Gibt Systemarchitektur für typische Anwendungsstruktur vor | ||||||
|  |   - GUI-Framework: Motif, Qt, Swing, ... | ||||||
|  | - Bereichsspezifisches Framework (domain framework) | ||||||
|  |   - Expertenwissen für Anwendungsbereich | ||||||
|  |   - für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, ... | ||||||
|  |   - Beispiel: AUTOSAR | ||||||
|  | - Infrastrukturgerüst (support framework) | ||||||
|  |   - Gerätetreiber, Anpassung an Hardware | ||||||
|  |   - Middleware: DCOM, Java RMI, CORBA, WebSphere, ... | ||||||
|  | 
 | ||||||
|  | Klassifikation II | ||||||
|  | - Offene Programmgerüste (white box) | ||||||
|  |   - Erweiterbarkeit durch Vererbung und dynamische Bindung | ||||||
|  |   - Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden | ||||||
|  | - Geschlossene Programmgerüste (black box) | ||||||
|  |   - Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können | ||||||
|  |   - Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Webframeworks – Angular JS | ||||||
|  | - Clientseitiges Webframework von Google | ||||||
|  | - Frei verwendbar (Open Source) | ||||||
|  | - Erstellung von Single-Page-Webanwendungen | ||||||
|  | - Model View Prinzip | ||||||
|  | 
 | ||||||
|  | - Vorteile | ||||||
|  |   - Weitergabe von Expertenwissen | ||||||
|  |   - Durchdachtes Design: langfristige Aufwandsersparnis | ||||||
|  |   - Wartungsaufwand reduziert, systematische Tests möglich | ||||||
|  |   - Prinzipiell sehr hohe Produktivität möglich | ||||||
|  |   - Erleichtert Integration und Konsistenz verwandter Anforderungen | ||||||
|  | - Nachteile | ||||||
|  |   - Erstellung und Einarbeitung aufwändig | ||||||
|  |   - Zusätzlicher Dokumentations- und Wartungsaufwand | ||||||
|  |   - Fehlersuche erschwert durch Overhead des Frameworks | ||||||
|  |   - Kombination verschiedener Frameworks sehr schwierig | ||||||
|  | 
 | ||||||
|  | ## Systemarchitektur und Verteilung | ||||||
|  | Systemarchitektur | ||||||
|  | - Aufbau und Elemente der Ablaufumgebung, Hardware | ||||||
|  | - Häufig enger Zusammenhang mit Softwarearchitektur | ||||||
|  |   - Architekturmuster | ||||||
|  |   - Ablaufmuster | ||||||
|  | - Besonders bei eingebetteten Systemen | ||||||
|  | - Systemarchitektur hat Einfluss auf Softwarearchitektur | ||||||
|  |   - Grenzobjekte, Schnittstellen, ... | ||||||
|  | - Gute Systemarchitektur? | ||||||
|  |   - Nichtfunktionale Anforderungen | ||||||
|  |   - Modellierung und Simulation, Lastmessungen | ||||||
|  |   -  | ||||||
|  | Typische Strukturen | ||||||
|  | - Zentralrechner (mainframe) mit Terminals | ||||||
|  | - Server und einfache Stationen | ||||||
|  | - PCs und Server | ||||||
|  | - Kommunikationsverbindungen, Sensoren, Speicher, ... | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | - Blockdiagramm | ||||||
|  |   - Klassisches Beschreibungsmittel für Systemaufbau | ||||||
|  |   - Nicht Teil von UML | ||||||
|  | - Konfigurationsdiagramm | ||||||
|  |   - meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten | ||||||
|  |   - Nicht Teil von UML | ||||||
|  | - Verteilungsdiagramm (UML deployment diagram) | ||||||
|  |   - Darstellung der Hardwaretopologie | ||||||
|  |   - Zuordnung von Artefakten zu Hardwareeinheiten (Knoten) | ||||||
|  |     - Verteilung von Systembestandteilen auf Hardware | ||||||
|  |   - Kommunikationsverbindung und Abhängigkeiten zwischen Knoten | ||||||
|  |   - Relativ spät im Projekt Installation / Wartung des Systems | ||||||
|  | 
 | ||||||
|  | ## Globaler Kontrollfluss | ||||||
|  | Globaler Kontrollfluss | ||||||
|  | - Ablaufsicht der Architektur | ||||||
|  |   - Definition nebenläufiger Systemeinheiten (z.B. Prozesse) | ||||||
|  |   - Steuerung der Abfolge von Einzelfunktionen | ||||||
|  |   - Synchronisation und Koordination | ||||||
|  |   - Reaktion auf externe Ereignisse   | ||||||
|  |   - Darstellung z.B. durch Sequenzdiagramme | ||||||
|  | - Nebenläufigkeit auf Architekturebene | ||||||
|  |   - Threads , Prozesse, verteiltes System | ||||||
|  |   - Asynchroner Nachrichtenaustausch | ||||||
|  | - Einfluss auf Architektur / abhängig von Architektur! | ||||||
|  | - Ablaufmuster | ||||||
|  |   - Zentral | ||||||
|  |     - Call/Return (prozedural, synchron) | ||||||
|  |     - Master/Slave (nebenläufig mit zentraler Steuerung) | ||||||
|  |   - Dezentral | ||||||
|  |     - Ereignisgesteuert (event-driven) | ||||||
|  |       - interrupts | ||||||
|  |       - publish-subscribe (ähnlich observer) | ||||||
|  |       - (selective) broadcast | ||||||
|  |     - Datenflussgesteuert (data flow architecture) | ||||||
|  | 
 | ||||||
|  | ## Sonstiges | ||||||
|  | Ablauf des OO-Systementwurfs [B. Oesterreich] | ||||||
|  | - Schichtenmodell definieren | ||||||
|  | - Verteilungsmodell definieren | ||||||
|  | - Fachliches Subsystemmodell definieren | ||||||
|  | - Ablaufverantwortlichkeiten definieren | ||||||
|  | - Komponentenspezifisches Klassenmodell entwickeln | ||||||
|  | - Komponentenschnittstelle entwerfen | ||||||
|  | - Zustandsmodelle weiterentwickeln | ||||||
|  | - Objektfluss modellieren | ||||||
|  | - Interaktionsmodelle entwickeln, Attribute definieren | ||||||
|  | - Dialoge spezifizieren | ||||||
|  | - Design-Diskurs | ||||||
|  | - Testgetriebene Entwicklung | ||||||
|  | 
 | ||||||
|  | Weitere Aufgaben beim Grobentwurf | ||||||
|  | - Entwurf einer persistenten Datenverwaltung | ||||||
|  |   - Dateisystem, Datenbank | ||||||
|  | - Sicherheit | ||||||
|  |   - Zugriffskontrolle | ||||||
|  |   - Fehlertoleranz (Daten und Hardware) | ||||||
|  |   - Protokollfunktionen | ||||||
|  | - Kontrollfluss | ||||||
|  |   - Ausnahmen | ||||||
|  |   - Starten, Initialisieren und Beenden der Anwendung | ||||||
|  |   - „Randanwendungsfälle“ | ||||||
|  | 
 | ||||||
|  | Notwendigkeit der Architekturdokumentation | ||||||
|  | - Quellcode aufgrund niedrigen Abstraktionsniveaus ungünstig für Dokumentation | ||||||
|  | - Überblick und Arbeitsteilung | ||||||
|  | - Lebensdauer von Systemen länger als geplant | ||||||
|  | - Fehler und Probleme leichter finden und beseitigen | ||||||
|  | - Neue Anforderungen mit angemessenem Aufwand erfüllen | ||||||
|  | - Vereinfachung der Wartung, Pflege, Erweiterung, Wiederverwendung | ||||||
|  | 
 | ||||||
|  | ## Dokumentation | ||||||
|  | - Grundprinzipien | ||||||
|  |   - Verständlich aus Sicht des Lesers formulieren (Glossar) | ||||||
|  |   - Das Warum beschreiben (Entwurfsentscheidungen) | ||||||
|  |   - Annahmen, Voraussetzungen, Randbedingungen dokumentieren | ||||||
|  |   - Wiederholungen vermeiden | ||||||
|  |   - Notation erklären oder Standards verwenden (UML) | ||||||
|  |     - Legende hinzufügen | ||||||
|  |   - Auf Zweckdienlichkeit prüfen, Reviews durchführen (Inhalt, Qualität) | ||||||
|  |   - Verschiedene Sichten für verschiedene Zielgruppen | ||||||
| 
 | 
 | ||||||
| # Feinentwurf | # Feinentwurf | ||||||
|  | 
 | ||||||
|  | | Analyse-Modell | Entwurfs-Modell | | ||||||
|  | | -- | -- | | ||||||
|  | | Fachliche Domäne  | Lösungsdomäne | | ||||||
|  | | Teilweise unvollständig in Attributen und Operationen | Vollständige Angabe aller Attribute und Operationen | | ||||||
|  | | Datentypen und Parameter können noch fehlen | Vollständige Angabe von Datentypen und Parametern | | ||||||
|  | | Noch kaum Bezug zur Realisierungssprache | Auf Umsetzung in gewählter Programmiersprache bezogen | | ||||||
|  | | Keine Überlegungen zur Realisierung von Assoziationen | Navigationsangaben, Qualifikation, Ordnung, Verwaltungsklassen | | ||||||
|  | | | Entscheidung über Datenstrukturen, Anbindung GUI | | ||||||
|  | 
 | ||||||
|  | Schließen der Lücke zwischen Grobentwurf und Implementierung | ||||||
|  | - Identifizieren und Entwerfen von Klassen der Lösungsdomäne | ||||||
|  | - Identifikation und Verwendung von Entwurfsmustern | ||||||
|  | - Detaillierte Beschreibung der Klassen | ||||||
|  | - Beschreibung von Schnittstellen | ||||||
|  | - Iterativer Prozess! | ||||||
|  |   - Verbesserung des Entwurfs – Refactoring | ||||||
|  |   - Optimieren des Entwurfsmodells zur Erfüllung nichtfunktionaler Anforderungen | ||||||
|  | 
 | ||||||
|  | Objektorientierter Feinentwurf | ||||||
|  | - Ausgangspunkt | ||||||
|  |   - Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen) | ||||||
|  |   - Verteilungskonzept | ||||||
|  |   - Ablaufmodell | ||||||
|  | - Ergebnis | ||||||
|  |   - OO-Modell für jedes Subsystem der Architektur | ||||||
|  |   - OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien | ||||||
|  |   - Spezifikationen der Klassen | ||||||
|  |   - Spezifikationen von externen Schnittstellen | ||||||
|  | 
 | ||||||
|  | ## Klassen- und Objektentwurf | ||||||
|  | - Klassen der Lösungsdomäne | ||||||
|  |   - Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen | ||||||
|  | - Entstehungsgründe | ||||||
|  |   - Architektur von Software und System | ||||||
|  |   - nichtfunktionale Anforderungen | ||||||
|  |   - Beispiele: Kommunikation, Fehlertoleranz, Adapter, Datenhaltung, Effizienz, Benutzerschnittstellenobjekte, Middleware, ... | ||||||
|  |   - Sichtbare (Grenz- und Steuerungsobjekte) werden schon in der Analyse identifiziert | ||||||
|  | 
 | ||||||
|  | Klassen identifizieren (responsibility-driven design (Wirfs-Brock, McKean)) | ||||||
|  | > Verantwortlichkeits-Prinzip: Sichtweise: Objekte und Klassen sind nicht nur Behälter für Verhalten und Daten, sondern erfüllen in Zusammenarbeit mit anderen Objekten bestimmte Aufgaben eigenverantwortlich | ||||||
|  | 
 | ||||||
|  | Responsibility-Driven Design – Begriffe | ||||||
|  | - Sichtweise auf Softwaresystem | ||||||
|  | - Application = set of interacting objects | ||||||
|  | - Object = implementation of role(s) | ||||||
|  | - Role = set of related responsibilities | ||||||
|  | - Responsibility = obligation to perform a task or know information | ||||||
|  | - Collaboration = interaction of objects or roles  | ||||||
|  | - Contract = agreement outlining collaboration terms | ||||||
|  | 
 | ||||||
|  | Arten von Rollen | ||||||
|  | ||| | ||||||
|  | |--|--| | ||||||
|  | | Information holder  | knows and provides information | | ||||||
|  | | Structurer | maintains relationship between objects and information about relationships | | ||||||
|  | | Service provider | performs work, offers computing services | | ||||||
|  | | Coordinator | reacts to events by delegating tasks to others | | ||||||
|  | | Controller | makes decisions and directs other’s actions | | ||||||
|  | | Interfacer | transforms information and requests between system parts | | ||||||
|  | 
 | ||||||
|  | Hilfsmittel: CRC-Karten | ||||||
|  | - Candidate (or class), Responsibility, Collaboration | ||||||
|  | - Informelles Mittel zum | ||||||
|  |   - Finden, | ||||||
|  |   - Beschreiben und | ||||||
|  |   - iterativen Verändern von Klassen | ||||||
|  | 
 | ||||||
|  | Ein Objekt | ||||||
|  | - implementiert eine Schnittstelle und beeinflusst andere Objekte | ||||||
|  | - wird in drei Teilen entworfen | ||||||
|  |   - Öffentliche Schnittstelle | ||||||
|  |   - Art und Weise der Benutzung | ||||||
|  |   - Innere Details der Funktionsweise | ||||||
|  | - Kohärenz: zusammengehörende Verantwortlichkeiten in einer Klasse konzentrieren! | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Entwurfsprinzipien | ||||||
|  | - Kapselung | ||||||
|  |   - Probleme: Zugriff auf private oder ebenen-fremde Attribute | ||||||
|  |   - Verwenden von get- und set-Operationen | ||||||
|  |   - Zusicherungen einhalten | ||||||
|  |   - Zugriffe zentralisieren | ||||||
|  |   - Verbalisierung | ||||||
|  |   - Zugriffsbeschränkung | ||||||
|  | - Zerlegung | ||||||
|  |   - Teile und Herrsche | ||||||
|  |   - Zerlegen in Komponenten | ||||||
|  |   - Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich | ||||||
|  |   - Eigenschaften und Schnittstellen im Klassendiagramm | ||||||
|  |   - Beziehungen zwischen Klassen: Assoziationen | ||||||
|  |   - Aggregation | ||||||
|  |     - „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“ | ||||||
|  |     - Schwache Bindung der Teile mit dem Ganzen | ||||||
|  |     - Notation: ungefüllte Raute am Ganzen | ||||||
|  |   - Komposition | ||||||
|  |     - Wie Aggregation, jedoch stärkere Bindung | ||||||
|  |     - Teil nur einem Ganzen zugeordnet | ||||||
|  |     - Nur Multiplizität von 1 oder 0..1 möglich! | ||||||
|  |     - Gefüllte Raute am Ganzen | ||||||
|  | - Polymorphie | ||||||
|  |   - Reaktion auf eine Nachricht abhängig vom Typ des Objektes | ||||||
|  |   - Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte) | ||||||
|  |   - Überladen von Operationen | ||||||
|  |     - gleicher Operationsname, unterschiedliche Signatur | ||||||
|  |   - abstrakte Operationen: Virtuelle Operationen ohne Implementierung | ||||||
|  |   - abstrakte Klasse: Klasse mit abstrakten Operationen | ||||||
|  |   - Folgen | ||||||
|  |     - von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt) | ||||||
|  |     - Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können | ||||||
|  | 
 | ||||||
|  | Vererbung im Entwurf | ||||||
|  | - In der Analyse: Klassifikation von Objekten, Taxonomie, Spezialisierung/Verallgemeinerung, Organisation von Klassen in Hierarchien | ||||||
|  | - Verringerung von Redundanz und damit Inkonsistenzen | ||||||
|  |   - Funktionalität nur einmal implementieren! | ||||||
|  |   - Spezifikations-Wiederverwendung | ||||||
|  |   - Implementierungs-Wiederverwendung | ||||||
|  | - Verbesserung der Erweiterbarkeit | ||||||
|  |   - Abstrakte Schnittstellen einsetzen! | ||||||
|  | 
 | ||||||
|  | Vererbung oder Assoziation | ||||||
|  | - Schlüsselwort Vererbung: ist ein | ||||||
|  | - Schlüsselwort Assoziation: besteht aus, ist Teil, hat,... | ||||||
|  | - Vererbung: Unterscheidungsmerkmal definierbar (Diskriminator) | ||||||
|  | - Vermeide Vererbung, wenn es Alternativen gibt | ||||||
|  | - Mehrfachvererbung | ||||||
|  |   - Problem: Unabhängige Aspekte der Vererbungshierarchie | ||||||
|  |   - Vermeidung: abstrakte Klassen oder Komposition | ||||||
|  | 
 | ||||||
|  | Abstrakte Klassen | ||||||
|  | - Nur Unterklassen, keine Instanzen | ||||||
|  | - Attribute in Unterklassen füllen | ||||||
|  | - Notation: Kursiv oder Stereotyp <<abstract>> | ||||||
|  | 
 | ||||||
|  | Offen / Geschlossen-Prinzip [Meyer 1988] | ||||||
|  | - Erweiterbarkeit eines Entwurfs | ||||||
|  | - Offen für Erweiterungen, | ||||||
|  |   - z.B. durch Vererbung / Polymorphie | ||||||
|  |   - Virtuelle Operationen verwenden | ||||||
|  |   - Verändert vorhandenes Verhalten nicht | ||||||
|  |   - Erweiterung um zusätzliche Funktionen oder Daten | ||||||
|  | - Geschlossen für Änderungen | ||||||
|  |   - private Attribute | ||||||
|  |   - Möglichst protected Operationen | ||||||
|  | - Beschränkung der Erweiterbarkeit | ||||||
|  |   - Keine Einschränkungen der Funktionalität der Basisklasse! | ||||||
|  | 
 | ||||||
|  | Liskovsches Ersetzungsprinzip | ||||||
|  | - Wenn S eine Unterklasse von T ist, dann können Objekte des Typs T in einem Programm durch Objekte des Typs S ersetzt werden, ohne die Funktion des Programms zu verändern. [Barbara Liskov 1987] | ||||||
|  | - Engere Definition als „ist-ein“-Beziehung | ||||||
|  | - Kein unerwartetes Verhalten eines Objektes eines Subtyps | ||||||
|  | - Methoden, die Objekte der Basisklasse erwarten, müssen auch mit Objekten der abgeleiteten Klasse funktionieren | ||||||
|  | - Zusicherungen der Basisklasse müssen von der abgeleiteten Klasse erfüllt werden! | ||||||
|  | 
 | ||||||
|  | Gesetz von Demeter (LoD) | ||||||
|  | - Gesetz von „schüchternen“ Objekten | ||||||
|  | - Objekte sollen nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren | ||||||
|  | - Aus einer Methode M dürfen (sollten) nur Nachrichten an Objekte gesendet werden, die ... | ||||||
|  |   - unmittelbarer Bestandteil des Objekts von M sind (super) | ||||||
|  |   - M als Argument übergeben wurden | ||||||
|  |   - direkt in M erzeugt wurden | ||||||
|  |   - (oder sich in globalen Variablen befinden) | ||||||
|  | - Als Metrik überprüfbar | ||||||
|  | 
 | ||||||
|  | Ein Objekt sollte | ||||||
|  | - Nur Methoden aufrufen, die zur eigenen Klasse gehören | ||||||
|  | - Nur Methoden von Objekten aufrufen, die: | ||||||
|  |   - Von Attributen referenziert werden | ||||||
|  |   - Als Parameter übergeben wurden | ||||||
|  |   - Selbst erzeugt wurden | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Entwurfsmodelle | ||||||
|  | Klassendiagramm | ||||||
|  | - Eigenschaften | ||||||
|  |   - Modellierung der statischen Struktur (Aufbau) | ||||||
|  |   - Modellierung der Struktur von Daten | ||||||
|  |   - Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander) | ||||||
|  |   - Wichtigstes und bekanntestes Diagramm der UML! | ||||||
|  | - Elemente des Klassendiagramms | ||||||
|  |   - Klasse (Attribute, Operationen) | ||||||
|  |   - Vererbung / Realisierung | ||||||
|  |   - Assoziationen | ||||||
|  |   - Beziehungen / Abhängigkeiten | ||||||
|  | - Attribute | ||||||
|  |   - Klassenattribut: "X" static – statisch, nur einmal pro Klasse vorhanden | ||||||
|  |   - Sichtbarkeit | ||||||
|  |     - "+" public – im Namensraum sichtbar | ||||||
|  |     - "#" protected – nur in abgeleiteten Klassen sichtbar | ||||||
|  |     - "~" package – im Paket sichtbar | ||||||
|  |     - "-" private – nur in der Klasse selbst sichtbar | ||||||
|  |   - Ableitung "/" derived – abgeleitetes Attribut | ||||||
|  | - Weitere Eigenschaften | ||||||
|  |   - readOnly – nach Initialisierung nicht änderbar | ||||||
|  |   - composite – Aggregation: Composition | ||||||
|  |   - redefines X – überschreibe Attr. der Oberklasse | ||||||
|  |   - subsets X – Teilmenge | ||||||
|  |   - union – Attribut ist Vereinigung der subsets | ||||||
|  |   - unique – Elemente eindeutig (Schlüsselattribut) | ||||||
|  |   - ordered – Elemente sind geordnet (unordered) | ||||||
|  |   - sequence – Speicherung der Elemente als Liste | ||||||
|  |   - bag – Elemente sind Multimenge | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Schnittstellen | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Entwurfsmuster | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Klassenbibliotheken und Komponenten | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Dokumentation | ||||||
|  | 
 | ||||||
| # Implementierung | # Implementierung | ||||||
| # Vorgehensweise | # Vorgehensweise | ||||||
| # Projektmanagement | # Projektmanagement | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user