Grobentwurf

This commit is contained in:
WieErWill 2021-01-14 17:45:26 +01:00
parent 6ca5c8a293
commit 85583daa9a

View File

@ -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 GUIs
- 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 others 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