Grobentwurf
This commit is contained in:
		
							parent
							
								
									6ca5c8a293
								
							
						
					
					
						commit
						85583daa9a
					
				| @ -771,9 +771,712 @@ Pflichtenheft (Beispiel) | ||||
| 
 | ||||
| 
 | ||||
| # 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 | ||||
| 
 | ||||
| | 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 | ||||
| # Vorgehensweise | ||||
| # Projektmanagement | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user