From 67c58c762c0867882b7d0e139035e7ad90370fd7 Mon Sep 17 00:00:00 2001 From: Robert Jeutter Date: Mon, 15 Mar 2021 12:02:46 +0100 Subject: [PATCH] Modelle und Analyse hydriert --- Softwaretechnik - Cheatsheet.pdf | Bin 233170 -> 229569 bytes Softwaretechnik - Cheatsheet.tex | 4526 +++++++++++++----------------- 2 files changed, 1907 insertions(+), 2619 deletions(-) diff --git a/Softwaretechnik - Cheatsheet.pdf b/Softwaretechnik - Cheatsheet.pdf index d7230e1e877a9874d253e0db5a89943b85f4a11b..5f894f9d4e977c38466a781a625f3875cbb81a38 100644 GIT binary patch delta 151154 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�jEN%XBppz0yD0+RD_>ei1DH_p3ggY^iXOv74gfD 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
T@({V*V$x{#XalY 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

rA5UG|iX3B|7u%c+Y_gB&@zfe}e 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 diff --git a/Softwaretechnik - Cheatsheet.tex b/Softwaretechnik - Cheatsheet.tex index 8d80be6..cdc95dc 100644 --- a/Softwaretechnik - Cheatsheet.tex +++ b/Softwaretechnik - Cheatsheet.tex @@ -82,40 +82,6 @@ \titlespacing{\subsection}{0pt}{*0}{*0} \titlespacing{\subsubsection}{0pt}{*0}{*0} -%Tikz global setting -\tikzset{ - topic/.style={ - text centered, - text width=5cm, - level distance=1mm, - sibling distance=5mm, - rounded corners=2pt - }, - subtopic/.style={ - yshift=1.5cm, - text centered, - text width=3cm, - rounded corners=2pt, - fill=gray!10 - }, - theme/.style={ - grow=down, - xshift=-0.6cm, - text centered, - text width=3cm, - edge from parent path={(\tikzparentnode.205) |\item (\tikzchildnode.west)} - }, - description/.style={ - grow=down, - xshift=-0.5cm, - right, - text centered, - edge from parent path={(\tikzparentnode.200) |\item (\tikzchildnode.west)} - }, - level 1/.style={sibling distance=5.5cm}, - level 1/.append style={level distance=2.5cm}, -} - % Turn off header and footer \pagestyle{empty} \begin{document} @@ -130,243 +96,84 @@ \setlength{\multicolsep}{1pt} \setlength{\columnsep}{2pt} - Gute Software ist schwer herzustellen - \begin{itemize*} - \item Entspricht Kundenwünsche, Vollständigkeit - \item Funktioniert Korrekt - \item Kosten- und Termintreue bei der Erstellung - \item weitere nicht-funktionale Qualitätsforderungen - \begin{itemize*} - \item Benutzerfreundlichkeit, Ergonomie - \item Sicherheit - \item Zuverlässigkeit, Fehlertoleranz - \item Performanz - \item Ressourcen-Effizienz, Skalierbarkeit, Übertragbarkeit - \item Wartbarkeit, Änder- und Erweiterbarkeit - \end{itemize*} - \end{itemize*} - - Softwaretechnik - \begin{itemize*} - \item Technische Disziplin der Software Herstellung - \item Zielorientierte Bereitstellung uns systematische Verwendung von Prinzipien, Methoden und Werkzeugen für die arbeitsteilige, ingenieurmäßige Entwicklung und Anwendung von umfangreichen Softwaresystemen [Balzert] - \end{itemize*} - Wie kann man Software besser entwickeln? \begin{itemize*} \item Ingenieursmäßige Herangehensweise - \begin{itemize*} - \item Verwendung bekannter Prinzipien und Methoden - \item Systematische Vorgehensweise - \end{itemize*} + \begin{itemize*} + \item Verwendung bekannter Prinzipien und Methoden + \item Systematische Vorgehensweise + \end{itemize*} \item Verwendung von: - \begin{itemize*} - \item Abstraktion, Modelle, Notation, Simulation - \item Wiederverwendung:Muster, Komponenten, Framework - \end{itemize*} + \begin{itemize*} + \item Abstraktion, Modelle, Notation, Simulation + \item Wiederverwendung:Muster, Komponenten, Framework + \end{itemize*} \item Organisation - \begin{itemize*} - \item Arbeitsteilung, Integration, Planung - \end{itemize*} + \begin{itemize*} + \item Arbeitsteilung, Integration, Planung + \end{itemize*} \item Verwendung von Werkzeugen - \begin{itemize*} - \item IDE (Integrated Development Environment) - \item Versionierung, Bugtracker, Modellierungswerkzeug - \end{itemize*} + \begin{itemize*} + \item IDE (Integrated Development Environment) + \item Versionierung, Bugtracker, Modellierungswerkzeug + \end{itemize*} \end{itemize*} \section{Modellierungskonzepte} - > Modell: ist eine Abstraktion eines Systems mit der Zielsetzung, das Nachdenken über ein System zu vereinfachen, indem irrelevante Details ausgelassen werden [Brügge] - $\rightarrow$ Beschreibung eines Ausschnitts der Realität + Modell: ist eine Abstraktion eines Systems mit der Zielsetzung, das Nachdenken über ein System zu vereinfachen, indem irrelevante Details ausgelassen werden \begin{itemize*} \item erstellen einer Abstraktion \item abbilden signifikanter Eigenschaften \item Deskriptiv/präskriptiv (real oder geplant) \item Sichtweise auf ein System (Struktur, Verhalten, Zustand,...) - \item heißt Weglassen \item setzt Verstehen voraus \item ist nicht automatisierbar \end{itemize*} - Verschiedene Modelle: - \begin{itemize*} - \item Analysemodell - \item Entwurfsmodell - \item Implementierung (-smodell) - \item Vorgehensmodell - \item Produktmodell - \item Dokumentation, Alternativen-Auswahl - \end{itemize*} - - Modelle für: - \begin{itemize*} - \item Sichten - \item Funktionen - \item Daten - \item Algorithmen - \item Systemumgebung - \item Dynamisches Verhalten - \item Objektorientierte Modelle - \end{itemize*} - - \subsection{Klassische Modelle} - \begin{itemize*} - \item Funktionen: - \begin{itemize*} - \item Funktionsbaum - \begin{itemize*} - \item Hierarchische Dekomosition der Fkt - \item nummerieren der Ebenen/Funktionen möglich - \item Bsp: Abonnement Verwaltung - \end{itemize*} - \item Blockschaltbild - \begin{itemize*} - \item eingebettetes System, HW/SW - \end{itemize*} - \end{itemize*} - \item Daten - \begin{itemize*} - \item Data Dictionary - \begin{itemize*} - \item Verzeichnis von Daten mit Strukturinformationen - \item Backus-Naur-Form, kontextfreie Grammatik - \end{itemize*} - \item Entity Relationship Diagram - \begin{itemize*} - \item Daten und ihre Beziehungen - \end{itemize*} - \end{itemize*} - \item Systemumgebung - \begin{itemize*} - \item Datenflussdiagramm - \begin{itemize*} - \item Fluss und Transformation von Daten zwischen Funktionen, Speichern und Schnittstellen - \item kein Kontrollfluss - \end{itemize*} - \end{itemize*} - \item Algorithmen - \begin{itemize*} - \item Entscheidungstabelle - \begin{itemize*} - \item Regelbasierte Beschreibung - \item Bedingung - \item Aktionen - \item Reduktionsregeln - \end{itemize*} - \item Pseudocode - \begin{itemize*} - \item von Programmiersprache abstrahierende, detaillierte Beschreibung eines Algorithmus - \end{itemize*} - \item Programmablaufplan - \begin{itemize*} - \item Grafische Beschreibung des Kontrollflusses - \item DIN 66001 - \item Unstrukturiert - \end{itemize*} - \item Struktogramm - \begin{itemize*} - \item Nassi-Shneidermann-Diagramm - \item keine Sprünge - \end{itemize*} - \end{itemize*} - \item Dynamisches Verhalten (diskrete Zustände und atomare zustandübergänge) - \begin{itemize*} - \item Zustandsautomat - \begin{itemize*} - \item Verhalten mit Zuständen und -übergängen - \item Automatenmodelle und -theorie - \item Ggf zerlegung oder kommunizierende Automaten - \end{itemize*} - \item Flow-Chart - \item Ereignisgesteuerte Prozesskette (EPK) - \begin{itemize*} - \item Geschäftsprozesse - \item BPM - \end{itemize*} - \item Petri-Netz (ggf. mit Zeitmodell) - \begin{itemize*} - \item Grafische Beschreibung von Nebenläufigkeit und Synchronisation - \end{itemize*} - \end{itemize*} - \item Objektorientierte Modelle - \begin{itemize*} - \item Klassendiagramme - \item UML - \end{itemize*} - \end{itemize*} - - \subsection{Objektorientierung} \begin{itemize*} - \item bessere Strukturierung für komplexe Zusammenhänge - \item Abstraktere Sichtweise - \item Grundprinzip: Zerlegung; Teile und Herrsche - \item ein System besteht aus vielen Objekten - \item ein Objekt hat - \begin{itemize*} - \item definiertes Verhalten - \begin{itemize*} - \item Menge genau definierter Operationen - \item Operation wird beim Empfang einer Nachricht ausgeführt - \end{itemize*} - \item inneren Zustand - \begin{itemize*} - \item Zustand des Objekts ist Privatsache - \item Resultat einer Operation hängt vom aktuellen Zustand ab - \end{itemize*} - \item eindeutige Identität - \begin{itemize*} - \item Identität ist unabhängig von anderen Eigenschaften - \item Mehrere verschiedene Objekte mit identischem Verhalten und identischem inneren Zustand im gleichen System möglich - \end{itemize*} - \end{itemize*} + \item Grundprinzip: Teile und Herrsche + \item ein System besteht aus vielen Objekten, mit: + \begin{itemize*} + \item definiertes Verhalten + \begin{itemize*} + \item Menge genau definierter Operationen + \item Operation beim Empfang einer Nachricht ausgeführt + \end{itemize*} + \item inneren Zustand + \begin{itemize*} + \item Zustand des Objekts ist Privatsache + \item Resultat hängt vom aktuellen Zustand ab + \end{itemize*} + \item eindeutige Identität + \begin{itemize*} + \item Identität ist unabhängig von anderen Eigenschaften + \item verschiedene Objekte mit identischem Verhalten im gleichen System möglich + \end{itemize*} + \end{itemize*} \item Klasse - \begin{itemize*} - \item Gleichartige Objekte mit ggf. verschiedenen Zuständen - \item Verhaltensschema - Operationen - \item Innere Struktur - Attribute - \end{itemize*} + \begin{itemize*} + \item Gleichartige Objekte mit ggf. verschiedenen Zuständen + \item Verhaltensschema - Operationen + \item Innere Struktur - Attribute + \end{itemize*} + \item Vorteile + \begin{description*} + \item[Zuständigkeitsbereiche] Daten, Operationen und Zustand: lokal und gekapselt + \item[Klare Schnittstellen] Definiertes Objektverhalten, Nachrichten + \item[Hierarchie] Vererbung und Polymorphie (Spezialisierung), Klassenschachtelung + \item[Baukastenprinzip] Benutzung vorgefertigter Klassenbibliotheken, Anpassung durch Spezialisierung + \end{description*} \end{itemize*} - Vorteile der Objektorientierung - \begin{itemize*} - \item Zuständigkeitsbereiche - \begin{itemize*} - \item Daten, Operationen und Zustand: lokal und gekapselt - \end{itemize*} - \item Klare Schnittstellen - \begin{itemize*} - \item Definiertes Objektverhalten, Nachrichten - \end{itemize*} - \item Hierarchie - \begin{itemize*} - \item Vererbung und Polymorphie (Spezialisierung), Klassenschachtelung - \end{itemize*} - \item Baukastenprinzip - \begin{itemize*} - \item Benutzung vorgefertigter Klassenbibliotheken, Anpassung durch Spezialisierung (mittels Vererbung) - \end{itemize*} - \end{itemize*} - - \subsection{Unified Modeling Language} \begin{itemize*} \item Grafisches Beschreibungsmittel für Aspekte des Softwareentwurfs diskreter Systeme - \item Spezifikation, Entwurf, Visualisierung, Konstruktion, Dokumentation von Software - \item Für OO-Softwareentwicklung und -prozess geeignet - \item UML ist weder Methode noch Prozess - \end{itemize*} - - Warum UML? - \begin{itemize*} - \item Objektorientierung ist zur Zeit das vorherrschende Modellierungs-Paradigma, Industrie-Standard \item Kombination von Struktur-, Verhaltens-, Interaktions-, und Verteilungsmodellen \item Für Analyse, Entwurf, Implementierung und Test einsetzbar \item Gute Werkzeugunterstützung für Editieren, Versionierung, Codegenerierung \item Erweiterbarkeit der UML mit Stereotypen und Tags - \item Semi-formale Modelle, z.T. verschiedene Interpretationen - \item Offenheit: Erweiterung mit stereotypes, tags, constraints \end{itemize*} Nachteile UML @@ -375,24 +182,50 @@ \item Werkzeuge für Transformation, Analyse etc. fehlen noch \item UML ist keine „kleine Sprache“: Lernaufwand notwendig \item Komponenten sind nicht adäquat darstellbar - \item Sprachen wie die UML werden erlernt durch Übung! - \item Aber: LV SWT ist kein kompletter UML-Kurs \end{itemize*} - \paragraph{Überblick über Modelle} + \subsection{Klassische Modelle} \begin{itemize*} - \item 14 Diagrammarten + \item Funktionen + \begin{itemize*} + \item Funktionsbaum + \item Blockschaltbild + \end{itemize*} + \item Daten + \begin{itemize*} + \item Data Dictionary (Daten mit Strukturinformationen) + \item Entity Relationship Diagram + \end{itemize*} + \item Systemumgebung (Datenflussdiagramm) + \item Algorithmen + \begin{itemize*} + \item Entscheidungstabelle + \item Pseudocode + \item Programmablaufplan + \item Struktogramm + \end{itemize*} + \item Dynamisches Verhalten (diskrete Zustände und atomare zustandübergänge) + \begin{itemize*} + \item Zustandsautomat + \item Flow-Chart + \item Ereignisgesteuerte Prozesskette (EPK) + \item Petri-Netz (ggf. mit Zeitmodell) + \end{itemize*} + \item Objektorientierte Modelle + \begin{itemize*} + \item Klassendiagramme + \item UML + \end{itemize*} \item Struktur-Diagramme - \begin{itemize*} - \item Klassen-, Objekt-, Komponenten-, Kompositions-Struktur-, - \item Paket- und Verteilungsdiagramm - \item Profildiagramm - zur UML-Erweiterung - \end{itemize*} + \begin{itemize*} + \item Klassen-, Objekt-, Komponenten-, Kompositions-Struktur-, + \item Paket- und Verteilungsdiagramm + \end{itemize*} \item Verhaltens-Diagramme - \begin{itemize*} - \item Use-Case-, Aktivitäts- und Zustandsdiagramms - \item Interaktionsdiagramme: Sequenz-, Kommunikations-, Timing- und Interaktionsübersichts-Diagramm - \end{itemize*} + \begin{itemize*} + \item Use-Case-, Aktivitäts- und Zustandsdiagramms + \item Interaktionsdiagramme: Sequenz-, Kommunikations-, Timing- und Interaktionsübersichts-Diagramm + \end{itemize*} \end{itemize*} \paragraph{Use-Case-Diagramm} @@ -402,62 +235,30 @@ \item Planbare Einheiten als Inkremente für die Entwicklung \item Keine Modellierung eines Ablaufs! \item Erstellen von Testfällen (test case generation) - \item Grundelemente - \begin{itemize*} - \item Anwendungsfall: Use Case - \item Beteiligte: Aktor - \end{itemize*} - \item Verfeinerung mittels Use-Case-Realisierung notwendig - \begin{itemize*} - \item Textuelle Beschreibung - \item Verhaltensdiagramme - \end{itemize*} \end{itemize*} \paragraph{Klassendiagramm} \begin{itemize*} \item Modellierung der Struktur (Aufbau) eines Systems - \item Modellierung von statischen Aspekten - \item Modellierung der Struktur von Daten - \item Klasse im Mittelpunkt - \begin{itemize*} - \item Aufbau: Attribute, Operationen - \item Beziehungen zueinander: Assoziationen, Vererbung - \end{itemize*} - \item Verbreitetstes und bekanntestes Diagramm der UML + \item Modellierung von statischen Aspekten und Struktur von Daten + \item Klasse im Mittelpunkt (Attribute, Operationen, Beziehung) \end{itemize*} \paragraph{Objektdiagramm} \begin{itemize*} \item Struktur des Systems zur Laufzeit zu einem Zeitpunkt - \item Tatsächliche Zusammenhänge und Belegungen von Attributen von Objekten zu einem Zeitpunkt - \item Eine detaillierte Sicht auf einen Aspekt - \begin{itemize*} - \item Keine vollständige Beschreibung (zu komplex) - \item Für kompliziertere Abhängigkeiten (z.B. Rekursion) - \end{itemize*} - \item Objektdiagramm für alle Arten von Exemplaren - \begin{itemize*} - \item z.B.: Klasse (Objekt), Komponente, Knoten, ... - \end{itemize*} - \item Keine Exemplare von Operationen -> Ablauf -> Verhaltensdiagramme / Interaktionsdiagramme + \item detaillierte Sicht auf einen Aspekt + \item Keine Exemplare von Operationen \item Kein Verlauf der Wertebelegung über die Zeit \end{itemize*} \paragraph{Paketdiagramm} \begin{itemize*} - \item Gliederung (Strukturierung) des Systems in Teile (Pakete) + \item Gliederung des Systems in Teile (Pakete) \item Zuordnung von Elementen zu einem Paket \item Bildung von Hierarchien (Enthält-Beziehung) \item Abhängigkeiten zwischen den Paketen - \begin{itemize*} - \item "Include" von Quellcode-Dateien (<>) - \end{itemize*} - \item Anwendung: - \begin{itemize*} - \item Zum Grobentwurf von Systemen - \item Definition von Schichten - \end{itemize*} + \item Zum Grobentwurf von Systemen \end{itemize*} \paragraph{Komponentendiagramm} @@ -471,56 +272,39 @@ \paragraph{Kompositionsstrukturdiagramm} \begin{itemize*} - \item Teile-Ganzes-Strukturen -> Kompositionsstruktur - \item Strukturell statische Kompositionsstrukturen: - \begin{itemize*} - \item Kurzschreibweise bei vielen Kompositionen - \item Modellierung des Aufbaus komplexer Systeme - \end{itemize*} - \item Strukturell dynamische Kompositionsstrukturen: - \begin{itemize*} - \item Notwendige Strukturen zur Realisierung eines Verhaltens - \item Definition von Rollen, zur Lösung wiederkehrender Probleme -> Modellierung von Mustern - \end{itemize*} - \item Starke Verwandtschaft mit dem Klassendiagramm - \item Spezialisierte Kompositionsbeziehung -> erweiterte Semantik + \item Teile-Ganzes-Strukturen $\rightarrow$ Kompositionsstruktur + \item Strukturell statische Kompositionsstrukturen + \item Strukturell dynamische Kompositionsstrukturen + \item Spezialisierte Kompositionsbeziehung $\rightarrow$ erweiterte Semantik \end{itemize*} \paragraph{Aktivitätsdiagramm} \begin{itemize*} - \item Modellierung von - \begin{itemize*} - \item Kontrollflüssen - \item Datenflüssen - \item Parallelem Verhalten - \item Verzweigungen, bedingten und gewichteten Abläufen - \end{itemize*} + \item Modellierung von Kontrollflüssen, Datenflüssen, Parallelem Verhalten \item Geschäftsprozessmodellierung möglich \item Abstrakte und detaillierte Verhaltensbeschreibung möglich \item Grundlage zur Codegenerierung \item Zur Verfeinerung von - \begin{itemize*} - \item Use-Cases - \item Operationen / Interaktionen - \item anderen Aktionen und Aktivitäten - \end{itemize*} + \begin{itemize*} + \item Use-Cases + \item Operationen / Interaktionen + \end{itemize*} \end{itemize*} \paragraph{Interaktionsdiagramme} \begin{itemize*} - \item Modellierung von - \begin{itemize*} - \item Kommunikation zwischen Kommunikationspartnern (Lebenslinie) - \item Operationen (Modellierung eines Programms) - \item Informationsaustausch / Nachrichten - \end{itemize*} - \item Gemeinsames Grundkonzept der Interaktionsdiagramme + \item Modellierung von Kommunikation \& Operationen \item Sehr detaillierte Diagramme - \begin{itemize*} - \item Meist nicht zur vollständigen Beschreibung eines Systems - \item Betrachtung eines wichtigen Teilaspekts - \end{itemize*} + \item Meist nicht zur vollständigen Beschreibung eines Systems + \item Betrachtung eines wichtigen Teilaspekts \item Grundlage zur Codegenerierung + \item Ereignis des Sendens bzw. Empfangens von Nachrichten + \item Typen: + \begin{itemize*} + \item Operationsaufruf (synchron / asynchron) + \item Antwort Nachricht + \item Signal (asynchron), Create-/ Delete Message + \end{itemize*} \end{itemize*} \paragraph{Sequenzdiagramm} @@ -528,6 +312,13 @@ \item Genaue zeitliche Abfolge von Nachrichten \item Umfangreichstes Interaktionsdiagramm \item Kontrollelemente möglich (Schleifen, Verzweigungen) + \item Weitere Elemente des Sequenzdiagramms + \begin{itemize*} + \item Nachrichten ohne Sender z.B. am Beginn einer Interaktion + \item Verlorene Nachrichten (ohne Empfänger) z. B. am Ende einer Interaktion + \item Erzeugen von Lebenslinien + \item Zerstören von Lebenslinien + \end{itemize*} \end{itemize*} \paragraph{Kommunikationsdiagramm} @@ -541,261 +332,91 @@ \item Genaue zeitliche Darstellung von Zustandsübergängen \item Kommunikation abhängiger Zustandsautomaten \item Modellierung einzelner Interaktion - \end{itemize*} - - \paragraph{Prinzipieller Aufbau} - \begin{itemize*} \item Zeitlicher Verlauf senkrecht \item Kommunikationspartner waagerecht (unsortiert) - \item Lebenslinie - \begin{itemize*} - \item Rechteck mit gestrichelter senkrechter Linie - \item Start, Ende und Dauer der Ausführung einer Operation - \item Rekursive Aufrufe möglich - \end{itemize*} \item Ereignisspezifikation - \begin{itemize*} - \item Stelle des Sendens / Empfangens der Nachricht - \item Definition der Reihenfolge des Auftretens - \item Trace: Folge von Sende- und Empfangsereignissen - \end{itemize*} - \end{itemize*} - - \paragraph{Weitere Elemente des Sequenzdiagramms} - \begin{itemize*} - \item Nachrichten ohne Sender - \begin{itemize*} - \item z.B. am Beginn einer Interaktion - \end{itemize*} - \item Verlorene Nachrichten (ohne Empfänger) - \begin{itemize*} - \item Nachricht ohne dargestellten Empfänger - \item z. B. am Ende einer Interaktion - \end{itemize*} - \item Erzeugen von Lebenslinien - \begin{itemize*} - \item Gestrichelte Linie mit geöffnetem Pfeil - \item Keine Rückgabenachricht - \item Zeitliche Einrückung des Rechtecks - \end{itemize*} - \item Zerstören von Lebenslinien - \begin{itemize*} - \item Durchgezogene Linie mit Dreieckende - \item Kann Rückgabenachricht erzeugen - \end{itemize*} - \end{itemize*} - - \paragraph{Nachrichten in Interaktionsdiagrammen} - \begin{itemize*} - \item Ereignis des Sendens bzw. Empfangens von Nachrichten - \item Typen: - \begin{itemize*} - \item Operationsaufruf (synchron / asynchron) - \item Antwort Nachricht - \item Signal (asynchron), Create-/ Delete Message - \end{itemize*} - \item Operationsaufruf: Parameterliste muss kompatibel sein - \item Nachrichtentypen + \item Trace: Folge von Sende- und Empfangsereignissen \end{itemize*} \paragraph{Zustandsdiagramm} \begin{itemize*} - \item Modellierung des (vollständigen?) Verhaltens - \begin{itemize*} - \item Zustände von Klassen / Objekten / Komponenten - \item Übergänge zwischen den Zuständen - \item Ereignisse, die Zustandswechsel auslösen - \end{itemize*} + \item Modellierung des (vollständigen) Verhaltens + \begin{itemize*} + \item Zustände von Klassen / Objekten / Komponenten + \item Übergänge zwischen den Zuständen + \item Ereignisse, die Zustandswechsel auslösen + \end{itemize*} \item Modellierung von endlichen Automaten (Zustandsmaschinen) - \begin{itemize*} - \item Deterministische - \item Nichtdeterministische - \end{itemize*} - \item Verfeinerung von Zuständen möglich + \begin{itemize*} + \item Deterministische + \item Nichtdeterministische + \end{itemize*} \item Modellierung von verteilten Systemen / parallelem Verhalten \item Grundlage zur Codegenerierung \end{itemize*} - + \newpage \section{Analyse} + + Funktionale Anforderungen - Was soll es tun? \begin{itemize*} - \item Einordnung in den Projektablauf - \item Was ist eine Anforderung? - \begin{itemize*} - \item Merkmal, Eigenschaft, Bedingung oder Einschränkung eines Systems - \item Notwendig für die Akzeptanz vom Kunden - \item Definition (IEEE 610.12-1990) - \begin{itemize*} - \item Dokumentierte Darstellung einer Fähigkeit oder Eigenschaft - \item von Anwender benötigt zur Problemlösung bzw. um Ziel zu erreichen - \item Muss von System oder Komponente erfüllt werden, um Vertrag oder Standard zu erfüllen - \end{itemize*} - \end{itemize*} + \item Was leistet das System + \item Welche Funktionen bietet es + \item Wie interagiert es mit der Umgebung + \item Anforderungen an: Verhalten, Struktur \end{itemize*} + Nichtfunktionale Anforderungen - Wie? \begin{itemize*} - \item Funktionale Anforderungen - Was soll es tun? - \begin{itemize*} - \item „...Legt eine vom Softwaresystem oder einer seiner Komponenten bereitzustellende Funktion oder Service dar“ [Balzert] - \item Was leistet das System - \item Welche Funktionen bietet es - \item Wie interagiert es mit der Umgebung - \item Anforderungen an: - \begin{itemize*} - \item Verhalten - \item Struktur - \item (Alternativ: Statik, Dynamik, Logik) - \end{itemize*} - \end{itemize*} - \item Nichtfunktionale Anforderungen - Wie? - \begin{itemize*} - \item „...legen qualitative oder quantitative Eigenschaften des Softwareprojektes oder einer Komponente fest“ [Balzert] - \item Auch Bezeichnet als: - \begin{itemize*} - \item Quality of Service - \item Qualitätsanforderungen - \end{itemize*} - \item Arten - FURPS (ISO 9126): - \begin{itemize*} - \item Functionality (Funktionalität) - \item Usability (Benutzbarkeit) - \item Reliability (Zuverlässigkeit) - \item Performance (Effizienz) / Portability (Übertragbarkeit) - \item Supportability (Änderbarkeit/ Wartbarkeit) - \end{itemize*} - \end{itemize*} - \end{itemize*} - - \begin{itemize*} - \item Funktionalität - \begin{itemize*} - \item Angemessen, Genauigkeit - \item Sicherheit: Vertraulichkeit, Informationssicherheit, Datenintegrität, Verfügbarkeit - \item (Nicht ausreichend spezifizierte funktionale Anforderung) - \end{itemize*} - \item Benutzbarkeit - \begin{itemize*} - \item Verständlichkeit, Erlernbarkeit, Bedienbarkeit, Attraktivität - \end{itemize*} - \item Zuverlässigkeit - \begin{itemize*} - \item Reife (Fehler-Anzahl), Fehlertoleranz, Wiederherstellbarkeit - \end{itemize*} - \item Effizient/ Leistungsanforderungen - \begin{itemize*} - \item Zeitverhalten, Verbrauchsverhalten, Wirtschaftlichkeit - \end{itemize*} - \item Portabilität - \begin{itemize*} - \item Anpassbarkeit, Installierbarkeit, Koexistenz, Austauschbarkeit - \end{itemize*} - \item Wartbarkeit - \begin{itemize*} - \item Analysierbarkeit, Änder\item und Erweiterbarkeit, Stabilität (bei Änderungen), Testbarkeit - \end{itemize*} - \item Weitere: - \begin{itemize*} - \item Konformität zu Konventionen und Bestimmungen - \item Interoperabilität zu anderen Systemen - \item Implementierungsanforderungen - \item Schnittstellenanforderungen - \item Skalierbarkeit (Änderungen des Problemumfangs) - \item Betriebliche und rechtliche Rahmenbedingungen - \item Liefer\item und Verpackungsanforderungen - \end{itemize*} - \end{itemize*} - - \paragraph{Nichtfunktionale Anforderungen} - Schwierigkeit nichtfunktionaler Anforderungen - \begin{itemize*} - \item Hängen oft von Verhalten ab: daher komplex und nicht direkt sichtbar - \item „Das Auto hat vier Räder“ (Struktur) - \item „Wenn der Blinker betätigt wird, blinkt das Auto dreimal wenn die Zündung an ist; ansonsten wird das Standlicht einseitig eingeschaltet“ (Korrektes Verhalten) - \item „Das Motorsteuergerät darf innerhalb von 5 Jahren und 150.000km Laufleistung höchstens mit 0.1\% Wahrscheinlichkeit ausfallen“ (Zuverlässigkeit) - \end{itemize*} - - Umgang mit nichtfunktionalen Eigenschaften - \begin{itemize*} + \item Quality of Service/Qualitätsanforderungen + \item Hängen oft von Verhalten ab: komplex und nicht direkt sichtbar \item Nicht direkt „by construction“ zu realisieren - \item Naive Herangehensweise: Ignorieren! - \begin{itemize*} - \item Entwerfen und Implementieren der Software ohne Berücksichtigung nichtfunktionaler Eigenschaften - \item Testen der nichtfunktionalen Eigenschaften - \item Wenn nicht erfüllt: Entwurf und Implementierung ändern! - \end{itemize*} - \item Funktioniert nur bei sehr einfachen Systemen, bzw. wenn nichtfunktionale Eigenschaften nicht wichtig sind! - \end{itemize*} - - Sinnvoller Umgang mit nichtfunktionalen Eigenschaften - \begin{itemize*} \item Untersuchung der Projektrisiken bereits in der Analysephase - \begin{itemize*} - \item größte Risiken zuerst betrachten! - \item Immer fragen: Geht das so überhaupt? - \item Festlegungen des Entwurfs möglichst früh gegen Anforderungen prüfen - aber wie? - \end{itemize*} - \item Modellbasierter Entwurf - \begin{itemize*} - \item Modellierung des Systems und seiner Umwelt - \item Bewertung des Modells (Simulation) - \item Lehrveranstaltungen Systementwurf, KIS, LTS - \end{itemize*} + \item Modellbasierter Entwurf des Systems und seiner Umwelt + \item Arten - FURPS (ISO 9126): + \begin{description*} + \item[Functionality] (Funktionalität) Angemessen, Genauigkeit, Sicherheit + \item[Usability] (Benutzbarkeit) Verständlichkeit, Erlernbarkeit, Bedienbarkeit, Attraktivität + \item[Reliability] (Zuverlässigkeit) Reife (Fehler-Anzahl), Fehlertoleranz, Wiederherstellbarkeit + \item[Performance] (Effizienz/Portability) Zeitverhalten, Verbrauchsverhalten, Wirtschaftlichkeit, Koexistenz + \item[Supportability] (Änderbarkeit/Wartbarkeit) Analysierbarkeit, Änder- und Erweiterbarkeit, Stabilität, Testbarkeit + \end{description*} + \item weitere + \begin{itemize*} + \item Konformität zu Konventionen und Bestimmungen + \item Interoperabilität zu anderen Systemen + \item Implementierungsanforderungen + \item Schnittstellenanforderungen + \item Skalierbarkeit (Änderungen des Problemumfangs) + \item Betriebliche und rechtliche Rahmenbedingungen + \item Liefer- und Verpackungsanforderungen + \end{itemize*} \end{itemize*} Randbedingungen \begin{itemize*} - \item „... Eine Randbedingung ist eine organisatorische oder technologische Vorgabe, die die Art und Weise einschränkt, wie das betrachtete System realisiert werden kann.“ \item Werden nicht umgesetzt \item Schränken Lösungsraum ein - \item Beispiele: - \begin{itemize*} - \item Kosten - \item Durchlaufzeit: Time to Market - \item Vorgaben durch Marketing und Vertrieb - \item Technische Randbedingungen (nichtfunktionale Anforderung) - \end{itemize*} + \item Kosten, Durchlaufzeit, Technische Randbedingungen \end{itemize*} %![Analysebaum von Sommerville](Assets/Softwaretechnik1_Analyseformen1.png) %![Analysebaum von Sommerville](Assets/Softwaretechnik1_Analyseformen2.png) Geforderte (Meta-)Eigenschaften - \begin{itemize*} - \item Vollständig: alle Szenarien sind beschrieben - \item Konsistent: keine Widersprüche - \item Eindeutig: nur eine Interpretation möglich - \item Korrekt: genaue und richtige Darstellung - \item Realistisch: unter geg. Einschränkungen implementierbar - \item Überprüfbar: durch Tests am Endprodukt nachweisbar - \item Rückverfolgbar: Auswirkungen bis zur Implementierung nachvollziehbar (Testfälle, Auswirkung von Änderungen) - \item Klassifizierbar (Risiko, Priorität, Dringlichkeit, Nutzen ...) - \item Validierung mit dem Kunden - \end{itemize*} - - \begin{itemize*} - \item Requirements Engineering - \begin{itemize*} - \item Ermittlung, Analyse und Verwaltung von Anforderungen - \item Ausgangspunkt: Projektidee - \end{itemize*} - \item Anforderungsermittlung - \begin{itemize*} - \item requirements elicitation, requirements definition - \item Bestimmen und dokumentieren der Anforderungen an das geplante System - \item Beteiligt: Entwickler, Kunde, Benutzer - \item Ergebnis: Anforderungsspezifikation - Glossar, Vertrag, Lastenheft - \end{itemize*} - \item Anforderungs-Analyse - \begin{itemize*} - \item requirements analysis, system modeling - \item Beschreibung im Detail und formal strukturiert - \item Beteiligt: Entwickler - \item Ergebnis: funktionale Spezifikation - Produktdefinition, Analysemodell, Pflichtenheft - \end{itemize*} - \end{itemize*} + \begin{description*} + \item[Vollständig] alle Szenarien sind beschrieben + \item[Konsistent] keine Widersprüche + \item[Eindeutig] nur eine Interpretation möglich + \item[Korrekt] genaue und richtige Darstellung + \item[Realistisch] unter geg. Einschränkungen implementierbar + \item[Überprüfbar] durch Tests am Endprodukt nachweisbar + \item[Rückverfolgbar] Auswirkungen bis Implementierung nachvollziehbar + \item[Klassifizierbar] Risiko, Priorität, Dringlichkeit, Nutzen ... + \item[Validierung] mit dem Kunden + \end{description*} %![Anforderungsentwicklung von Balzert](Assets/Softwaretechnik1_Anforderungsentwicklung.png) - %| | Anforderungsermittlung | Systemmodellierung | %| -\item | -\item | -\item | %| Ergebnis | Anforderungsspezifikation im Lastenheft, Glossar, Lastenheft | funktionale Spezifikation in Produktdefinition, Analysemodell, Pflichtenheft | @@ -804,495 +425,204 @@ %| Sichtweise | des Anwenders | äußere Systemaspekte | %Vor allem: Kommunikationsleistung! - Bedeutung: - \begin{itemize*} - \item Falsche Anforderungen führen zu falschem System - \item Frühe Fehler im Entwicklungsprozess sind teuer! - \end{itemize*} - - Fehlerentstehung und Fehlerquellen bei Anforderungserfassung - \begin{itemize*} - \item 83\% sprachliche Fehler (Un- bzw. Missverständlich) - \item 75\% Logische Fehler (Widersprüchlichkeit, Redundanz) - \item 73\% Inhaltliche Fehler (Falsche Sachverhalte, Unvollständig) - \end{itemize*} - - \subsection{Ermiteln von Anforderungen} - Woher kommen Anforderungen? + \subsection{Ermitteln von Anforderungen} \begin{itemize*} \item Ausgangspunkt - \begin{itemize*} - \item Projektidee, schriftliche Skizze - \item Kurz und knapp - \item Stichpunkte der wichtigsten Funktionen - \item Lastenheft (falls schon existiert) - \end{itemize*} - \item Interessenhalter (stakeholder) - \begin{itemize*} - \item Identifizieren, Wichtigkeit bewerten (berücksichtigen?) - \item Ansprechpartner? Interessen und Erwartungen - \item Fachexperten, Verantwortliche, Betroffene - \end{itemize*} - \end{itemize*} - - Beteiligte Rollen - \begin{itemize*} - \item Endbenutzer - \begin{itemize*} - \item Aufnahme Ist-Zustand, Domänenwissen, Anforderungen - \end{itemize*} - \item Kunde - \begin{itemize*} - \item Definiert Ziel des Systems, Vertragsverhandlung - \end{itemize*} - \item Konfigurationsmanager - \begin{itemize*} - \item Revisionsgeschichte der Dokumente, Nachvollziehbarkeit - \end{itemize*} - \item Architekt - \begin{itemize*} - \item Integration von Anwendungsfall- und Objektmodellen - \end{itemize*} - \item Analytiker - \begin{itemize*} - \item Modelliert das System und erstellt Anwendungsfälle - \end{itemize*} - \item Redakteur - \item Prüfer - \end{itemize*} - - Wie ermittelt man Anforderungen? - \begin{itemize*} - \item Problem: Entwickler müssen sich in Begriffs- und Denkwelt des Kunden einarbeiten, sonst Kommunikationsprobleme - \item Systematische Vorgehensweise - \item Kommunikation mit Kunden - \item Geschäftsprozess (business process) - \begin{itemize*} - \item fachlicher Ablauf, der Wert oder Kosten verursacht - \end{itemize*} - \item Akteur (actor) - \begin{itemize*} - \item Benutzer, Schnittstelle nach außen - \end{itemize*} - \item Szenario (scenario) - \begin{itemize*} - \item Interaktion mit System als Ablauf - \end{itemize*} - \item Anwendungsfall (use case) - \begin{itemize*} - \item Automatisierter Arbeitsschritt, vom System ausgeführt - \end{itemize*} - \item Interviews mit Fachanwendern - \begin{itemize*} - \item Mitschrift, später strukturierter Text und Tabelle - \end{itemize*} - \item Strukturierte Spezifikation - \begin{itemize*} - \item Vorlagen / sprachliche Anforderungsschablonen - \item Formulare - \item Reduzierung sprachlicher Mehrdeutigkeiten - \end{itemize*} - \item Anwendungsfalldiagramm (Use-Case-Diagramm) - \begin{itemize*} - \item Arbeitsschritt eines Geschäftsprozesses, der durch das System ausgeführt wird - \item Anforderungen an das System modellieren - was soll das System leisten - \item Systemgrenzen / Systemkontext festlegen - \item Systembeteiligte modellieren - \item Planbare Einheiten als Schritte für die Entwicklung - \item Verwendung bereits ab Projektbeginn - \item Keine Modellierung eines Ablaufs! - \end{itemize*} - \item Umgang mit Szenarien und Anwendungsfällen - \begin{itemize*} - \item Zunächst nur zum Verständnis kurz aufstellen - \item Systemgrenze definieren - \item Beschreibungen verfeinern - \item Änderungen mit Kunden abstimmen - \item Prototypen nur zur visuellen Unterstützung - \item Benutzungsschnittstelle erst beginnen, wenn funktionale Anforderungen in etwa klar sind - \end{itemize*} - \end{itemize*} - - Leitfaden für Anwendungsfälle - \begin{itemize*} - \item Benennen mit Verbalphrasen, die Anwendersicht beschreiben (Simuliere) - \item Akteure mit Substantiven benennen (Anwender) - \item Systemgrenzen klären. Arbeitsschritte von Akteuren und System kennzeichnen - \item Schritte im aktiven Stil beschreiben (Auto bremst) - \item Ursächliche Beziehung zwischen Folgeschritten - \item 1 Anwendungsfall = 1 vollständige Transaktion - \item Normalfall darstellen; Ausnahmen gesondert beschreiben - \item Nicht die Benutzungsschnittstelle beschreiben (statt dessen visuellen Prototypen verwenden) - \item Übersichtlichkeit (max. 2-3 Seiten), sonst zerlegen - \end{itemize*} - - \begin{itemize*} + \begin{itemize*} + \item Projektidee, schriftliche Skizze + \item Kurz und knapp + \item Stichpunkte der wichtigsten Funktionen + \item Lastenheft (falls schon existiert) + \end{itemize*} + \item Beteiligte Rollen + \begin{description*} + \item[Endbenutzer] Aufnahme Ist-Zustand, Domänenwissen, Anforderungen + \item[Kunde] Definiert Ziel des Systems, Vertragsverhandlung + \item[Konfigurationsmanager] Revisionsgeschichte der Dokumente, Nachvollziehbarkeit + \item[Architekt] Integration von Anwendungsfall- und Objektmodellen + \item[Analytiker] Modelliert das System und erstellt Anwendungsfälle + \item[Redakteur] + \item[Prüfer] + \end{description*} + \item Wie ermittelt man Anforderungen? + \begin{itemize*} + \item Kommunikation mit Kunden + \item Geschäftsprozess: fachlicher Ablauf, der Wert oder Kosten verursacht + \begin{description*} + \item[Akteur] Benutzer, Schnittstelle nach außen + \item[Szenario] Interaktion mit System als Ablauf + \item[Anwendungsfall] Automatisierter Arbeitsschritt, vom System ausgeführt + \item[Interviews mit Fachanwendern] Mitschrift, später strukturierter Text und Tabelle + \item[Strukturierte Spezifikation] Vorlagen, Formulare, Reduzierung sprachlicher Mehrdeutigkeiten + \end{description*} + \item Anwendungsfalldiagramm (Use-Case-Diagramm) + \begin{itemize*} + \item Arbeitsschritt eines Geschäftsprozesses + \item Anforderungen an das System modellieren + \item Systemgrenzen / Systemkontext festlegen + \item Systembeteiligte modellieren + \item Planbare Einheiten als Schritte für die Entwicklung + \item Verwendung bereits ab Projektbeginn + \end{itemize*} + \item Umgang mit Szenarien und Anwendungsfällen + \begin{itemize*} + \item Systemgrenze definieren + \item Beschreibungen verfeinern + \item Änderungen mit Kunden abstimmen + \item Prototypen nur zur visuellen Unterstützung + \end{itemize*} + \end{itemize*} \item Typische Probleme - \begin{itemize*} - \item Kommunikations- und Verständnisprobleme - \item Viele verschiedene Beteiligte - \item Kunden wissen nicht, was sie genau wollen und was geht - \item Verwendung von Fachsprachen - \item Widersprüchliche Anforderungen, verschiedene Interessen - \item Nicht-technische organisatorische, historische oder rechtliche Rahmenbedingungen - \item Zusätzliche Beteiligte können auftauchen - \item Anforderungen ändern sich während der Entwicklung - \end{itemize*} - \item Anforderungsänderungen - \begin{itemize*} - \item Sind die Regel - \end{itemize*} + \begin{itemize*} + \item Kommunikations- und Verständnisprobleme + \item Viele verschiedene Beteiligte + \item Widersprüchliche Anforderungen, verschiedene Interessen + \item Nicht-technische organisatorische, historische oder rechtliche Rahmenbedingungen + \item Anforderungen ändern sich während der Entwicklung + \end{itemize*} \item Tätigkeiten der Anforderungsanalyse - \begin{itemize*} - \item Anforderungen strukturieren - \item Eigenschaften der Anforderungen bestimmen - \item Anforderungen priorisieren - \item Anforderungen in Textform, Grafiken, Modellen dokumentieren - \item Anforderungen modellieren - \item Anforderungen auf inhaltliche Qualität prüfen - \item Auf Übereinstimmung mit den Zielen prüfen - \begin{itemize*} - \item Ziel Abnahme der Anforderung - \end{itemize*} - \item Hängt mit Analyse des Systems zusammen - \end{itemize*} - \item Anforderungen strukturieren - \begin{itemize*} - \item Unterteilung - \begin{itemize*} - \item Funktional, Nichtfunktional - \item Muss, Kann,... oder Haupt- und Nebenanforderung - \end{itemize*} - \item Hierarchische Zerlegung - \begin{itemize*} - \item Unterteilen, Verfeinern - \end{itemize*} - \item Ordnung festlegen, eindeutig Nummerieren - \begin{itemize*} - \item auf Einmaligkeit achten - \end{itemize*} - \item Beziehungen festhalten - \item Verwendung von Werkzeugen - \begin{itemize*} - \item MS-Project, Doors, Git issues, Trac, Bugzilla, MKS,... - \item Modellierungswerkzeuge - \end{itemize*} - \end{itemize*} - \item Eigenschaften bestimmen - \begin{itemize*} - \item Wahl der Eigenschaften firmen- bzw. projektspezifisch - \item Wichtige Eigenschaften - \begin{itemize*} - \item Identifikationsnummer - \item Kurzbezeichnung - \item Beschreibung (Text, ggf. Grafik, Modell) - \item Aufwand - \item Priorität der Anforderung - \item Bearbeitungsstatus / Restaufwand - \item Zugeordnet (wer ist verantwortlich / bearbeitet) - \item Querverbindungen zu anderen Anforderungen - \item Ggf. zusätzliche Dokumente oder Bemerkungen - \item Stabilität der Anforderung (Änderungswkt.) - \item Kritikalität der Anforderung: Schäden bei Fehlern? - \item Entwicklungsrisiko: Erfolgsaussichten der Umsetzung - \item Abnahmekriterien / Erfüllungsnachweis durch? - \item Anforderungstyp: Funktional, nicht funktional ,... - \item Anforderungssicht: Dynamik, Statik, Logik, Struktur, Funktion - \item Mögliche Konflikte - \item Autor - \item Quelle: Wer möchte die Anforderung umgesetzt haben? - \item Status der Beschreibung: Idee, grober Inhalt, detailliert - \item Anforderungsversion - \end{itemize*} - \end{itemize*} - \item Anforderungen priorisieren - \begin{itemize*} - \item MuSCoW-Priorisierung - \item Muss-, Kann-, Optional, Nicht (Abgrenzungskriterien) (must, should, could, won‘t) - \item Ad-hoc: Stakeholder priorisiert Anforderungen - \item Priorisierungsmatrix / Kosten-Wert-Analyse - \begin{itemize*} - \item Eigenschaften bewerten (Punkte vergeben) - \item Werte gewichten - \item Priorität berechnen $\text{Prioritäten} = \frac{\text{Nutzen} - \text{Nachteil}}{\text{Kosten} + \text{Risiko}}$ - \end{itemize*} - \item Kano-Klassifikation - \begin{itemize*} - \item Basiseigenschaften: Werden vorausgesetzt (fehlen stört, wenig zusätzliche Zufriedenheit) - \item Leistungseigenschaften: Sonderwünsche - \item Begeisterungseigenschaften: Wird nicht erwartet - \item Abfragen per Fragenkatalog - \end{itemize*} - \item Reihenfolge festlegen - \end{itemize*} + \begin{itemize*} + \item Anforderungen strukturieren + \begin{itemize*} + \item Unterteilung (Funktional, Nichtfunktional) + \item Hierarchische Zerlegung (Unterteilen, Verfeinern) + \item Ordnung festlegen, eindeutig Nummerieren + \item Beziehungen festhalten + \item Verwendung von Werkzeugen + \end{itemize*} + \item Eigenschaften der Anforderungen bestimmen + \item Anforderungen priorisieren + \begin{itemize*} + \item Muss-, Kann-, Optional, Nicht + \item Ad-hoc: Stakeholder priorisiert Anforderungen + \item Priorisierungsmatrix / Kosten-Wert-Analyse + \item Priorität berechnen $\text{Prioritäten} = \frac{\text{Nutzen} - \text{Nachteil}}{\text{Kosten} + \text{Risiko}}$ + \end{itemize*} + \item Kano-Klassifikation + \begin{itemize*} + \item Basiseigenschaften: Werden vorausgesetzt + \item Leistungseigenschaften: Sonderwünsche + \item Begeisterungseigenschaften: Wird nicht erwartet + \item Abfragen per Fragenkatalog + \end{itemize*} + \item Reihenfolge festlegen + \item Anforderungen dokumentieren + \item Anforderungen modellieren + \item Anforderungen auf inhaltliche Qualität prüfen + \item Auf Übereinstimmung mit den Zielen prüfen + \end{itemize*} \end{itemize*} - %![Kano Klassifikation von Balzert](Assets/Softwaretechnik1_Kano1.png) %![Kano Klassifikation von Balzert](Assets/Softwaretechnik1_Kano2.png) - \subsection{Objektorientierte Analyse und Systemmodellierung} + \subsection{Objektorientierte Analyse und Modellierung} \begin{itemize*} - \item Übersicht - \begin{itemize*} - \item Aufgabe: Systemmodell erstellen, funktionale Spezifikation - \item Beschreibung der Systembenutzung und des Verhaltens - \item Was, nicht wie - Implementierungsaspekte ausklammern - \begin{itemize*} - \item Nicht: Datenhaltung, Verteilung, Technologien, Architektur, .. - \end{itemize*} - \item Zusammenhang mit Anforderungsspezifikation - \item OO: Modell des Anwendungsbereichs - \end{itemize*} + \item Systemmodell erstellen, funktionale Spezifikation (Was, nicht wie) \item Analysemodell - \begin{itemize*} - \item Korrekt, vollständig, konsistent und nachprüfbar - \item Struktur und Verhalten - \item Verschiedene Sichten (OO, Strukturiert, ...) - \end{itemize*} - \item Eingangsdokumente - \begin{itemize*} - \item Lastenheft, Anforderungsspezifikation - \end{itemize*} + \begin{itemize*} + \item Korrekt, vollständig, konsistent und nachprüfbar + \item Struktur und Verhalten + \end{itemize*} + \item Eingangsdokumente (Lastenheft, Anforderungsspezifikation) \item Typische Ergebnisse - \begin{itemize*} - \item Funktionales Modell - \begin{itemize*} - \item Geschäftsprozesse und Anwendungsfälle - \end{itemize*} - \item Objektmodell - \item Dynamisches Modell - Systemverhalten - \begin{itemize*} - \item Zustands- und Sequenzdiagramme - \end{itemize*} - \item Vor- und Nachbedingungen von Systemoperationen - \item Prototyp / Spezifikation Benutzungsschnittstelle - \item Pflichtenheft - \end{itemize*} - \item Objektorientierte Analyse nach [Brügge / Dutoit] - \begin{itemize*} - \item Verdeutlicht iterativen Ablauf - \item Unterteilung des Analysemodells in: - \begin{itemize*} - \item Funktionales Modell (Anwendungsfälle) - \item Objektmodell (Klassen und Objektdiagramme) - \item Dynamisches Modell (Zustands- und Sequenzdiagramme) - \item Unterscheidung der Objekttypen - \end{itemize*} - \end{itemize*} - \end{itemize*} - + \begin{itemize*} + \item Funktionales Modell (Anwendungsfälle) + \item Dynamisches Modell - Systemverhalten (Zustandsdiagramme) + \item Vor- und Nachbedingungen von Systemoperationen + \item Pflichtenheft + \end{itemize*} + \item Verdeutlicht iterativen Ablauf + \item Unterteilung des Analysemodells + \begin{itemize*} + \item Funktionales Modell (Anwendungsfälle) + \item Objektmodell (Klassen und Objektdiagramme) + \item Dynamisches Modell (Zustands- und Sequenzdiagramme) + \item Unterscheidung der Objekttypen + \end{itemize*} %![Analyse nach Brügge/Dutoit](Assets/Softwaretechnik1_Bruegge1.png) %![Analyse nach Brügge/Dutoit](Assets/Softwaretechnik1_Bruegge2.png) - + \item Objektarten im Systemmodell + \begin{description*} + \item[Entitätsobjekte] vom System verwaltete Informationen + \item[Grenzobjekte] Interaktion zwischen System und Akteuren + \item[Steuerungsobjekte] Durchführung der Anwendungsfälle + \end{description*} + \item Identifizierung von Entitätsobjekten \begin{itemize*} - \item Heuristik Sprache $\rightarrow$ OO-Modell - \item Objektarten im Systemmodell - \begin{itemize*} - \item Entitätsobjekte - vom System verwaltete Informationen - \item Grenzobjekte - Interaktion zwischen System und Akteuren - \item Steuerungsobjekte - Durchführung der Anwendungsfälle - \end{itemize*} - \item Identifizierung von Entitätsobjekten - \begin{itemize*} - \item Begriffe, die klargestellt werden müssen - \item Wiederkehrende Substantive in Anwendungsfällen - \begin{itemize*} - \item Heuristiken - \end{itemize*} - \item Reale Objekte, die das System kennen muss - \item Reale Prozesse, die das System verfolgen muss - \item Anwendungsfälle - \item Datenquellen und -senken - \item Artefakte, mit denen der Nutzer interagiert - \end{itemize*} - \item Identifizierung von Grenzobjekten - \begin{itemize*} - \item Elemente der Benutzungsschnittstelle - \item Formulare für Eingaben - \item Nachrichten, Rückmeldungen - \item Endgeräte - \item In der Begriffswelt des Anwenders bleiben! - \item Schnittstellen grafisch skizzieren bzw. Prototyp! - \end{itemize*} - \item Identifizierung von Steuerungsobjekten - \begin{itemize*} - \item Koordination von Grenz- und Entitätsobjekten - \item Abarbeitung von Anwendungsfällen - \begin{itemize*} - \item Reihenfolge von Schritten - \item Informationen übernehmen und weiterleiten - \item Oft ein Steuerungsobjekt pro Anwendungsfall - \end{itemize*} - \item Beispiel: Simulationsszenario - \item Verhaltensmodell sinnvoll! Im folgenden: dynamische Modelle - \end{itemize*} + \item Begriffe, die klargestellt werden müssen + \item Wiederkehrende Substantive in Anwendungsfällen + \item Reale Objekte, die das System kennen muss + \item Reale Prozesse, die das System verfolgen muss + \item Anwendungsfälle + \item Datenquellen und -senken \end{itemize*} - + \item Identifizierung von Grenzobjekten \begin{itemize*} + \item Elemente der Benutzungsschnittstelle + \item Formulare für Eingaben + \item Nachrichten, Rückmeldungen + \item Endgeräte + \end{itemize*} + \item Identifizierung von Steuerungsobjekten \item Abläufe der Anwendungsfälle modellieren - \begin{itemize*} - \item Ziel - Objekte finden - \item Klassen identifizieren - \item Verhalten / Operationen finden - \end{itemize*} \item Use Case durch Interaktion verfeinern - \begin{itemize*} - \item einfacher kurzer Ablauf: textuelle Beschreibung, Aktivitätsdiagramm - \item Ablauf mit Verzweigungen, Parallelitäten: Aktivitätsdiagramm (Kontrollflussmodellierung) - \item datengetriebener Ablauf: Aktivitätsdiagramm (Objektflussmodellierung) - \item Interaktion zwischen den Objekten wichtig: Kommunikationsdiagramm, Aktivitätsdiagramm (Aktivitätsbereiche), Sequenzdiagramm - \item zeitliche Abfolge steht im Mittelpunkt: Sequenzdiagramm - \item Zustandswechsel / zeitliche Abfolge von Zuständen: Zustandsdiagramm / Timing-Diagramm - \item komplexe Abläufe mit Verzweigungen und Parallelitäten: Interaktionsübersichtsdiagramm - \item komplexe Abläufe ohne Verzweigungen und Parallelitäten: weitere Verfeinerung durch Use-Case-Diagramm - \item komplexer strukturierter Ablauf: Kollaboration aus dem Kompositionsstrukturdiagramm - \end{itemize*} - \end{itemize*} - - Dynamische UML-Modelle - \begin{itemize*} - \item Abläufe - \begin{itemize*} - \item Aktivitätsdiagramm (activity diagram) - \item Kommunikationsdiagramm (communication diagram) - \item Sequenzdiagram (sequence diagram) - \item Zeitdiagramm (timing diagram) - \end{itemize*} - \item Zustandsabhängiges Verhalten von Objekten - \begin{itemize*} - \item Zustandsautomat (state chart diagram) - \end{itemize*} - \end{itemize*} - - \begin{itemize*} - \item Aktivitätsdiagramm - \begin{itemize*} - \item Aktion - einzelner Schritt - \item Aktivität - \begin{itemize*} - \item Beschreibt einen Ablauf / repräsentiert ein Verhalten - \begin{itemize*} - \item Beinhaltet eine Folge Aktionen, Kontroll- oder Objektknoten - \end{itemize*} - \item Schachtelung von Aktivitäten und Aktionen - \begin{itemize*} - \item Aktionen in Aktivitäten enthalten - \item Aktionen durch Aktivitäten verfeinerbar - \end{itemize*} - \item Aktivitäten beschreiben / verfeinern - \begin{itemize*} - \item Aktionen, Use Cases, Interaktionen, Operationen ... - \end{itemize*} - \item Ein- und Ausgabeparameter in Form von Objekten - \begin{itemize*} - \item Parameterknoten entsprechend Pins der aufrufenden Aktion - \item Alternativ: Parameterangabe mit Name und Typ - \end{itemize*} - \item Angabe von Vor- und Nachbedingungen möglich - \item Optional: Parameter unter Aktivitätsnamen - \end{itemize*} - \end{itemize*} - \end{itemize*} - - \begin{itemize*} + \begin{description*} + \item[datengetriebener Ablauf mit Verzweigungen] Aktivitätsdiagramm + \item[Interaktion zwischen den Objekten wichtig] Kommunikations-, Aktivitäts-, Sequenzdiagramm + \item[zeitliche Abfolge steht im Mittelpunkt] Sequenzdiagramm + \item[Zustandswechsel / zeitliche Abfolge von Zuständen] Zustands-/Timing-Diagramm + \item[komplexe Abläufe mit Verzweigungen und Parallelitäten] Interaktionsübersichtsdiagramm + \item[komplexer strukturierter Ablauf] Kollaboration aus Kompositionsstrukturdiagramm + \end{description*} \item Verfeinerung der Aktionen durch Aktivitäten - \item Aktion durch Interaktionen verfeinern - \begin{itemize*} - \item Detaillierte Diagramme - \item Meist entwurfsnah - \end{itemize*} + \item Aktion durch Interaktionen verfeinern (Detaillierte Diagramme) \item Verfeinerung der Aktionen durch StateChart \item Objekte zusammenstellen und klassifizieren - \begin{itemize*} - \item Toolunterstützung (Möglichkeiten stark toolabhängig) - \item Objekte Ergebnis der Verhaltensmodellierung - \item Ergebnis Verhaltensdiagramm: Operationen der Klassen - \item Klassen generalisieren / spezialisieren $\rightarrow$ Klassenhierarchie - \end{itemize*} - \item Übergang zum Entwurf - \begin{itemize*} - \item Klassenstruktur festlegen - \end{itemize*} + \begin{itemize*} + \item Toolunterstützung (Möglichkeiten stark toolabhängig) + \item Objekte Ergebnis der Verhaltensmodellierung + \item Ergebnis Verhaltensdiagramm: Operationen der Klassen + \item Klassen generalisieren / spezialisieren $\rightarrow$ Klassenhierarchie + \end{itemize*} + \item Übergang zum Entwurf: Klassenstruktur festlegen \item Spezifikation von Benutzungsschnittstellen - \begin{itemize*} - \item Skizzieren, Prototyp generieren, Spezialwerkzeuge - \item Klassen und Operationen in Funktionen - \item Gestaltung MMI, style guides, Standards - \end{itemize*} + \begin{itemize*} + \item Skizzieren, Prototyp generieren, Spezialwerkzeuge + \item Klassen und Operationen in Funktionen + \item Gestaltung MMI, style guides, Standards + \end{itemize*} \end{itemize*} \subsection{Dokumentation von Anforderungen} \begin{itemize*} \item Lastenheft - \begin{itemize*} - \item Gesamtheit der Forderungen eines Auftraggebers (AG) an die Lieferungen und Leistungen eines Auftragnehmers (AN), manchmal Vertragsbasis - \item Muss-Kriterien, Kann-Kriterien, Abgrenzungskriterien - \end{itemize*} - \item Pflichtenheft - \begin{itemize*} - \item Entwurf aus AN-Sicht, Umsetzung des Lastenhefts - \item Meist Vertragsbasis - \end{itemize*} - \item Inhalt Anforderungsspezifikation - \begin{itemize*} - \item Zielsetzung - \item Allgemeine Beschreibung - \begin{itemize*} - \item Umgebung, generelle Funktion, Restriktionen, Benutzer - \end{itemize*} - \item Spezifische funktionale Anforderungen - \begin{itemize*} - \item möglichst quantitativ (z.B. Tabellenform) - \item eindeutig identifizierbar (Nummern) - \end{itemize*} - \item Spezifische nicht-funktionale Anforderungen - \begin{itemize*} - \item z.B. Antwortzeit, Speicherbedarf, HW/SW-Plattform - \item Entwicklungs- und Produkt-Standards - \end{itemize*} - \item Qualitäts-Zielbestimmung - \item Zu erwartende Evolution des Systems, Versionen - \item Abkürzungsverzeichnis, Glossar, Index, Referenzen - \end{itemize*} + \begin{itemize*} + \item Forderungen eines Auftraggebers (AG) an Lieferungen und Leistungen eines Auftragnehmers (AN) + \item Muss-Kriterien, Kann-Kriterien, Abgrenzungskriterien + \end{itemize*} + \item Pflichtenheft: Entwurf aus AN-Sicht, Umsetzung des Lastenhefts + \item Anforderungsspezifikation + \begin{description*} + \item[Zielsetzung] + \item[Allgemeine Beschreibung] Umgebung, Funktion, Benutzer + \item[Spezifische funktionale Anforderungen] quantitativ + identifizierbar + \item[Spezifische nicht-funktionale Anforderungen] Entwicklungs- und Produkt-Standards + \item[Qualitäts-Zielbestimmung] + \item[Zu erwartende Evolution] des Systems, Versionen + \item[Abkürzungsverzeichnis] Glossar, Index, Referenzen + \end{description*} \end{itemize*} - Pflichtenheft (Beispiel) - \begin{enumerate} - \item Einleitung, Zielbestimmung - \item Übersicht - \begin{itemize*} - \item Einsatzbereich, Zielgruppen - \item Produkt-Umgebung - \item Produkt-Funktionen - \item Restriktionen - \item Annahmen und Abhängigkeiten - \item Vorhandenes System (ggf.) - \end{itemize*} - \item Vorgeschlagenes System - \begin{itemize*} - \item Übersicht - \item Funktionale Anforderungen - \item Benutzungsschnittstelle - \item Nichtfunktionale Anforderungen - \item Systembeschreibung - \begin{itemize*} - \item Szenarien - \item Anwendungsfälle - \end{itemize*} - \end{itemize*} - \item Glossar - \end{enumerate} - - + \newpage \section{Grobentwurf} \subsection{Einführung} Systementwurf - Aufgabe \begin{itemize*} \item Sicht des geplanten Systems von innen (Entwickler) \item Wie sollen vereinbartes Verhalten und Funktionen (Analysemodell) intern realisiert werden? - \item Von Spezifikation von Anforderungen und Funktionen -> Vorbereitung der Implementierung + \item Von Spezifikation von Anforderungen und Funktionen $\rightarrow$ Vorbereitung der Implementierung \item Formal: Transformation des Analysemodells in ein Systementwurfsmodell \item System(grob)entwurf, Feinentwurf/Objektentwurf \end{itemize*} @@ -1300,25 +630,25 @@ Teile und herrsche \begin{itemize*} \item Grobentwurf - \begin{itemize*} - \item Entwurfsziele identifizieren - \item Grobe Systemstruktur festlegen (Architektur) - \item Zerlegung in Subsysteme, Spezifikation - \begin{itemize*} - \item Schichten, Pakete, Komponenten - \end{itemize*} - \item Bewerten der Zerlegung anhand der Entwurfsziele - \item Schnittstellen festlegen - \end{itemize*} + \begin{itemize*} + \item Entwurfsziele identifizieren + \item Grobe Systemstruktur festlegen (Architektur) + \item Zerlegung in Subsysteme, Spezifikation + \begin{itemize*} + \item Schichten, Pakete, Komponenten + \end{itemize*} + \item Bewerten der Zerlegung anhand der Entwurfsziele + \item Schnittstellen festlegen + \end{itemize*} \item Feinentwurf - \begin{itemize*} - \item Subsysteme im Detail entwerfen - \begin{itemize*} - \item Strukturierung der Komponenten - \item Klassen, Objekte, Funktionen, Datenstrukturen - \item Verhalten, Algorithmen - Teillösungen - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Subsysteme im Detail entwerfen + \begin{itemize*} + \item Strukturierung der Komponenten + \item Klassen, Objekte, Funktionen, Datenstrukturen + \item Verhalten, Algorithmen - Teillösungen + \end{itemize*} + \end{itemize*} \end{itemize*} @@ -1375,29 +705,29 @@ \item Elemente eines Subsystems: Kohäsion (cohesion) \item Maß für Zusammengehörigkeit der Elemente \item Möglichst hohe Kohäsion - \begin{itemize*} - \item Enge Beziehung oder ähnliche Aufgaben der Elemente - \item Erleichtert Verständnis, Wartung und Anpassung - \end{itemize*} + \begin{itemize*} + \item Enge Beziehung oder ähnliche Aufgaben der Elemente + \item Erleichtert Verständnis, Wartung und Anpassung + \end{itemize*} \item Mittel zum Erreichen hoher Kohäsion - \begin{itemize*} - \item Datenkapselung, Objektorientierung - \item Benutzung geeigneter Patterns (Kapitel 5) - \end{itemize*} + \begin{itemize*} + \item Datenkapselung, Objektorientierung + \item Benutzung geeigneter Patterns (Kapitel 5) + \end{itemize*} \end{itemize*} Metriken für modulare Entwürfe \begin{itemize*} \item Fan-in / fan-out-Metrik [S.Henry, D. Kafura 1981]: - \begin{itemize*} - \item 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 - \item Fan-out: Anzahl von Stellen, an denen M andere Module aufruft + Anzahl der globalen Variablen, die von M verändert werden - \end{itemize*} + \begin{itemize*} + \item 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 + \item Fan-out: Anzahl von Stellen, an denen M andere Module aufruft + Anzahl der globalen Variablen, die von M verändert werden + \end{itemize*} \item Heuristik Kopplung / Kohäsion - \begin{itemize*} - \item Hoher Fan-out bedeutet hohe Kopplung, minimieren - \item Hoher Fan-in kann auf geringe Kohäsion von M hindeuten - \end{itemize*} + \begin{itemize*} + \item Hoher Fan-out bedeutet hohe Kopplung, minimieren + \item Hoher Fan-in kann auf geringe Kohäsion von M hindeuten + \end{itemize*} \end{itemize*} 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] @@ -1425,13 +755,13 @@ \begin{itemize*} \item Geschlossene Schichtenarchitektur - \begin{itemize*} - \item Beispiel: OSI-Modell für Kommunikationssysteme - \end{itemize*} + \begin{itemize*} + \item Beispiel: OSI-Modell für Kommunikationssysteme + \end{itemize*} \item Offene Schichtenarchitektur - \begin{itemize*} - \item Beispiel: Java Swing auf X11-Plattform - \end{itemize*} + \begin{itemize*} + \item Beispiel: Java Swing auf X11-Plattform + \end{itemize*} \end{itemize*} Prinzipien des OO-Entwurfs @@ -1442,11 +772,11 @@ \item Hohe Kohäsion / Geringe Kopplung \item Zyklische Abhängigkeiten vermeiden \item Auf Schnittstellen konzentrieren - \begin{itemize*} - \item Abhängigkeiten nur von Schnittstellen - \item Abtrennung von Schnittstellen (eher viele kleine als eine große) - \item Umkehr der Abhängigkeiten (dependency inversion-Prinzip) - \end{itemize*} + \begin{itemize*} + \item Abhängigkeiten nur von Schnittstellen + \item Abtrennung von Schnittstellen (eher viele kleine als eine große) + \item Umkehr der Abhängigkeiten (dependency inversion-Prinzip) + \end{itemize*} \item Offen / Geschlossen Prinzip \end{itemize*} @@ -1455,37 +785,37 @@ \item Änderungen wirken sich auf beide Komponenten aus \item Probleme beim Löschen und Initialisieren \item Auflösen durch - \begin{itemize*} - \item Gemeinsame Klassen in separates Paket - \item Gemeinsame Schnittstellen definieren - \end{itemize*} + \begin{itemize*} + \item Gemeinsame Klassen in separates Paket + \item Gemeinsame Schnittstellen definieren + \end{itemize*} \end{itemize*} Symptome schlechten Designs \begin{itemize*} \item Starrheit - \begin{itemize*} - \item Einfache Änderungen schwierig realisierbar - \item Einfache Änderungen führen zur Modifikation einer Vielzahl von Komponenten - \end{itemize*} + \begin{itemize*} + \item Einfache Änderungen schwierig realisierbar + \item Einfache Änderungen führen zur Modifikation einer Vielzahl von Komponenten + \end{itemize*} \item Zerbrechlichkeit - \begin{itemize*} - \item Änderungen an einer Stelle führen zu Fehlern an völlig anderer Stelle - \end{itemize*} + \begin{itemize*} + \item Änderungen an einer Stelle führen zu Fehlern an völlig anderer Stelle + \end{itemize*} \item Schlechte Wiederverwendbarkeit - \begin{itemize*} - \item Komponenten können Aufgrund spezieller Anhängigkeiten kaum wiederverwendet werden - \end{itemize*} + \begin{itemize*} + \item Komponenten können Aufgrund spezieller Anhängigkeiten kaum wiederverwendet werden + \end{itemize*} \end{itemize*} Wann ist ein Entwurf „gut“? \begin{itemize*} \item Korrekt - \begin{itemize*} - \item Erfüllung der Anforderungen - \item Wiedergabe aller Funktionen des Systemmodells - \item Sicherstellung der nichtfunktionalen Anforderungen - \end{itemize*} + \begin{itemize*} + \item Erfüllung der Anforderungen + \item Wiedergabe aller Funktionen des Systemmodells + \item Sicherstellung der nichtfunktionalen Anforderungen + \end{itemize*} \item Verständlich und präzise, gut dokumentiert \item Anpassbar \item Hohe Kohäsion innerhalb der Komponenten @@ -1497,106 +827,106 @@ \subsection{Architekturmodelle} \begin{itemize*} \item Modellierung mit UML - \begin{itemize*} - \item Bisher: logische Sicht - \item Technisch: Organisation in Paketen, Namensraum, Import - \end{itemize*} + \begin{itemize*} + \item Bisher: logische Sicht + \item Technisch: Organisation in Paketen, Namensraum, Import + \end{itemize*} \item Paketdiagramm - \begin{itemize*} - \item Gliederung (Strukturierung) des Systems in Teile - \item Zuordnung von Elementen zu einem Paket - \item Hierarchien und Abhängigkeiten zwischen den Paketen - \item Anwendung: Definition von Schichten - \end{itemize*} + \begin{itemize*} + \item Gliederung (Strukturierung) des Systems in Teile + \item Zuordnung von Elementen zu einem Paket + \item Hierarchien und Abhängigkeiten zwischen den Paketen + \item Anwendung: Definition von Schichten + \end{itemize*} \item Enthält-Beziehung - \begin{itemize*} - \item Definiert, in welchem Paket ein Element enthalten ist - \item Ermöglicht qualifizierten Zugriff auf enthaltene Elemente - \item Löschen des Pakets bewirkt Löschen beinhalteter Elemente - \item Definition von Sichtbarkeit / Zugriffsrechte - \begin{itemize*} - \item Auswirkung auf weitere Enthält-Beziehung - \item '+' - public (default) - \item '-' - private - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Definiert, in welchem Paket ein Element enthalten ist + \item Ermöglicht qualifizierten Zugriff auf enthaltene Elemente + \item Löschen des Pakets bewirkt Löschen beinhalteter Elemente + \item Definition von Sichtbarkeit / Zugriffsrechte + \begin{itemize*} + \item Auswirkung auf weitere Enthält-Beziehung + \item '+' - public (default) + \item '-' - private + \end{itemize*} + \end{itemize*} \item Paket- / Element-Import - \begin{itemize*} - \item Unqualifizierter Zugriff auf Elemente eines anderen Namensraums (Paketes) - \end{itemize*} + \begin{itemize*} + \item Unqualifizierter Zugriff auf Elemente eines anderen Namensraums (Paketes) + \end{itemize*} \item Komponentendiagramm - \begin{itemize*} - \item Komponente - modulare, austauschbare Einheit - \item Strukturierung des Systems durch Komponenten - \item Modellierung der - \begin{itemize*} - \item Abhängigkeiten zwischen Komponenten - \item inneren Struktur von Komponenten - \end{itemize*} - \item Definition von Schnittstellen - \item Verwendung von Elementen aus Klassen- und Objektdiagramm - \item Stärkere dynamische Sicht -> kein Verhalten - \item Komponente <> - \begin{itemize*} - \item Kapselt Funktionalitäten (Physisch gruppierte Klassen) - \item „Spezialisierte“ Klasse (Vererbung, Exemplare möglich) - \item Stellt Funktionalitäten über Schnittstellen bereit - \item Definiert benötigte Schnittstellen - \item Enthält Klassen oder weitere Komponenten - \item Modulares Element: Substitution (Austauschbarkeit) steht im Vordergrund - \end{itemize*} - \item Black-Box-Darstellung - \begin{itemize*} - \item Zur Verfügung gestellte Funktionalität `<>` - \item Benötigte Funktionalität `<>`‚ - \end{itemize*} - \item White-Box-Darstellung - \begin{itemize*} - \item Interner Aufbau der Komponente `<>` - \item Artefakte `<>`‚ Realisierende physische Einheit (z.B.: .dll) - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Komponente - modulare, austauschbare Einheit + \item Strukturierung des Systems durch Komponenten + \item Modellierung der + \begin{itemize*} + \item Abhängigkeiten zwischen Komponenten + \item inneren Struktur von Komponenten + \end{itemize*} + \item Definition von Schnittstellen + \item Verwendung von Elementen aus Klassen- und Objektdiagramm + \item Stärkere dynamische Sicht $\rightarrow$ kein Verhalten + \item Komponente <> + \begin{itemize*} + \item Kapselt Funktionalitäten (Physisch gruppierte Klassen) + \item „Spezialisierte“ Klasse (Vererbung, Exemplare möglich) + \item Stellt Funktionalitäten über Schnittstellen bereit + \item Definiert benötigte Schnittstellen + \item Enthält Klassen oder weitere Komponenten + \item Modulares Element: Substitution (Austauschbarkeit) steht im Vordergrund + \end{itemize*} + \item Black-Box-Darstellung + \begin{itemize*} + \item Zur Verfügung gestellte Funktionalität `<>` + \item Benötigte Funktionalität `<>`‚ + \end{itemize*} + \item White-Box-Darstellung + \begin{itemize*} + \item Interner Aufbau der Komponente `<>` + \item Artefakte `<>`‚ Realisierende physische Einheit (z.B.: .dll) + \end{itemize*} + \end{itemize*} \end{itemize*} Schnittstellen / Interfaces \begin{itemize*} \item Definition Diagrammunabhängig - \begin{itemize*} - \item Meist Klassendiagramm - \end{itemize*} + \begin{itemize*} + \item Meist Klassendiagramm + \end{itemize*} \item Ähnlich Semantik einer Klasse - \begin{itemize*} - \item Nur public-Attribute und Operationen - \end{itemize*} + \begin{itemize*} + \item Nur public-Attribute und Operationen + \end{itemize*} \item Definiert Verpflichtung zur Implementierung von - \begin{itemize*} - \item Operationen - \item Merkmale -> Attribute dürfen definiert werden - \item Verpflichtungen (z.B.: Vor- / Nachbedingungen) - \end{itemize*} + \begin{itemize*} + \item Operationen + \item Merkmale $\rightarrow$ Attribute dürfen definiert werden + \item Verpflichtungen (z.B.: Vor- / Nachbedingungen) + \end{itemize*} \item Meist abstrakte Klassen mit abstrakten Operationen \item Abstrakt - muss überschrieben werden \item Notation - \begin{itemize*} - \item Stereotyp: <> - \item Meist kursiv geschrieben, da abstrakte Klasse - \end{itemize*} + \begin{itemize*} + \item Stereotyp: <> + \item Meist kursiv geschrieben, da abstrakte Klasse + \end{itemize*} \end{itemize*} Schnittstellenrealisierung, Implementierungsbeziehung \begin{itemize*} \item Schnittstellen werden realisiert, nicht instanziiert \item Schnittstellenkonform - \begin{itemize*} - \item Klasse realisiert alle Attribute und Operationen - \end{itemize*} + \begin{itemize*} + \item Klasse realisiert alle Attribute und Operationen + \end{itemize*} \item Schnittstelle kann von anderen Schnittstellen erben - \item Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen -> Generalisierung verwenden + \item Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen $\rightarrow$ Generalisierung verwenden \item Darstellung - \begin{itemize*} - \item Gestrichelte Linie mit nicht gefülltem Dreieck an der Seite der Superklasse - \item Alternativ: Lollipop-Darstellung - \end{itemize*} + \begin{itemize*} + \item Gestrichelte Linie mit nicht gefülltem Dreieck an der Seite der Superklasse + \item Alternativ: Lollipop-Darstellung + \end{itemize*} \end{itemize*} @@ -1609,46 +939,46 @@ Schichten-Architektur (layers) \begin{itemize*} \item Problem - \begin{itemize*} - \item Komplexität: Strukturierung des Systems, unterschiedliche Abstraktionsebenen - \item Änderungen sollen möglichst lokal bleiben - \item Teilsysteme sollen austauschbar, wiederverwendbar und getrennt entwickelbar sein - \item Schnittstellen sollen stabil sein - \end{itemize*} + \begin{itemize*} + \item Komplexität: Strukturierung des Systems, unterschiedliche Abstraktionsebenen + \item Änderungen sollen möglichst lokal bleiben + \item Teilsysteme sollen austauschbar, wiederverwendbar und getrennt entwickelbar sein + \item Schnittstellen sollen stabil sein + \end{itemize*} \item Lösung - \begin{itemize*} - \item Zuordnung von Subsystemen zu horizontalen Schichten gleicher Abstraktionsebene - \item Komponenten einer Schicht bieten Dienste der darüber liegenden Schicht an - \end{itemize*} + \begin{itemize*} + \item Zuordnung von Subsystemen zu horizontalen Schichten gleicher Abstraktionsebene + \item Komponenten einer Schicht bieten Dienste der darüber liegenden Schicht an + \end{itemize*} \end{itemize*} Client-Server (Klient/Anbieter) \begin{itemize*} \item Client (front-end) - \begin{itemize*} - \item Benutzungsschnittstelle - \item Einbindung in Geschäftsprozesse - \item Entkoppelt von Netztechnologie und Datenhaltung - \end{itemize*} + \begin{itemize*} + \item Benutzungsschnittstelle + \item Einbindung in Geschäftsprozesse + \item Entkoppelt von Netztechnologie und Datenhaltung + \end{itemize*} \item Server (back-end) - \begin{itemize*} - \item Datenhaltung, evtl. Fachlogik - \end{itemize*} + \begin{itemize*} + \item Datenhaltung, evtl. Fachlogik + \end{itemize*} \item Genauer: Two-tier client/server architecture \item Asynchroner Kontrollfluss \item Aufteilung Funktionen Client / Server - \begin{itemize*} - \item Mehr Funktionen im Server: - \begin{itemize*} - \item zentrale Verwaltung, Wartungsaufwand geringer, Portabilität, einfache Client-Hardware (Net PC) - \item „Thin Client“ - nur GUI - \end{itemize*} - \item Mehr Funktionen im Client: Flaschenhals Server wird entlastet, individuellere Client-Funktionen - \begin{itemize*} - \item „Fat Client“ - Teil der Anwendung im Client - \end{itemize*} - \item Entscheidet mit über Umsetzung (Java Script, ...) - \end{itemize*} + \begin{itemize*} + \item Mehr Funktionen im Server: + \begin{itemize*} + \item zentrale Verwaltung, Wartungsaufwand geringer, Portabilität, einfache Client-Hardware (Net PC) + \item „Thin Client“ - nur GUI + \end{itemize*} + \item Mehr Funktionen im Client: Flaschenhals Server wird entlastet, individuellere Client-Funktionen + \begin{itemize*} + \item „Fat Client“ - Teil der Anwendung im Client + \end{itemize*} + \item Entscheidet mit über Umsetzung (Java Script, ...) + \end{itemize*} \end{itemize*} Three-Tier / Four-Tier Architecture: Client/Server mit weiterer Aufteilung ähnlich Repository @@ -1656,20 +986,20 @@ Bewertung Client-Server \begin{itemize*} \item Vorteile - \begin{itemize*} - \item Leicht verständlich - \item Änderungen bleiben lokal - \item Geringere Kopplung zwischen den Schichten - \item Schichten austauschbar und wiederverwendbar - \item Getrennte Entwicklung der Schichten möglich - \item Vorhandene / stabilere Schnittstellen - \end{itemize*} + \begin{itemize*} + \item Leicht verständlich + \item Änderungen bleiben lokal + \item Geringere Kopplung zwischen den Schichten + \item Schichten austauschbar und wiederverwendbar + \item Getrennte Entwicklung der Schichten möglich + \item Vorhandene / stabilere Schnittstellen + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Geringere Performance - \item Zusätzlicher Verwaltungs- oder Datenoverhead - \item Manche Änderungen führen zu Änderungen in allen Schichten (z.B. neues Datenfeld) - \end{itemize*} + \begin{itemize*} + \item Geringere Performance + \item Zusätzlicher Verwaltungs- oder Datenoverhead + \item Manche Änderungen führen zu Änderungen in allen Schichten (z.B. neues Datenfeld) + \end{itemize*} \end{itemize*} Pipes and Filters @@ -1681,66 +1011,66 @@ \item Parallele Verarbeitung vorteilhaft \item Verwendung von globalen Steuerungskontrollstrukturen (Parallelisierung, Verzweigung, Schleifen) gewünscht \item Vorteile - \begin{itemize*} - \item Stark entkoppelte Komponenten - \item Hohe Flexibilität gegenüber Änderungen \& Erweiterungen - \item Hoher Wiederverwendungsgrad der Komponenten - \item Unabhängige Entwicklung der Komponenten - \item Leichte Parallelisierung der Berechnungen möglich - \item Überprüfung der Datenkompatibilität dynamisch / statisch - \end{itemize*} + \begin{itemize*} + \item Stark entkoppelte Komponenten + \item Hohe Flexibilität gegenüber Änderungen \& Erweiterungen + \item Hoher Wiederverwendungsgrad der Komponenten + \item Unabhängige Entwicklung der Komponenten + \item Leichte Parallelisierung der Berechnungen möglich + \item Überprüfung der Datenkompatibilität dynamisch / statisch + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Schwierige Fehlerbehandlung, kein expliziter Kontrollfluss - \item Fehler durch inkompatible Datentypfehler erst zur Laufzeit - \item Häufig zusätzliche Datenkonvertierungen notwendig - \end{itemize*} + \begin{itemize*} + \item Schwierige Fehlerbehandlung, kein expliziter Kontrollfluss + \item Fehler durch inkompatible Datentypfehler erst zur Laufzeit + \item Häufig zusätzliche Datenkonvertierungen notwendig + \end{itemize*} \end{itemize*} Plug-In Architektur (Microkernel) \begin{itemize*} \item Zielstellung - \begin{itemize*} - \item Stabile, verbreitete Standard-Anwendung (Kern) - \item Funktionalität soll durch Komponenten leicht erweiterbar sein - \item Dritte sollen Komponenten leicht erstellen können - \end{itemize*} + \begin{itemize*} + \item Stabile, verbreitete Standard-Anwendung (Kern) + \item Funktionalität soll durch Komponenten leicht erweiterbar sein + \item Dritte sollen Komponenten leicht erstellen können + \end{itemize*} \item Lösung - \begin{itemize*} - \item Möglichst schlanker zentraler Kern - \item Plugin-Manager verwaltet Komponenten: Laden, Entladen, Zugriffskontrolle, Konfiguration - \end{itemize*} + \begin{itemize*} + \item Möglichst schlanker zentraler Kern + \item Plugin-Manager verwaltet Komponenten: Laden, Entladen, Zugriffskontrolle, Konfiguration + \end{itemize*} \item Plugin - \begin{itemize*} - \item Komponente mit Standard-Schnittstelle - \item Erweitert Funktionalität (extension point) - \end{itemize*} + \begin{itemize*} + \item Komponente mit Standard-Schnittstelle + \item Erweitert Funktionalität (extension point) + \end{itemize*} \item Vorteile - \begin{itemize*} - \item Robustes Verhalten - \item Trennung der Zuständigkeiten - \item Erweiterbar, Austauschbar, Wiederverwendbar - \item Geringe Kopplung zu den Komponenten - \item Anpassung an eigene Bedürfnisse möglich - \item Leichte Aufteilung der Entwicklung der Arbeitspakete - \end{itemize*} + \begin{itemize*} + \item Robustes Verhalten + \item Trennung der Zuständigkeiten + \item Erweiterbar, Austauschbar, Wiederverwendbar + \item Geringe Kopplung zu den Komponenten + \item Anpassung an eigene Bedürfnisse möglich + \item Leichte Aufteilung der Entwicklung der Arbeitspakete + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Höherer initialer Aufwand - \item Verwaltungsoverhead zur Laufzeit - \item Versionsverwaltung der Komponenten nötig - \item Abhängigkeiten unter den Komponenten schwierig realisierbar - \item Geschickte Definition der Extension Points nötig - \end{itemize*} + \begin{itemize*} + \item Höherer initialer Aufwand + \item Verwaltungsoverhead zur Laufzeit + \item Versionsverwaltung der Komponenten nötig + \item Abhängigkeiten unter den Komponenten schwierig realisierbar + \item Geschickte Definition der Extension Points nötig + \end{itemize*} \end{itemize*} Repository (Depot, blackboard) \begin{itemize*} \item Zentrale Datenhaltung - \begin{itemize*} - \item Datenbankmanagementsystem, Dateisystem - \end{itemize*} + \begin{itemize*} + \item Datenbankmanagementsystem, Dateisystem + \end{itemize*} \item Anwendungen tauschen Daten nur über Repository aus \item Kontrollfluss z.B. über Signale oder Semaphore \item Gut für datenintensive Verarbeitungsaufgaben geeignet @@ -1757,41 +1087,41 @@ \begin{itemize*} \item Modell / Sicht / Steuerung \item Trennung verschiedener Aufgabengebiete: - \begin{itemize*} - \item Model: verwaltet Domänenwissen, Daten und Zustand; häufig Datenbank - \item View: Darstellung, Anzeige, GUI - \item Controller: Steuerung der Interaktion, Nutzerbefehle - \end{itemize*} + \begin{itemize*} + \item Model: verwaltet Domänenwissen, Daten und Zustand; häufig Datenbank + \item View: Darstellung, Anzeige, GUI + \item Controller: Steuerung der Interaktion, Nutzerbefehle + \end{itemize*} \item Erlauben Austausch von Anzeige- und Speichersystem \item Kontrollfluss - \begin{itemize*} - \item Controller steuert - \item View wird über Datenänderungen benachrichtigt (callback) - \end{itemize*} + \begin{itemize*} + \item Controller steuert + \item View wird über Datenänderungen benachrichtigt (callback) + \end{itemize*} \item Geeignet für interaktive Systeme \item Problem - \begin{itemize*} - \item Lose Kopplung zwischen verschiedenen Komponenten - \item Daten werden in verschiedenen Sichten dargestellt - \item Realisierung von GUI‘s - \end{itemize*} + \begin{itemize*} + \item Lose Kopplung zwischen verschiedenen Komponenten + \item Daten werden in verschiedenen Sichten dargestellt + \item Realisierung von GUI‘s + \end{itemize*} \item Lösung durch drei Komponenten - \begin{itemize*} - \item Daten (Model) enthält die Kernfunktionalität / Durchführung der Geschäftsprozesse, kapselt und Speichert die Daten - \item Sichten bzw. Dialoge (View) stellt die Daten für den Anwender in unterschiedlicher Art dar - \item 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 - \end{itemize*} + \begin{itemize*} + \item Daten (Model) enthält die Kernfunktionalität / Durchführung der Geschäftsprozesse, kapselt und Speichert die Daten + \item Sichten bzw. Dialoge (View) stellt die Daten für den Anwender in unterschiedlicher Art dar + \item 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 + \end{itemize*} \item Vorteile - \begin{itemize*} - \item Unabhängige Entwicklung der Komponenten - \item Änderung der Oberfläche ohne Änderung des Modells - \item Unterschiedliche Oberflächen für das selbe Modell - \end{itemize*} + \begin{itemize*} + \item Unabhängige Entwicklung der Komponenten + \item Änderung der Oberfläche ohne Änderung des Modells + \item Unterschiedliche Oberflächen für das selbe Modell + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Performance - \item Erhöhter initialer Entwicklungsaufwand - \end{itemize*} + \begin{itemize*} + \item Performance + \item Erhöhter initialer Entwicklungsaufwand + \end{itemize*} \end{itemize*} @@ -1811,35 +1141,35 @@ Klassifikation I \begin{itemize*} \item Anwendungs-Framework (application framework) - \begin{itemize*} - \item Gibt Systemarchitektur für typische Anwendungsstruktur vor - \item GUI-Framework: Motif, Qt, Swing, ... - \end{itemize*} + \begin{itemize*} + \item Gibt Systemarchitektur für typische Anwendungsstruktur vor + \item GUI-Framework: Motif, Qt, Swing, ... + \end{itemize*} \item Bereichsspezifisches Framework (domain framework) - \begin{itemize*} - \item Expertenwissen für Anwendungsbereich - \item für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, ... - \item Beispiel: AUTOSAR - \end{itemize*} + \begin{itemize*} + \item Expertenwissen für Anwendungsbereich + \item für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, ... + \item Beispiel: AUTOSAR + \end{itemize*} \item Infrastrukturgerüst (support framework) - \begin{itemize*} - \item Gerätetreiber, Anpassung an Hardware - \item Middleware: DCOM, Java RMI, CORBA, WebSphere, ... - \end{itemize*} + \begin{itemize*} + \item Gerätetreiber, Anpassung an Hardware + \item Middleware: DCOM, Java RMI, CORBA, WebSphere, ... + \end{itemize*} \end{itemize*} Klassifikation II \begin{itemize*} \item Offene Programmgerüste (white box) - \begin{itemize*} - \item Erweiterbarkeit durch Vererbung und dynamische Bindung - \item Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden - \end{itemize*} + \begin{itemize*} + \item Erweiterbarkeit durch Vererbung und dynamische Bindung + \item Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden + \end{itemize*} \item Geschlossene Programmgerüste (black box) - \begin{itemize*} - \item Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können - \item Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation - \end{itemize*} + \begin{itemize*} + \item Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können + \item Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation + \end{itemize*} \end{itemize*} @@ -1853,20 +1183,20 @@ \begin{itemize*} \item Vorteile - \begin{itemize*} - \item Weitergabe von Expertenwissen - \item Durchdachtes Design: langfristige Aufwandsersparnis - \item Wartungsaufwand reduziert, systematische Tests möglich - \item Prinzipiell sehr hohe Produktivität möglich - \item Erleichtert Integration und Konsistenz verwandter Anforderungen - \end{itemize*} + \begin{itemize*} + \item Weitergabe von Expertenwissen + \item Durchdachtes Design: langfristige Aufwandsersparnis + \item Wartungsaufwand reduziert, systematische Tests möglich + \item Prinzipiell sehr hohe Produktivität möglich + \item Erleichtert Integration und Konsistenz verwandter Anforderungen + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Erstellung und Einarbeitung aufwändig - \item Zusätzlicher Dokumentations- und Wartungsaufwand - \item Fehlersuche erschwert durch Overhead des Frameworks - \item Kombination verschiedener Frameworks sehr schwierig - \end{itemize*} + \begin{itemize*} + \item Erstellung und Einarbeitung aufwändig + \item Zusätzlicher Dokumentations- und Wartungsaufwand + \item Fehlersuche erschwert durch Overhead des Frameworks + \item Kombination verschiedener Frameworks sehr schwierig + \end{itemize*} \end{itemize*} \subsection{Systemarchitektur und Verteilung} @@ -1874,20 +1204,20 @@ \begin{itemize*} \item Aufbau und Elemente der Ablaufumgebung, Hardware \item Häufig enger Zusammenhang mit Softwarearchitektur - \begin{itemize*} - \item Architekturmuster - \item Ablaufmuster - \end{itemize*} + \begin{itemize*} + \item Architekturmuster + \item Ablaufmuster + \end{itemize*} \item Besonders bei eingebetteten Systemen \item Systemarchitektur hat Einfluss auf Softwarearchitektur - \begin{itemize*} - \item Grenzobjekte, Schnittstellen, ... - \end{itemize*} + \begin{itemize*} + \item Grenzobjekte, Schnittstellen, ... + \end{itemize*} \item Gute Systemarchitektur? - \begin{itemize*} - \item Nichtfunktionale Anforderungen - \item Modellierung und Simulation, Lastmessungen - \end{itemize*} + \begin{itemize*} + \item Nichtfunktionale Anforderungen + \item Modellierung und Simulation, Lastmessungen + \end{itemize*} \end{itemize*} Typische Strukturen @@ -1901,60 +1231,60 @@ \begin{itemize*} \item Blockdiagramm - \begin{itemize*} - \item Klassisches Beschreibungsmittel für Systemaufbau - \item Nicht Teil von UML - \end{itemize*} + \begin{itemize*} + \item Klassisches Beschreibungsmittel für Systemaufbau + \item Nicht Teil von UML + \end{itemize*} \item Konfigurationsdiagramm - \begin{itemize*} - \item meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten - \item Nicht Teil von UML - \end{itemize*} + \begin{itemize*} + \item meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten + \item Nicht Teil von UML + \end{itemize*} \item Verteilungsdiagramm (UML deployment diagram) - \begin{itemize*} - \item Darstellung der Hardwaretopologie - \item Zuordnung von Artefakten zu Hardwareeinheiten (Knoten) - \begin{itemize*} - \item Verteilung von Systembestandteilen auf Hardware - \end{itemize*} - \item Kommunikationsverbindung und Abhängigkeiten zwischen Knoten - \item Relativ spät im Projekt Installation / Wartung des Systems - \end{itemize*} + \begin{itemize*} + \item Darstellung der Hardwaretopologie + \item Zuordnung von Artefakten zu Hardwareeinheiten (Knoten) + \begin{itemize*} + \item Verteilung von Systembestandteilen auf Hardware + \end{itemize*} + \item Kommunikationsverbindung und Abhängigkeiten zwischen Knoten + \item Relativ spät im Projekt Installation / Wartung des Systems + \end{itemize*} \end{itemize*} \subsection{Globaler Kontrollfluss} Globaler Kontrollfluss \begin{itemize*} \item Ablaufsicht der Architektur - \begin{itemize*} - \item Definition nebenläufiger Systemeinheiten (z.B. Prozesse) - \item Steuerung der Abfolge von Einzelfunktionen - \item Synchronisation und Koordination - \item Reaktion auf externe Ereignisse - \item Darstellung z.B. durch Sequenzdiagramme - \end{itemize*} + \begin{itemize*} + \item Definition nebenläufiger Systemeinheiten (z.B. Prozesse) + \item Steuerung der Abfolge von Einzelfunktionen + \item Synchronisation und Koordination + \item Reaktion auf externe Ereignisse + \item Darstellung z.B. durch Sequenzdiagramme + \end{itemize*} \item Nebenläufigkeit auf Architekturebene - \begin{itemize*} - \item Threads , Prozesse, verteiltes System - \item Asynchroner Nachrichtenaustausch - \end{itemize*} + \begin{itemize*} + \item Threads , Prozesse, verteiltes System + \item Asynchroner Nachrichtenaustausch + \end{itemize*} \item Einfluss auf Architektur / abhängig von Architektur! \item Ablaufmuster - \begin{itemize*} - \item Zentral - \begin{itemize*} - \item Call/Return (prozedural, synchron) - \item Master/Slave (nebenläufig mit zentraler Steuerung) - \end{itemize*} - \item Dezentral - \begin{itemize*} - \item Ereignisgesteuert (event-driven) - \item interrupts - \item publish-subscribe (ähnlich observer) - \item (selective) broadcast - \item Datenflussgesteuert (data flow architecture) - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Zentral + \begin{itemize*} + \item Call/Return (prozedural, synchron) + \item Master/Slave (nebenläufig mit zentraler Steuerung) + \end{itemize*} + \item Dezentral + \begin{itemize*} + \item Ereignisgesteuert (event-driven) + \item interrupts + \item publish-subscribe (ähnlich observer) + \item (selective) broadcast + \item Datenflussgesteuert (data flow architecture) + \end{itemize*} + \end{itemize*} \end{itemize*} \subsection{Sonstiges} @@ -1977,21 +1307,21 @@ Weitere Aufgaben beim Grobentwurf \begin{itemize*} \item Entwurf einer persistenten Datenverwaltung - \begin{itemize*} - \item Dateisystem, Datenbank - \end{itemize*} + \begin{itemize*} + \item Dateisystem, Datenbank + \end{itemize*} \item Sicherheit - \begin{itemize*} - \item Zugriffskontrolle - \item Fehlertoleranz (Daten und Hardware) - \item Protokollfunktionen - \end{itemize*} + \begin{itemize*} + \item Zugriffskontrolle + \item Fehlertoleranz (Daten und Hardware) + \item Protokollfunktionen + \end{itemize*} \item Kontrollfluss - \begin{itemize*} - \item Ausnahmen - \item Starten, Initialisieren und Beenden der Anwendung - \item „Randanwendungsfälle“ - \end{itemize*} + \begin{itemize*} + \item Ausnahmen + \item Starten, Initialisieren und Beenden der Anwendung + \item „Randanwendungsfälle“ + \end{itemize*} \end{itemize*} Notwendigkeit der Architekturdokumentation @@ -2007,20 +1337,21 @@ \subsection{Dokumentation} \begin{itemize*} \item Grundprinzipien - \begin{itemize*} - \item Verständlich aus Sicht des Lesers formulieren (Glossar) - \item Das Warum beschreiben (Entwurfsentscheidungen) - \item Annahmen, Voraussetzungen, Randbedingungen dokumentieren - \item Wiederholungen vermeiden - \item Notation erklären oder Standards verwenden (UML) - \begin{itemize*} - \item Legende hinzufügen - \end{itemize*} - \item Auf Zweckdienlichkeit prüfen, Reviews durchführen (Inhalt, Qualität) - \item Verschiedene Sichten für verschiedene Zielgruppen - \end{itemize*} + \begin{itemize*} + \item Verständlich aus Sicht des Lesers formulieren (Glossar) + \item Das Warum beschreiben (Entwurfsentscheidungen) + \item Annahmen, Voraussetzungen, Randbedingungen dokumentieren + \item Wiederholungen vermeiden + \item Notation erklären oder Standards verwenden (UML) + \begin{itemize*} + \item Legende hinzufügen + \end{itemize*} + \item Auf Zweckdienlichkeit prüfen, Reviews durchführen (Inhalt, Qualität) + \item Verschiedene Sichten für verschiedene Zielgruppen + \end{itemize*} \end{itemize*} + \newpage \section{Feinentwurf} %| Analyse-Modell | Entwurfs-Modell | @@ -2039,42 +1370,42 @@ \item Detaillierte Beschreibung der Klassen \item Beschreibung von Schnittstellen \item Iterativer Prozess! - \begin{itemize*} - \item Verbesserung des Entwurfs - Refactoring - \item Optimieren des Entwurfsmodells zur Erfüllung nichtfunktionaler Anforderungen - \end{itemize*} + \begin{itemize*} + \item Verbesserung des Entwurfs - Refactoring + \item Optimieren des Entwurfsmodells zur Erfüllung nichtfunktionaler Anforderungen + \end{itemize*} \end{itemize*} Objektorientierter Feinentwurf \begin{itemize*} \item Ausgangspunkt - \begin{itemize*} - \item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen) - \item Verteilungskonzept - \item Ablaufmodell - \end{itemize*} + \begin{itemize*} + \item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen) + \item Verteilungskonzept + \item Ablaufmodell + \end{itemize*} \item Ergebnis - \begin{itemize*} - \item OO-Modell für jedes Subsystem der Architektur - \item OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien - \item Spezifikationen der Klassen - \item Spezifikationen von externen Schnittstellen - \end{itemize*} + \begin{itemize*} + \item OO-Modell für jedes Subsystem der Architektur + \item OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien + \item Spezifikationen der Klassen + \item Spezifikationen von externen Schnittstellen + \end{itemize*} \end{itemize*} \subsection{Klassen- und Objektentwurf} \begin{itemize*} \item Klassen der Lösungsdomäne - \begin{itemize*} - \item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen - \end{itemize*} + \begin{itemize*} + \item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen + \end{itemize*} \item Entstehungsgründe - \begin{itemize*} - \item Architektur von Software und System - \item nichtfunktionale Anforderungen - \item Beispiele: Kommunikation, Fehlertoleranz, Adapter, Datenhaltung, Effizienz, Benutzerschnittstellenobjekte, Middleware, ... - \item Sichtbare (Grenz- und Steuerungsobjekte) werden schon in der Analyse identifiziert - \end{itemize*} + \begin{itemize*} + \item Architektur von Software und System + \item nichtfunktionale Anforderungen + \item Beispiele: Kommunikation, Fehlertoleranz, Adapter, Datenhaltung, Effizienz, Benutzerschnittstellenobjekte, Middleware, ... + \item Sichtbare (Grenz- und Steuerungsobjekte) werden schon in der Analyse identifiziert + \end{itemize*} \end{itemize*} Klassen identifizieren (responsibility-driven design (Wirfs-Brock, McKean)) @@ -2106,22 +1437,22 @@ \begin{itemize*} \item Candidate (or class), Responsibility, Collaboration \item Informelles Mittel zum - \begin{itemize*} - \item Finden, - \item Beschreiben und - \item iterativen Verändern von Klassen - \end{itemize*} + \begin{itemize*} + \item Finden, + \item Beschreiben und + \item iterativen Verändern von Klassen + \end{itemize*} \end{itemize*} Ein Objekt \begin{itemize*} \item implementiert eine Schnittstelle und beeinflusst andere Objekte \item wird in drei Teilen entworfen - \begin{itemize*} - \item Öffentliche Schnittstelle - \item Art und Weise der Benutzung - \item Innere Details der Funktionsweise - \end{itemize*} + \begin{itemize*} + \item Öffentliche Schnittstelle + \item Art und Weise der Benutzung + \item Innere Details der Funktionsweise + \end{itemize*} \item Kohärenz: zusammengehörende Verantwortlichkeiten in einer Klasse konzentrieren! \end{itemize*} @@ -2129,62 +1460,62 @@ \subsection{Entwurfsprinzipien} \begin{itemize*} \item Kapselung - \begin{itemize*} - \item Probleme: Zugriff auf private oder ebenen-fremde Attribute - \item Verwenden von get- und set-Operationen - \item Zusicherungen einhalten - \item Zugriffe zentralisieren - \item Verbalisierung - \item Zugriffsbeschränkung - \end{itemize*} + \begin{itemize*} + \item Probleme: Zugriff auf private oder ebenen-fremde Attribute + \item Verwenden von get- und set-Operationen + \item Zusicherungen einhalten + \item Zugriffe zentralisieren + \item Verbalisierung + \item Zugriffsbeschränkung + \end{itemize*} \item Zerlegung - \begin{itemize*} - \item Teile und Herrsche - \item Zerlegen in Komponenten - \item Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich - \item Eigenschaften und Schnittstellen im Klassendiagramm - \item Beziehungen zwischen Klassen: Assoziationen - \item Aggregation - \begin{itemize*} - \item „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“ - \item Schwache Bindung der Teile mit dem Ganzen - \item Notation: ungefüllte Raute am Ganzen - \end{itemize*} - \item Komposition - \begin{itemize*} - \item Wie Aggregation, jedoch stärkere Bindung - \item Teil nur einem Ganzen zugeordnet - \item Nur Multiplizität von 1 oder 0..1 möglich! - \item Gefüllte Raute am Ganzen - \end{itemize*} - \item Polymorphie - \begin{itemize*} - \item Reaktion auf eine Nachricht abhängig vom Typ des Objektes - \item Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte) - \item Überladen von Operationen - \item gleicher Operationsname, unterschiedliche Signatur - \item abstrakte Operationen: Virtuelle Operationen ohne Implementierung - \item abstrakte Klasse: Klasse mit abstrakten Operationen - \item Folgen: - \item von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt) - \item Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Teile und Herrsche + \item Zerlegen in Komponenten + \item Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich + \item Eigenschaften und Schnittstellen im Klassendiagramm + \item Beziehungen zwischen Klassen: Assoziationen + \item Aggregation + \begin{itemize*} + \item „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“ + \item Schwache Bindung der Teile mit dem Ganzen + \item Notation: ungefüllte Raute am Ganzen + \end{itemize*} + \item Komposition + \begin{itemize*} + \item Wie Aggregation, jedoch stärkere Bindung + \item Teil nur einem Ganzen zugeordnet + \item Nur Multiplizität von 1 oder 0..1 möglich! + \item Gefüllte Raute am Ganzen + \end{itemize*} + \item Polymorphie + \begin{itemize*} + \item Reaktion auf eine Nachricht abhängig vom Typ des Objektes + \item Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte) + \item Überladen von Operationen + \item gleicher Operationsname, unterschiedliche Signatur + \item abstrakte Operationen: Virtuelle Operationen ohne Implementierung + \item abstrakte Klasse: Klasse mit abstrakten Operationen + \item Folgen: + \item von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt) + \item Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können + \end{itemize*} + \end{itemize*} \end{itemize*} Vererbung im Entwurf \begin{itemize*} \item In der Analyse: Klassifikation von Objekten, Taxonomie, Spezialisierung/Verallgemeinerung, Organisation von Klassen in Hierarchien \item Verringerung von Redundanz und damit Inkonsistenzen - \begin{itemize*} - \item Funktionalität nur einmal implementieren! - \item Spezifikations-Wiederverwendung - \item Implementierungs-Wiederverwendung - \end{itemize*} + \begin{itemize*} + \item Funktionalität nur einmal implementieren! + \item Spezifikations-Wiederverwendung + \item Implementierungs-Wiederverwendung + \end{itemize*} \item Verbesserung der Erweiterbarkeit - \begin{itemize*} - \item Abstrakte Schnittstellen einsetzen! - \end{itemize*} + \begin{itemize*} + \item Abstrakte Schnittstellen einsetzen! + \end{itemize*} \end{itemize*} Vererbung oder Assoziation @@ -2194,10 +1525,10 @@ \item Vererbung: Unterscheidungsmerkmal definierbar (Diskriminator) \item Vermeide Vererbung, wenn es Alternativen gibt \item Mehrfachvererbung - \begin{itemize*} - \item Problem: Unabhängige Aspekte der Vererbungshierarchie - \item Vermeidung: abstrakte Klassen oder Komposition - \end{itemize*} + \begin{itemize*} + \item Problem: Unabhängige Aspekte der Vererbungshierarchie + \item Vermeidung: abstrakte Klassen oder Komposition + \end{itemize*} \end{itemize*} Abstrakte Klassen @@ -2211,21 +1542,21 @@ \begin{itemize*} \item Erweiterbarkeit eines Entwurfs \item Offen für Erweiterungen, - \begin{itemize*} - \item z.B. durch Vererbung / Polymorphie - \item Virtuelle Operationen verwenden - \item Verändert vorhandenes Verhalten nicht - \item Erweiterung um zusätzliche Funktionen oder Daten - \end{itemize*} + \begin{itemize*} + \item z.B. durch Vererbung / Polymorphie + \item Virtuelle Operationen verwenden + \item Verändert vorhandenes Verhalten nicht + \item Erweiterung um zusätzliche Funktionen oder Daten + \end{itemize*} \item Geschlossen für Änderungen - \begin{itemize*} - \item private Attribute - \item Möglichst protected Operationen - \end{itemize*} + \begin{itemize*} + \item private Attribute + \item Möglichst protected Operationen + \end{itemize*} \item Beschränkung der Erweiterbarkeit - \begin{itemize*} - \item Keine Einschränkungen der Funktionalität der Basisklasse! - \end{itemize*} + \begin{itemize*} + \item Keine Einschränkungen der Funktionalität der Basisklasse! + \end{itemize*} \end{itemize*} Liskovsches Ersetzungsprinzip @@ -2242,12 +1573,12 @@ \item Gesetz von „schüchternen“ Objekten \item Objekte sollen nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren \item Aus einer Methode M dürfen (sollten) nur Nachrichten an Objekte gesendet werden, die ... - \begin{itemize*} - \item unmittelbarer Bestandteil des Objekts von M sind (super) - \item M als Argument übergeben wurden - \item direkt in M erzeugt wurden - \item (oder sich in globalen Variablen befinden) - \end{itemize*} + \begin{itemize*} + \item unmittelbarer Bestandteil des Objekts von M sind (super) + \item M als Argument übergeben wurden + \item direkt in M erzeugt wurden + \item (oder sich in globalen Variablen befinden) + \end{itemize*} \item Als Metrik überprüfbar \end{itemize*} @@ -2255,11 +1586,11 @@ \begin{itemize*} \item Nur Methoden aufrufen, die zur eigenen Klasse gehören \item Nur Methoden von Objekten aufrufen, die: - \begin{itemize*} - \item Von Attributen referenziert werden - \item Als Parameter übergeben wurden - \item Selbst erzeugt wurden - \end{itemize*} + \begin{itemize*} + \item Von Attributen referenziert werden + \item Als Parameter übergeben wurden + \item Selbst erzeugt wurden + \end{itemize*} \end{itemize*} @@ -2267,53 +1598,53 @@ Klassendiagramm \begin{itemize*} \item Eigenschaften - \begin{itemize*} - \item Modellierung der statischen Struktur (Aufbau) - \item Modellierung der Struktur von Daten - \item Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander) - \item Wichtigstes und bekanntestes Diagramm der UML! - \end{itemize*} + \begin{itemize*} + \item Modellierung der statischen Struktur (Aufbau) + \item Modellierung der Struktur von Daten + \item Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander) + \item Wichtigstes und bekanntestes Diagramm der UML! + \end{itemize*} \item Elemente des Klassendiagramms - \begin{itemize*} - \item Klasse (Attribute, Operationen) - \item Vererbung / Realisierung - \item Assoziationen - \item Beziehungen / Abhängigkeiten - \end{itemize*} + \begin{itemize*} + \item Klasse (Attribute, Operationen) + \item Vererbung / Realisierung + \item Assoziationen + \item Beziehungen / Abhängigkeiten + \end{itemize*} \item Attribute - \begin{itemize*} - \item Klassenattribut: "X" static - statisch, nur einmal pro Klasse vorhanden - \item Sichtbarkeit - \item "+" public - im Namensraum sichtbar - \item "\#" protected - nur in abgeleiteten Klassen sichtbar - \item "~" package - im Paket sichtbar - \item "-" private - nur in der Klasse selbst sichtbar - \item Ableitung "/" derived - abgeleitetes Attribut - \end{itemize*} + \begin{itemize*} + \item Klassenattribut: "X" static - statisch, nur einmal pro Klasse vorhanden + \item Sichtbarkeit + \item "+" public - im Namensraum sichtbar + \item "\#" protected - nur in abgeleiteten Klassen sichtbar + \item "~" package - im Paket sichtbar + \item "-" private - nur in der Klasse selbst sichtbar + \item Ableitung "/" derived - abgeleitetes Attribut + \end{itemize*} \item Weitere Eigenschaften - \begin{itemize*} - \item readOnly - nach Initialisierung nicht änderbar - \item composite - Aggregation: Composition - \item redefines X - überschreibe Attr. der Oberklasse - \item subsets X - Teilmenge - \item union - Attribut ist Vereinigung der subsets - \item unique - Elemente eindeutig (Schlüsselattribut) - \item ordered - Elemente sind geordnet (unordered) - \item sequence - Speicherung der Elemente als Liste - \item bag - Elemente sind Multimenge - \end{itemize*} + \begin{itemize*} + \item readOnly - nach Initialisierung nicht änderbar + \item composite - Aggregation: Composition + \item redefines X - überschreibe Attr. der Oberklasse + \item subsets X - Teilmenge + \item union - Attribut ist Vereinigung der subsets + \item unique - Elemente eindeutig (Schlüsselattribut) + \item ordered - Elemente sind geordnet (unordered) + \item sequence - Speicherung der Elemente als Liste + \item bag - Elemente sind Multimenge + \end{itemize*} \item Parameterlisten - \begin{itemize*} - \item in: Eingangsparameter - \item out: Ausgangsparameter - \item inout: Eingangs- und Ausgangsparameter - \item return: Rückgabewert - \end{itemize*} + \begin{itemize*} + \item in: Eingangsparameter + \item out: Ausgangsparameter + \item inout: Eingangs- und Ausgangsparameter + \item return: Rückgabewert + \end{itemize*} \item Beziehungen - \begin{itemize*} - \item navigierbar/unspezifiziert/nicht-navigierbar - \item ungerichtete/gerichtete Relation/assoziation - \end{itemize*} + \begin{itemize*} + \item navigierbar/unspezifiziert/nicht-navigierbar + \item ungerichtete/gerichtete Relation/assoziation + \end{itemize*} \end{itemize*} Aktive Klassen @@ -2326,30 +1657,30 @@ \subsection{Schnittstellen} \begin{itemize*} \item Vereinbarung über Art des Aufrufs - \begin{itemize*} - \item Homogenität gleicher Funktionen - \item Enthält: - \item Spezifikation von Operationen - \item keine Implementierung ( Java, nicht UML!) - \item keine Attribute - \item In Java außerdem anstelle von Mehrfachvererbung - \end{itemize*} + \begin{itemize*} + \item Homogenität gleicher Funktionen + \item Enthält: + \item Spezifikation von Operationen + \item keine Implementierung ( Java, nicht UML!) + \item keine Attribute + \item In Java außerdem anstelle von Mehrfachvererbung + \end{itemize*} \item Schnittstellen in UML - \begin{itemize*} - \item Funktion ähnlich abstrakter Klasse - \item Meist für technische Aspekte - \item Notation: Stereotyp <> oder grafisch (lollipop notation) - \end{itemize*} + \begin{itemize*} + \item Funktion ähnlich abstrakter Klasse + \item Meist für technische Aspekte + \item Notation: Stereotyp <> oder grafisch (lollipop notation) + \end{itemize*} \item Verträge („design by contract“) - \begin{itemize*} - \item Schnittstelle sagt bisher nichts über Effekt der Klasse aus - \item Vollständige Beschreibung wäre Programm? - \item Vereinfachte Beschreibung für Abfolgen: - \item Vorbedingung: Prädikat, das vor Aufruf gelten muss <> - \item Nachbedingung: Prädikat, das nach Aufruf gelten muss <> - \item Invariante: Prädikat, das immer gilt <> - \item Jeweils Einschränkungen! - \end{itemize*} + \begin{itemize*} + \item Schnittstelle sagt bisher nichts über Effekt der Klasse aus + \item Vollständige Beschreibung wäre Programm? + \item Vereinfachte Beschreibung für Abfolgen: + \item Vorbedingung: Prädikat, das vor Aufruf gelten muss <> + \item Nachbedingung: Prädikat, das nach Aufruf gelten muss <> + \item Invariante: Prädikat, das immer gilt <> + \item Jeweils Einschränkungen! + \end{itemize*} \end{itemize*} Protokollrollen - Dynamisches Verhalten von Schnittstellen @@ -2357,178 +1688,178 @@ \item Ohne Sicht auf innere Implementierung (anders als beim Objektlebenszyklus) \item Protokoll = Kollaboration von Protokollrollen (protocol, protocol role) \item Modell: Zustandsautomat - \begin{itemize*} - \item Genauer: Spezialisierung - \item Beschreibung der Synchronisation von Objekten - \end{itemize*} + \begin{itemize*} + \item Genauer: Spezialisierung + \item Beschreibung der Synchronisation von Objekten + \end{itemize*} \end{itemize*} \subsection{Entwurfsmuster} \begin{itemize*} \item Warum Wiederverwendung? - \begin{itemize*} - \item Geringerer Aufwand - \item Das Rad nicht noch einmal neu erfinden - \item Verwenden üblicher, aus Erfahrung gewachsener Strukturen - \end{itemize*} + \begin{itemize*} + \item Geringerer Aufwand + \item Das Rad nicht noch einmal neu erfinden + \item Verwenden üblicher, aus Erfahrung gewachsener Strukturen + \end{itemize*} \item ... und warum nicht? - \begin{itemize*} - \item Aufwand für Anpassung kann hoch sein! - \item Einarbeiten in teilweise komplexe Schnittstellen - \item Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung - \end{itemize*} + \begin{itemize*} + \item Aufwand für Anpassung kann hoch sein! + \item Einarbeiten in teilweise komplexe Schnittstellen + \item Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung + \end{itemize*} \end{itemize*} > Was ist ein Entwurfsmuster? Eine schematische Lösung für eine Klasse verwandter Probleme (Höhere Ebene: Architekturmuster) \begin{itemize*} \item Wie helfen Muster im Entwurf? - \begin{itemize*} - \item Identifizieren von Klassen (Anwendungs- und Lösungsdomäne) - \item Regeln sind abstrakt oder an realen Objekten orientiert - \item Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben - \item Änderbarkeit und Lesbarkeit des Entwurfs verbessern - \end{itemize*} + \begin{itemize*} + \item Identifizieren von Klassen (Anwendungs- und Lösungsdomäne) + \item Regeln sind abstrakt oder an realen Objekten orientiert + \item Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben + \item Änderbarkeit und Lesbarkeit des Entwurfs verbessern + \end{itemize*} \item Arten von Entwurfsmustern - \begin{itemize*} - \item Erzeugungsmuster - \item Strukturmuster - \item Verhaltensmuster - \end{itemize*} + \begin{itemize*} + \item Erzeugungsmuster + \item Strukturmuster + \item Verhaltensmuster + \end{itemize*} \item Erzeugungsmuster - \begin{itemize*} - \item Factory Method, Fabrikmethode: - \item Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert - \item Abstract Factory, Abstrakte Fabrik: - \item Schnittstelle zur Erzeugung von Familien verwandter Objekte - \item Prototype, Prototyp: - \item Objekterzeugung durch Vorlage und Kopie - \item Builder, Erbauer: - \item Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen - \item Singleton: - \item Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet - \end{itemize*} + \begin{itemize*} + \item Factory Method, Fabrikmethode: + \item Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert + \item Abstract Factory, Abstrakte Fabrik: + \item Schnittstelle zur Erzeugung von Familien verwandter Objekte + \item Prototype, Prototyp: + \item Objekterzeugung durch Vorlage und Kopie + \item Builder, Erbauer: + \item Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen + \item Singleton: + \item Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet + \end{itemize*} \end{itemize*} Strukturmuster \begin{itemize*} \item Adapter - \begin{itemize*} - \item Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle - \end{itemize*} + \begin{itemize*} + \item Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle + \end{itemize*} \item Bridge, Brücke - \begin{itemize*} - \item Abstraktion (Schnittstelle) von Implementierung entkoppeln, um beide unabhängig zu ändern; Impl.-Klasse nur als Verweis - \end{itemize*} + \begin{itemize*} + \item Abstraktion (Schnittstelle) von Implementierung entkoppeln, um beide unabhängig zu ändern; Impl.-Klasse nur als Verweis + \end{itemize*} \item Decorator, Dekorierer - \begin{itemize*} - \item Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen) - \end{itemize*} + \begin{itemize*} + \item Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen) + \end{itemize*} \item Facade, Fassade - \begin{itemize*} - \item Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff - \end{itemize*} + \begin{itemize*} + \item Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff + \end{itemize*} \item Flyweight, Fliegengewicht - \begin{itemize*} - \item Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand) - \end{itemize*} + \begin{itemize*} + \item Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand) + \end{itemize*} \item Composite, Verbund, Kompositum - \begin{itemize*} - \item Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden, Baumstruktur - \end{itemize*} + \begin{itemize*} + \item Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden, Baumstruktur + \end{itemize*} \item Proxy, Stellvertreter - \begin{itemize*} - \item Kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt - \item Gründe: Schutz, entfernter Zugriff (remote proxy), smart pointer, Erzeugung on demand - \end{itemize*} + \begin{itemize*} + \item Kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt + \item Gründe: Schutz, entfernter Zugriff (remote proxy), smart pointer, Erzeugung on demand + \end{itemize*} \end{itemize*} Adapter \begin{itemize*} \item Vorteile - \begin{itemize*} - \item Kommunikation unabhängiger Softwarekomponenten - \item Einfache Erweiterung um zusätzliche Funktionalität - \item Austausch der Komponente durch Änderung des Adapters leicht möglich - \end{itemize*} + \begin{itemize*} + \item Kommunikation unabhängiger Softwarekomponenten + \item Einfache Erweiterung um zusätzliche Funktionalität + \item Austausch der Komponente durch Änderung des Adapters leicht möglich + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Zusätzlicher Adaptierungsschritt benötigt Zeit - \item Schlechte Wiederverwendbarkeit der Adapter - \end{itemize*} + \begin{itemize*} + \item Zusätzlicher Adaptierungsschritt benötigt Zeit + \item Schlechte Wiederverwendbarkeit der Adapter + \end{itemize*} \item Bekannte Verwendung, Spezialfälle - \begin{itemize*} - \item Fassade: Adapter eines Teilsystems - \item Proxy: erweitert die Funktionalität bei gleicher Schnittstelle - \item Brücke: keine Anpassung, sondern vorherige Strukturierung - \end{itemize*} + \begin{itemize*} + \item Fassade: Adapter eines Teilsystems + \item Proxy: erweitert die Funktionalität bei gleicher Schnittstelle + \item Brücke: keine Anpassung, sondern vorherige Strukturierung + \end{itemize*} \end{itemize*} Verhaltensmuster \begin{itemize*} \item Command, Befehl - \begin{itemize*} - \item Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen) - \end{itemize*} + \begin{itemize*} + \item Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen) + \end{itemize*} \item Observer, Beobachter - \begin{itemize*} - \item 1-zu-n-Beziehung zwischen Objekten, so dass die Änderung des zentralen Objekts zu einer Benachrichtigung und Aktualisierung der n (abhängigen) Zustände führt - \end{itemize*} + \begin{itemize*} + \item 1-zu-n-Beziehung zwischen Objekten, so dass die Änderung des zentralen Objekts zu einer Benachrichtigung und Aktualisierung der n (abhängigen) Zustände führt + \end{itemize*} \item Visitor, Besucher - \begin{itemize*} - \item Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird - \end{itemize*} + \begin{itemize*} + \item Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird + \end{itemize*} \item Interpreter - \begin{itemize*} - \item Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache - \end{itemize*} + \begin{itemize*} + \item Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache + \end{itemize*} \item Iterator - \begin{itemize*} - \item Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung - \end{itemize*} + \begin{itemize*} + \item Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung + \end{itemize*} \item Memento - \begin{itemize*} - \item Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können - \end{itemize*} + \begin{itemize*} + \item Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können + \end{itemize*} \item Template Method, Schablonenmethode - \begin{itemize*} - \item Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden - \end{itemize*} + \begin{itemize*} + \item Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden + \end{itemize*} \item Strategy, Strategie - \begin{itemize*} - \item Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte - \end{itemize*} + \begin{itemize*} + \item Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte + \end{itemize*} \item Mediator, Vermittler - \begin{itemize*} - \item Objekt, welches das Zusammenspiel einer lose gekoppelten Objektmenge in sich kapselt. Vermeidet direkten Bezug der Objekte untereinander und ermöglicht unabhängige Änderung des Zusammenspiels - \end{itemize*} + \begin{itemize*} + \item Objekt, welches das Zusammenspiel einer lose gekoppelten Objektmenge in sich kapselt. Vermeidet direkten Bezug der Objekte untereinander und ermöglicht unabhängige Änderung des Zusammenspiels + \end{itemize*} \item State, Zustand - \begin{itemize*} - \item Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt - \end{itemize*} + \begin{itemize*} + \item Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt + \end{itemize*} \item Chain of Responsibility, Zuständigkeitskette - \begin{itemize*} - \item Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist - \end{itemize*} + \begin{itemize*} + \item Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist + \end{itemize*} \end{itemize*} Bewertung Observer \begin{itemize*} \item Vorteile - \begin{itemize*} - \item Entkopplung von Komponenten und Schichten möglich - \item Broadcast und selective Broadcast möglich - \end{itemize*} + \begin{itemize*} + \item Entkopplung von Komponenten und Schichten möglich + \item Broadcast und selective Broadcast möglich + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Bei vielen Beobachtern: Benachrichtigung aufwendig - \item Unerwartete Änderung, Änderungskaskaden und Rekursion - \item Abmelden der Beobachter vor dem Löschen - \end{itemize*} + \begin{itemize*} + \item Bei vielen Beobachtern: Benachrichtigung aufwendig + \item Unerwartete Änderung, Änderungskaskaden und Rekursion + \item Abmelden der Beobachter vor dem Löschen + \end{itemize*} \item Bekannte Verwendung, Spezialfälle - \begin{itemize*} - \item Verwendung im Model-View-Controller Muster - \item Qt: Signal / Slot-Prinzip ähnlich - \end{itemize*} + \begin{itemize*} + \item Verwendung im Model-View-Controller Muster + \item Qt: Signal / Slot-Prinzip ähnlich + \end{itemize*} \end{itemize*} Anwendung von Entwurfsmustern @@ -2537,10 +1868,10 @@ \item Analysiere Struktur, Teilnehmer und Kollaborationen \item Wähle aus dem Anwendungskontext Namen für Teilnehmer \item Spezifiziere die teilnehmenden Klassen - \begin{itemize*} - \item Deklariere Schnittstellen, Vererbung und Variablen - \item Identifiziere existierende Entwurfsklassen, die durch das Muster beeinflusst werden - \end{itemize*} + \begin{itemize*} + \item Deklariere Schnittstellen, Vererbung und Variablen + \item Identifiziere existierende Entwurfsklassen, die durch das Muster beeinflusst werden + \end{itemize*} \item Wähle anwendungsspezifische Namen für Operationen \item Implementiere Operationen entsprechend den Verantwortlichkeiten und Kollaborationen des Musters \end{itemize*} @@ -2550,16 +1881,16 @@ \begin{itemize*} \item Zusammenfassung von Modulen, Klassen, etc. \item Mit einem bestimmten (abstrakten) Zweck - \begin{itemize*} - \item Abstrakte Datenverwaltung, Templates - \item Grundlegende System-Aufgaben - \item Untere Kapselungs-Schicht des Laufzeitsystems oder der Programmierumgebung - \item Numerische Routinen, Simulation, ... - \end{itemize*} + \begin{itemize*} + \item Abstrakte Datenverwaltung, Templates + \item Grundlegende System-Aufgaben + \item Untere Kapselungs-Schicht des Laufzeitsystems oder der Programmierumgebung + \item Numerische Routinen, Simulation, ... + \end{itemize*} \item Wird in Anwendung eingebunden (importiert), API - \begin{itemize*} - \item Objekte instanziieren oder Klassen ableiten - \end{itemize*} + \begin{itemize*} + \item Objekte instanziieren oder Klassen ableiten + \end{itemize*} \item Meist passiv: Kontrollfluss wird von Anwendung gesteuert \item Beispiele: stdlib, MFC, GNU scientific library, Java 3D, IPP \end{itemize*} @@ -2569,80 +1900,81 @@ \item Bausteinorientierte Programmierung (component-ware) \item Softwareentwicklung: Konstruktion aus vorgegebenen Bausteinen \item Entsprechung für Wiederverwendung: Generische Bausteine (components) - \begin{itemize*} - \item Anpassbar, zusammensetzbar - \end{itemize*} + \begin{itemize*} + \item Anpassbar, zusammensetzbar + \end{itemize*} \item Werkzeuggestützte bzw. grafische Kompositionsmechanismen \item Beispiele: Java Beans, Enterprise Java Beans (EJBs), Microsoft COM+ \item Komponenten-Entwicklung oft auch projektspezifisch \item Warum Komponenten - \begin{itemize*} - \item Monolithische, proprietäre Software führt zunehmend zu Problemen - \item Zunehmend verteilte Anwendungen mit offener Struktur und Internet-Anbindung - \item Zusammensetzen der Funktionalität aus standardisierten Elementen, die über offene Schnittstellen kommunizieren - \item Komponenten sollen Flexibilität bei sich ändernden Anforderungen erhöhen - \item Weg aus der „Software-Krise“? - \end{itemize*} + \begin{itemize*} + \item Monolithische, proprietäre Software führt zunehmend zu Problemen + \item Zunehmend verteilte Anwendungen mit offener Struktur und Internet-Anbindung + \item Zusammensetzen der Funktionalität aus standardisierten Elementen, die über offene Schnittstellen kommunizieren + \item Komponenten sollen Flexibilität bei sich ändernden Anforderungen erhöhen + \item Weg aus der „Software-Krise“? + \end{itemize*} \item Eigenschaften von Komponenten - \begin{itemize*} - \item müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein - \item Kontextabhängigkeiten: benötigte Komponenten-Infrastruktur und Systemressourcen - \item Kapseln ihre angebotenen Funktionen - \item Werden immer als ganze Einheit eingesetzt; alle Bestandteile sind enthalten (Archiv-Datei) - \item Sind nicht von Kopien ihrer selbst unterscheidbar - \item Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung - \item Komposition durch Dritte: Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator; meist nur kompilierter Code verfügbar - \end{itemize*} + \begin{itemize*} + \item müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein + \item Kontextabhängigkeiten: benötigte Komponenten-Infrastruktur und Systemressourcen + \item Kapseln ihre angebotenen Funktionen + \item Werden immer als ganze Einheit eingesetzt; alle Bestandteile sind enthalten (Archiv-Datei) + \item Sind nicht von Kopien ihrer selbst unterscheidbar + \item Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung + \item Komposition durch Dritte: Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator; meist nur kompilierter Code verfügbar + \end{itemize*} \end{itemize*} Komponenten für Client/Server-Architekturen \begin{itemize*} \item Wichtige Aspekte - \begin{itemize*} - \item Transaktionen - \item Sicherheit - \item Ressourcenverwaltung - \item Persistenz - \end{itemize*} + \begin{itemize*} + \item Transaktionen + \item Sicherheit + \item Ressourcenverwaltung + \item Persistenz + \end{itemize*} \item Komponentenkonzept für Server-Komponenten - \begin{itemize*} - \item meist unsichtbare Komponenten - \item standardisierte Realisierung der wichtigen Eigenschaften für Client/Server-Anwendungen - \item Realisierung: Enterprise Java Beans (EJBs) innerhalb eines Java Enterprise Edition Servers - \end{itemize*} + \begin{itemize*} + \item meist unsichtbare Komponenten + \item standardisierte Realisierung der wichtigen Eigenschaften für Client/Server-Anwendungen + \item Realisierung: Enterprise Java Beans (EJBs) innerhalb eines Java Enterprise Edition Servers + \end{itemize*} \end{itemize*} \subsection{Dokumentation} Dokumentation des Feinentwurfs \begin{itemize*} \item Möglichkeiten - \begin{itemize*} - \item Eigenständiges Dokument - \item Erweiterung des Lastenhefts / Grobkonzepts - \item Eingebettet in den Quellcode (Werkzeug, z.B. Javadoc) - \end{itemize*} + \begin{itemize*} + \item Eigenständiges Dokument + \item Erweiterung des Lastenhefts / Grobkonzepts + \item Eingebettet in den Quellcode (Werkzeug, z.B. Javadoc) + \end{itemize*} \item Inhalt - \begin{itemize*} - \item Ähnlich Grobkonzept - \item Zusätzlich detaillierte Modelle - \item Abwägungen des Objektentwurfs - \item Klassenschnittstellen - \end{itemize*} + \begin{itemize*} + \item Ähnlich Grobkonzept + \item Zusätzlich detaillierte Modelle + \item Abwägungen des Objektentwurfs + \item Klassenschnittstellen + \end{itemize*} \end{itemize*} + \newpage \section{Implementierung} Aufgaben der Implementierung \begin{itemize*} \item Aus Spezifikationen Programm(code) erzeugen \item Aufbauend auf Ergebnissen des Feinentwurfs - \begin{itemize*} - \item Algorithmen konzipieren - \item Datenstrukturen realisieren - \item Umsetzen in konkreter Programmiersprache - \item Dokumentation - \item Untersuchung des Zeit- und Speicherbedarfs - \item Test und Verifikation - \end{itemize*} + \begin{itemize*} + \item Algorithmen konzipieren + \item Datenstrukturen realisieren + \item Umsetzen in konkreter Programmiersprache + \item Dokumentation + \item Untersuchung des Zeit- und Speicherbedarfs + \item Test und Verifikation + \end{itemize*} \item „Programmieren im Kleinen“ \end{itemize*} @@ -2651,40 +1983,40 @@ \begin{itemize*} \item (Coding Rules, -conventions, -standards) \item Regeln für verständliche Programme - \begin{itemize*} - \item „wie“ sollte Quellcode formal und strukturell gestaltet sein - \item Bezeichner, Einrückungen, Dokumentation, Dateien, ... - \item Strukturierung: Block, Methode, Klasse, Package - \end{itemize*} + \begin{itemize*} + \item „wie“ sollte Quellcode formal und strukturell gestaltet sein + \item Bezeichner, Einrückungen, Dokumentation, Dateien, ... + \item Strukturierung: Block, Methode, Klasse, Package + \end{itemize*} \item Firmenspezifische Regeln - \begin{itemize*} - \item Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung) - \end{itemize*} + \begin{itemize*} + \item Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung) + \end{itemize*} \end{itemize*} Namenskonventionen \begin{itemize*} \item Klasse - \begin{itemize*} - \item (mit) Substantiv, „UpperCamelCase“ - \item Beispiele: Account, StandardTemplate - \end{itemize*} + \begin{itemize*} + \item (mit) Substantiv, „UpperCamelCase“ + \item Beispiele: Account, StandardTemplate + \end{itemize*} \item Methode - \begin{itemize*} - \item (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“ - \item Beispiele: checkAvailability(), getDate() - \end{itemize*} + \begin{itemize*} + \item (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“ + \item Beispiele: checkAvailability(), getDate() + \end{itemize*} \item Attribut, Variable - \begin{itemize*} - \item (mit) Substantiv, „lowerCamelCase“ - \item Beispiele: anzahlAutos, fensterBreite - \end{itemize*} + \begin{itemize*} + \item (mit) Substantiv, „lowerCamelCase“ + \item Beispiele: anzahlAutos, fensterBreite + \end{itemize*} \item Konstante - \begin{itemize*} - \item Nur Großbuchstaben, Worte mit "\_" zusammengesetzt - \item Standardpräfixe: "MIN\_", "MAX\_", "DEFAULT\_", ... - \item Beispiele: NORTH, BLUE, MIN\_WIDTH, DEFAULT\_SIZE - \end{itemize*} + \begin{itemize*} + \item Nur Großbuchstaben, Worte mit "\_" zusammengesetzt + \item Standardpräfixe: "MIN\_", "MAX\_", "DEFAULT\_", ... + \item Beispiele: NORTH, BLUE, MIN\_WIDTH, DEFAULT\_SIZE + \end{itemize*} \end{itemize*} Formatierungs-Richtlinien @@ -2692,41 +2024,41 @@ \item Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit \item Einheitliche Verwendung von Leerzeilen und Leerzeichen \item Einheitliche Dateistruktur verwenden - \begin{itemize*} - \item Eine .java-Datei pro Klasse - \item Ein Verzeichnis für jedes package - \end{itemize*} + \begin{itemize*} + \item Eine .java-Datei pro Klasse + \item Ein Verzeichnis für jedes package + \end{itemize*} \item Werkzeuge: source beautifier, oft in IDEs enthalten \item Editor: syntax highlighting \item Navigationswerkzeuge - \begin{itemize*} - \item Auf- und Zuklappen, Inhaltsverzeichnis, tagging - \item doxygen, Eclipse etc. - \end{itemize*} + \begin{itemize*} + \item Auf- und Zuklappen, Inhaltsverzeichnis, tagging + \item doxygen, Eclipse etc. + \end{itemize*} \end{itemize*} Änderungsfreundlicher Code \begin{itemize*} \item Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung: - \begin{itemize*} - \item `typedef char name [NAME\_LENGTH]` - \item `typedef char firstName [FIRST\_NAME\_LENGTH]` - \end{itemize*} + \begin{itemize*} + \item `typedef char name [NAME\_LENGTH]` + \item `typedef char firstName [FIRST\_NAME\_LENGTH]` + \end{itemize*} \item Symbolische Konstanten statt literaler Werte verwenden, wenn spätere Änderung denkbar \item Algorithmen, Formeln, Standardkonzepte in Methoden/Prozeduren kapseln \item Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster (40-60 Zeilen, 70 Zeichen breit) \item Strukturierte Programmierung (Regeln je nach Schärfe) - \begin{itemize*} - \item Kein goto verwenden (in anderen Sprachen als Java) - \item switch nur mit break-Anweisung nach jedem Fall - \item break nur in switch-Anweisungen verwenden - \item continue nicht verwenden (Effekt ähnlich goto) - \item return nur am Ende zur Rückgabe des Werts - \end{itemize*} + \begin{itemize*} + \item Kein goto verwenden (in anderen Sprachen als Java) + \item switch nur mit break-Anweisung nach jedem Fall + \item break nur in switch-Anweisungen verwenden + \item continue nicht verwenden (Effekt ähnlich goto) + \item return nur am Ende zur Rückgabe des Werts + \end{itemize*} \item Übersichtliche Ausdrücke - \begin{itemize*} - \item Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++; - \end{itemize*} + \begin{itemize*} + \item Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++; + \end{itemize*} \item Variablen möglichst lokal und immer private deklarieren \item Wiederverwendung "äußerer" Namen vermeiden \end{itemize*} @@ -2741,17 +2073,17 @@ Portierbarer Code \begin{itemize*} \item Code, den man ohne Änderungen in ein anderes System (Compiler, Betriebssystem, Rechner) übertragen kann - \begin{itemize*} - \item Kein implementierungsabhängiges Verhalten! - \end{itemize*} + \begin{itemize*} + \item Kein implementierungsabhängiges Verhalten! + \end{itemize*} \item ANSI C++ Standard ist nicht vollständig definiert - \begin{itemize*} - \item Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen: - \item Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten - \item Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist - \item Nicht portabel und somit häufig verboten - \item Wird unter Umständen ungewollt wegoptimiert - \end{itemize*} + \begin{itemize*} + \item Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen: + \item Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten + \item Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist + \item Nicht portabel und somit häufig verboten + \item Wird unter Umständen ungewollt wegoptimiert + \end{itemize*} \end{itemize*} Implementierungsabhängiges Verhalten @@ -2763,7 +2095,7 @@ \item Beispiel: Speichergröße von Integer-Typen \item char kann signed oder unsigned sein: Nicht damit rechnen! \item 32 Bit System ist wie erwartet - \item 16 Bit System: Multiplikation wird mit int durchgeführt -> Überlauf -> undefiniertes Verhalten + \item 16 Bit System: Multiplikation wird mit int durchgeführt $\rightarrow$ Überlauf $\rightarrow$ undefiniertes Verhalten \end{itemize*} \begin{itemize*} @@ -2785,19 +2117,19 @@ Sicherer Code mit const \begin{itemize*} \item Const Variable - Konstante - \begin{itemize*} - \item Stellt sicher, dass sich der Wert nicht verändert - \end{itemize*} + \begin{itemize*} + \item Stellt sicher, dass sich der Wert nicht verändert + \end{itemize*} \item Const Parameter - \begin{itemize*} - \item Übergabeparameter ändert sich nicht innerhalb der Operation - \item Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger `long calcMeanValue(const image \&i){...}` - \end{itemize*} + \begin{itemize*} + \item Übergabeparameter ändert sich nicht innerhalb der Operation + \item Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger `long calcMeanValue(const image \&i){...}` + \end{itemize*} \item Const Operationen - \begin{itemize*} - \item Sicherstellen, dass Operation das Exemplar nicht ändert - \item Aufruf der const Operation bei const Variablen möglich - \end{itemize*} + \begin{itemize*} + \item Sicherstellen, dass Operation das Exemplar nicht ändert + \item Aufruf der const Operation bei const Variablen möglich + \end{itemize*} \item Verwende const wenn möglich \end{itemize*} @@ -2805,9 +2137,9 @@ \subsection{Dokumentation} \begin{itemize*} \item Selbstdokumentierende Programme? - \begin{itemize*} - \item 2001 Int. Obfuscated C Code Contest Winner, Short Program - \end{itemize*} + \begin{itemize*} + \item 2001 Int. Obfuscated C Code Contest Winner, Short Program + \end{itemize*} \end{itemize*} Integrierte Dokumentation @@ -2820,10 +2152,10 @@ \item Programmvorspann \item Kurzbeschreibung Datei / Klasse / Funktion ... \item Verwaltungsinformationen - \begin{itemize*} - \item Autor, Datum, Version, Projekt, ToDo, FixMe, ... - \item Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert - \end{itemize*} + \begin{itemize*} + \item Autor, Datum, Version, Projekt, ToDo, FixMe, ... + \item Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert + \end{itemize*} \item Laufende Kommentare im Quellcode \end{itemize*} @@ -2846,9 +2178,9 @@ \item Benutzer-Handbuch, Online-Dokumentation \item Unterstützung ohne Support? \item Vollständige und fehlerfreie Beschreibung der Benutzung - \begin{itemize*} - \item Beispiele, screen shots - \end{itemize*} + \begin{itemize*} + \item Beispiele, screen shots + \end{itemize*} \item Arten: Tutorial, Beschreibung, \end{itemize*} @@ -2865,13 +2197,13 @@ \begin{itemize*} \item Vorwärtsmodellierung: Modell - Code \item Rückwärtsmodellierung: Code - Modell - \begin{itemize*} - \item Außerdem: Modelltransformation, Refaktorisierung - \end{itemize*} + \begin{itemize*} + \item Außerdem: Modelltransformation, Refaktorisierung + \end{itemize*} \item Idealfall: Automatische Übersetzung durch SW-Werkzeug (in beiden Richtungen) - \begin{itemize*} - \item „Modellbasierte Entwicklung“ - \end{itemize*} + \begin{itemize*} + \item „Modellbasierte Entwicklung“ + \end{itemize*} \item Statisch: Beispiel Klassendiagramm - Quelltext der Klassen mit allen Vererbungsbeziehungen, Attributen und Methodensignaturen (Klassen-Stümpfe mit leeren Methodenrümpfen zum Ausfüllen) \item Dynamisch: Beispiel Zustandsdiagramm - Quelltext der Zustandssteuerung einer Klasse \end{itemize*} @@ -2899,31 +2231,31 @@ \begin{itemize*} \item Einfachste Möglichkeit: Switch (Case) Statement \item Zustände werden durch Datenwerte repräsentiert - \begin{itemize*} - \item Aktueller Zustand: einzelne skalare Variable - \end{itemize*} + \begin{itemize*} + \item Aktueller Zustand: einzelne skalare Variable + \end{itemize*} \item Jedes Ereignis wird durch Methode implementiert \item Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt \item Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt \item Wird in einer Klasse realisiert \item Sinnvoll für einfache, “flache” Modelle - \begin{itemize*} - \item Sonst Logik für Hierarchie nötig - \end{itemize*} + \begin{itemize*} + \item Sonst Logik für Hierarchie nötig + \end{itemize*} \end{itemize*} Anpassung der Generierung \begin{itemize*} \item Verschiedene Zielsprachen (Java, C++, ...) \item Model2Text-Transformationen - \begin{itemize*} - \item Verschiedene Generatoren, z.B. Eclipse Modelling Project - \end{itemize*} + \begin{itemize*} + \item Verschiedene Generatoren, z.B. Eclipse Modelling Project + \end{itemize*} \item Generierung aus dem Modellierungswerkzeug - \begin{itemize*} - \item Parametrisierung der Codegenerierung - \item Generierungsvorlagen - \end{itemize*} + \begin{itemize*} + \item Parametrisierung der Codegenerierung + \item Generierungsvorlagen + \end{itemize*} \end{itemize*} Weitere Werkzeuge @@ -2931,9 +2263,9 @@ \item Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex \& yacc / flex \& bison / antlr) \item Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits \item XML-Parser - \begin{itemize*} - \item XSLT, DOM, SAX, ... - \end{itemize*} + \begin{itemize*} + \item XSLT, DOM, SAX, ... + \end{itemize*} \end{itemize*} \subsection{Implementierung aktiver Objekte} @@ -2949,9 +2281,9 @@ \item Parallel: Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet \item Quasi-parallel: Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab \item Nebenläufig: Oberbegriff für Parallel und Quasi-parallel - \begin{itemize*} - \item concurrent - \end{itemize*} + \begin{itemize*} + \item concurrent + \end{itemize*} \end{itemize*} Vorteile @@ -2968,21 +2300,21 @@ \item Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert \item Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt \item Determinismus nicht notwendig für Determiniertheit! - \begin{itemize*} - \item Determiniertheit nebenläufiger Programme: Synchronisation - \item Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten - \end{itemize*} + \begin{itemize*} + \item Determiniertheit nebenläufiger Programme: Synchronisation + \item Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten + \end{itemize*} \end{itemize*} Java Threads \begin{itemize*} \item Verwaltung durch die Java Virtuelle Maschine (JVM) \item Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich - \begin{itemize*} - \item Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet) - \item Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern) - \item Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich - \end{itemize*} + \begin{itemize*} + \item Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet) + \item Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern) + \item Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich + \end{itemize*} \item Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar \end{itemize*} @@ -2990,41 +2322,41 @@ \begin{itemize*} \item Unterklasse der Basisklasse „Thread“ bilden `class MyThread extends Thread` \item Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet): - \begin{itemize*} - \item Schnittstelle „Runnable“ implementieren - \item `class MyThread implements Runnable` - \end{itemize*} + \begin{itemize*} + \item Schnittstelle „Runnable“ implementieren + \item `class MyThread implements Runnable` + \end{itemize*} \item Die vordefinierte Schnittstelle Runnable ist definiert als - % ```java - % public interface Runnable - % { public abstract void run(); } - % ``` + % ```java + % public interface Runnable + % { public abstract void run(); } + % ``` \end{itemize*} Starten eines Threads \begin{itemize*} \item Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren \item Seiteneffekt der Runnable-Schnittstelle - \begin{itemize*} - \item Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt - \item Ausführung beginnt mit der Methode run () - \end{itemize*} + \begin{itemize*} + \item Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt + \item Ausführung beginnt mit der Methode run () + \end{itemize*} \item Ablauf - \begin{itemize*} - \item Thread-Objekt erzeugen - \item Thread starten mit t.start() - \item start() ruft implizit run() auf - \end{itemize*} + \begin{itemize*} + \item Thread-Objekt erzeugen + \item Thread starten mit t.start() + \item start() ruft implizit run() auf + \end{itemize*} \end{itemize*} Synchronisation von Threads \begin{itemize*} \item Gezielte Einschränkung der Nebenläufigkeit \item Gründe - \begin{itemize*} - \item Zugriffsbeschränkung, gegenseitiger Ausschluss - \item Abhängigkeiten, einseitige Synchronisation - \end{itemize*} + \begin{itemize*} + \item Zugriffsbeschränkung, gegenseitiger Ausschluss + \item Abhängigkeiten, einseitige Synchronisation + \end{itemize*} \item Methoden: Semaphore, Monitore, Schlossvariablen, ... \end{itemize*} @@ -3041,30 +2373,28 @@ \item Projektstruktur, klare Verantwortlichkeiten \item Kosten- und Zeitdruck? Änderungen? \item Programmier- und Testmethoden - \begin{itemize*} - \item pair programming, code reading etc. - \item Qualitätsverantwortlicher, automatisiertes Testen - \end{itemize*} + \begin{itemize*} + \item pair programming, code reading etc. + \item Qualitätsverantwortlicher, automatisiertes Testen + \end{itemize*} \item Technische Unterstützung - \begin{itemize*} - \item Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung - \end{itemize*} + \begin{itemize*} + \item Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung + \end{itemize*} \end{itemize*} Begriffe \begin{itemize*} \item Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation \item Grund für Unzuverlässigkeit: - \begin{itemize*} - \item Fehler (bug, fault): fehlerhafter Programmcode o.ä. - \begin{itemize*} - \item Der Begriff „Bug“: - \begin{itemize*} - \item Schon vor Computern als Begriff für Fehler benutzt - \item Motte im Relais des Computers Mark II Aiken (1947) - \end{itemize*} - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Fehler (bug, fault): fehlerhafter Programmcode o.ä. + \item Der Begriff „Bug“: + \begin{itemize*} + \item Schon vor Computern als Begriff für Fehler benutzt + \item Motte im Relais des Computers Mark II Aiken (1947) + \end{itemize*} + \end{itemize*} \item Fehlerhafter Zustand (error): Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt \item Störfall, Ausfall (failure): Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen \end{itemize*} @@ -3074,12 +2404,12 @@ \item Anspruch guter Software: System entspricht Systemmodell (Korrektheit) \item Problem: System nicht vollständig automatisch erzeugbar! \item Auswege - \begin{itemize*} - \item Fehlervermeidung (Inspektion, pair programming, ...) - \item Nachweis, dass System dem Modell entspricht - Verifikation - \item Überprüfen, ob System dem Modell entspricht - Testen - \item Fehlertoleranz (durch Redundanz) - \end{itemize*} + \begin{itemize*} + \item Fehlervermeidung (Inspektion, pair programming, ...) + \item Nachweis, dass System dem Modell entspricht - Verifikation + \item Überprüfen, ob System dem Modell entspricht - Testen + \item Fehlertoleranz (durch Redundanz) + \end{itemize*} \end{itemize*} Verifikation @@ -3087,29 +2417,29 @@ \item Mathematisch formaler Beweis, dass ein Programm einer Spezifikation genügt \item Vorteil: wenn anwendbar, dann vollständiger Beweis \item Problem: für viele (realistisch große) Fälle nicht anwendbar - \begin{itemize*} - \item Zu aufwändig - \item Umgebung muss ebenfalls verifiziert werden - \item Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz - \end{itemize*} + \begin{itemize*} + \item Zu aufwändig + \item Umgebung muss ebenfalls verifiziert werden + \item Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz + \end{itemize*} \item Theoretische Informatik: Berechenbarkeitstheorie, formale Semantik; aktives Forschungsgebiet - \begin{itemize*} - \item model checking - \end{itemize*} + \begin{itemize*} + \item model checking + \end{itemize*} \end{itemize*} Testen \begin{itemize*} \item Systematischer Versuch, Defekte in der Software zu finden \item Ingenieurtechnik zur Erhöhung des Vertrauens in Softwaresysteme, aber: unvollständig! - \begin{itemize*} - \item Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)! - \end{itemize*} + \begin{itemize*} + \item Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)! + \end{itemize*} \item Aufgabe: Unterschiede zwischen Modell und System finden \item Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben - \begin{itemize*} - \item Daher sollten nicht (nur) Entwickler selbst testen - \end{itemize*} + \begin{itemize*} + \item Daher sollten nicht (nur) Entwickler selbst testen + \end{itemize*} \end{itemize*} Testplanung @@ -3117,34 +2447,34 @@ \item Testen ist aufwändig, deshalb ist gute Planung nötig! \item Testplanung sollte bereits mit der Anforderungsanalyse beginnen und im Entwurf verfeinert werden (V-Modell, Test-First-Ansatz)! \item Typische Bestandteile einer Test-Spezifikation (Testdrehbuch) - \begin{itemize*} - \item Phasenmodell des Testprozesses - \item Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele - \item Zu testende Produkte - \item Zeitplan für die Tests - \item Abhängigkeiten der Testphasen - \item Aufzeichnung der Testergebnisse - \item Hardware\item und Softwareanforderungen - \end{itemize*} + \begin{itemize*} + \item Phasenmodell des Testprozesses + \item Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele + \item Zu testende Produkte + \item Zeitplan für die Tests + \item Abhängigkeiten der Testphasen + \item Aufzeichnung der Testergebnisse + \item Hardware\item und Softwareanforderungen + \end{itemize*} \end{itemize*} Arten von Tests \begin{itemize*} \item Komponententest: Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System - \begin{itemize*} - \item Umgebung muss nachgebildet werden - \end{itemize*} + \begin{itemize*} + \item Umgebung muss nachgebildet werden + \end{itemize*} \item Integrationstest: Zusammenspiel von Komponenten - \begin{itemize*} - \item Vollständiges System: Systemtest; Szenarios - \end{itemize*} + \begin{itemize*} + \item Vollständiges System: Systemtest; Szenarios + \end{itemize*} \item Strukturtest: innere Zustände, Interaktionen \item Funktionstest: Anforderungen aus Lastenheft \item Leistungstest: nichtfunktionale Anforderungen \item Benutzbarkeitstest: Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern - \begin{itemize*} - \item Prototypen - \end{itemize*} + \begin{itemize*} + \item Prototypen + \end{itemize*} \item Akzeptanztest, Installationstest: Kunde, Abnahme \end{itemize*} @@ -3152,36 +2482,36 @@ \begin{itemize*} \item Überprüft Verhalten einer Systemkomponenten im Vergleich zur Spezifikation \item Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert - \begin{itemize*} - \item Teststumpf (stub, dummy) simuliert aufgerufene Komponenten - \item Testtreiber simuliert aufrufende Komponenten - \end{itemize*} + \begin{itemize*} + \item Teststumpf (stub, dummy) simuliert aufgerufene Komponenten + \item Testtreiber simuliert aufrufende Komponenten + \end{itemize*} \item Vorgehensweisen - \begin{itemize*} - \item Bottom-up - \item Top-down - \item Sandwich - \item Schichtenweises Testen - \end{itemize*} + \begin{itemize*} + \item Bottom-up + \item Top-down + \item Sandwich + \item Schichtenweises Testen + \end{itemize*} \end{itemize*} Systematisches Testen \begin{itemize*} \item Testfall - \begin{itemize*} - \item Beschreibung, Name - \item Zu testende Komponente, Testgegenstand (Pfad, Aufrufart) - \item Eingabedaten (Testdaten) - \item Erwartete Ergebnisse („Orakel“) - \item Protokoll (erzeugte Ausgaben) - \item Bewertung des Ergebnisses - \end{itemize*} + \begin{itemize*} + \item Beschreibung, Name + \item Zu testende Komponente, Testgegenstand (Pfad, Aufrufart) + \item Eingabedaten (Testdaten) + \item Erwartete Ergebnisse („Orakel“) + \item Protokoll (erzeugte Ausgaben) + \item Bewertung des Ergebnisses + \end{itemize*} \item Weitere Begriffe - \begin{itemize*} - \item Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands - \item Alphatest: Test eines Prototypen durch Benutzer - \item Betatest: Test der vollständigen Software durch Benutzer - \end{itemize*} + \begin{itemize*} + \item Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands + \item Alphatest: Test eines Prototypen durch Benutzer + \item Betatest: Test der vollständigen Software durch Benutzer + \end{itemize*} \end{itemize*} Funktionaler Test (black box test) @@ -3199,10 +2529,10 @@ \item Äquivalenzklasse = Teilmenge der möglichen Datenwerte der Eingabeparameter \item Test je eines Repräsentanten jeder Äquivalenzklasse \item Finden von Äquivalenzklassen - \begin{itemize*} - \item Zulässige / unzulässige Teilbereiche der Datenwerte - \item Unterteilung der Bereiche nach erwarteten Ausgabewerten - \end{itemize*} + \begin{itemize*} + \item Zulässige / unzulässige Teilbereiche der Datenwerte + \item Unterteilung der Bereiche nach erwarteten Ausgabewerten + \end{itemize*} \end{itemize*} Grenztests @@ -3217,15 +2547,15 @@ \item Testfallauswahl beruht auf Programmstruktur \item Wie erreicht man möglichst vollständige Abdeckung? \item Kontrollflussorientiert - \begin{itemize*} - \item Anweisungsüberdeckung anhand Quellcode - \item Zweigüberdeckung und - \item Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest - \end{itemize*} + \begin{itemize*} + \item Anweisungsüberdeckung anhand Quellcode + \item Zweigüberdeckung und + \item Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest + \end{itemize*} \item Datenflussorientiert - \begin{itemize*} - \item defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen - \end{itemize*} + \begin{itemize*} + \item defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen + \end{itemize*} \item Zustandsorientiert \end{itemize*} @@ -3233,11 +2563,11 @@ Wann wird getestet? \begin{itemize*} \item Während der Implementierung! - \begin{itemize*} - \item Auch wenn Schreiben von Tests scheinbar unproduktiv ist - \item Tests sind unbeliebt, da Probleme aufgezeigt werden - \item Aber: spätes Testen erhöht Aufwand! - \end{itemize*} + \begin{itemize*} + \item Auch wenn Schreiben von Tests scheinbar unproduktiv ist + \item Tests sind unbeliebt, da Probleme aufgezeigt werden + \item Aber: spätes Testen erhöht Aufwand! + \end{itemize*} \item Inkrementell, d.h. für jede überschaubare Änderung \item Spezielle Vorgehensweise: test first-Ansatz \end{itemize*} @@ -3248,16 +2578,16 @@ \begin{itemize*} \item Iterative Erstellung eines Testplans / Testdrehbuchs \item Aktivitäten - Festlegen von - \begin{itemize*} - \item Teststrategie (Testumfang, Testabdeckung, Risikoabschätzung) - \item Testziele und Kriterien für Testbeginn, -ende und -abbruch - \item Vorgehensweise (Testarten) - \item Testumgebung (Beschreibung) - \item Hilfsmittel und Werkzeuge zum Testen - \item Testspezifikation - \item Testorganisation (Termine, Rollen, Ressourcen) - \item Fehlermanagement (Werkzeugunterstützung) - \end{itemize*} + \begin{itemize*} + \item Teststrategie (Testumfang, Testabdeckung, Risikoabschätzung) + \item Testziele und Kriterien für Testbeginn, -ende und -abbruch + \item Vorgehensweise (Testarten) + \item Testumgebung (Beschreibung) + \item Hilfsmittel und Werkzeuge zum Testen + \item Testspezifikation + \item Testorganisation (Termine, Rollen, Ressourcen) + \item Fehlermanagement (Werkzeugunterstützung) + \end{itemize*} \item Ergebnis: Inhalt des Testplans \end{itemize*} @@ -3265,52 +2595,52 @@ \begin{itemize*} \item Auswahl der zu testenden Testfälle \item Definition einzelner Testfälle - \begin{itemize*} - \item Grundlage: Anwendungsfälle, Anforderungen, Fehlermeldungen (Zuordnung notwendig) - \end{itemize*} + \begin{itemize*} + \item Grundlage: Anwendungsfälle, Anforderungen, Fehlermeldungen (Zuordnung notwendig) + \end{itemize*} \item Aktivitäten - \begin{itemize*} - \item Testfallfindung und Testfalloptimierung - \item Testfälle beschreiben (was genau ist zu testen) - \item Randbedingungen finden (Abhängigkeiten zu anderen Testfällen) - \item Festlegen und Erstellen der Eingabedaten - \item Festlegungen zum Testablauf und zur Testreihenfolge - \item Festlegen Soll-Ergebnis - \item Festlegung der Bedingung(en) für 'Test erfüllt'; ... - \end{itemize*} + \begin{itemize*} + \item Testfallfindung und Testfalloptimierung + \item Testfälle beschreiben (was genau ist zu testen) + \item Randbedingungen finden (Abhängigkeiten zu anderen Testfällen) + \item Festlegen und Erstellen der Eingabedaten + \item Festlegungen zum Testablauf und zur Testreihenfolge + \item Festlegen Soll-Ergebnis + \item Festlegung der Bedingung(en) für 'Test erfüllt'; ... + \end{itemize*} \end{itemize*} Testvorbereitung \begin{itemize*} \item Tätigkeiten im Vorfeld des Tests \item Aktivitäten - \begin{itemize*} - \item Vorbereitung der Tests entsprechend Testplan - \item Bereitstellen der Dokumente (Testspezifikation) - \item Verfügbar machen von Werkzeugen (Fehlermanagement) - \item Aufbauen der Testumgebung(en) - \item Integration der Entwicklungsergebnisse in die Testumgebung (Software installieren, konfigurieren, ...) - \item Bereitstellung von Testdaten bzw. Eingabedaten in die Testumgebung - \item Benutzer und Benutzerrechte anlegen - \end{itemize*} + \begin{itemize*} + \item Vorbereitung der Tests entsprechend Testplan + \item Bereitstellen der Dokumente (Testspezifikation) + \item Verfügbar machen von Werkzeugen (Fehlermanagement) + \item Aufbauen der Testumgebung(en) + \item Integration der Entwicklungsergebnisse in die Testumgebung (Software installieren, konfigurieren, ...) + \item Bereitstellung von Testdaten bzw. Eingabedaten in die Testumgebung + \item Benutzer und Benutzerrechte anlegen + \end{itemize*} \end{itemize*} Testdurchführung \begin{itemize*} \item Durchführung der spezifizierten Tests - \begin{itemize*} - \item Manuell - \item Automatisiert - \end{itemize*} + \begin{itemize*} + \item Manuell + \item Automatisiert + \end{itemize*} \item Aktivitäten - \begin{itemize*} - \item Auswählen der zu testenden Testfälle - \item Bereitstellen der Testdaten - \item Starten, Überwachen, Abbrechen, Beenden - \item Erfassung des Ist-Ergebnisses zur Auswertung - \item Besondere Vorkommnisse dokumentieren - \item Umgebungsinformationen für den Testlauf archivieren, ... - \end{itemize*} + \begin{itemize*} + \item Auswählen der zu testenden Testfälle + \item Bereitstellen der Testdaten + \item Starten, Überwachen, Abbrechen, Beenden + \item Erfassung des Ist-Ergebnisses zur Auswertung + \item Besondere Vorkommnisse dokumentieren + \item Umgebungsinformationen für den Testlauf archivieren, ... + \end{itemize*} \end{itemize*} Testauswertung @@ -3319,13 +2649,13 @@ \item Vergleich Ist-Ergebnis mit Soll-Ergebnis \item Entscheidung Testergebnis (ok / Fehler) \item Bei Fehler: - \begin{itemize*} - \item Klassifizierung (z. B.: Fehlerursache, Fehlerschwere etc.) - \item Fehler reproduzieren! - \item Angemessene Fehlerbeschreibung und –erläuterung: Nur ausreichend dokumentierte Fehler sind gültig und können bearbeitet werden! - \item Fehler im Fehlermanagement eintragen (Bug report) - \item Testfall bleibt offen - \end{itemize*} + \begin{itemize*} + \item Klassifizierung (z. B.: Fehlerursache, Fehlerschwere etc.) + \item Fehler reproduzieren! + \item Angemessene Fehlerbeschreibung und –erläuterung: Nur ausreichend dokumentierte Fehler sind gültig und können bearbeitet werden! + \item Fehler im Fehlermanagement eintragen (Bug report) + \item Testfall bleibt offen + \end{itemize*} \end{itemize*} Bugbeschreibung @@ -3334,16 +2664,16 @@ \item Ziel ist die Reproduzierbarkeit des Fehlers \item Zuordnung zu Projektplan: Meilenstein, Version \item Fehlerklassifikation - \begin{itemize*} - \item defect: Fehler in einer bestehenden Funktionalität - \item enhancement / feature: Funktionale Anforderung oder Erweiterung der bestehenden Funktionalität - \item task: Allgemeine Aufgabe - \end{itemize*} + \begin{itemize*} + \item defect: Fehler in einer bestehenden Funktionalität + \item enhancement / feature: Funktionale Anforderung oder Erweiterung der bestehenden Funktionalität + \item task: Allgemeine Aufgabe + \end{itemize*} \item Priorität festlegen - \begin{itemize*} - \item Unterschiedliche Stufen - \item Festlegung innerhalb eines Unternehmens / Projektes - \end{itemize*} + \begin{itemize*} + \item Unterschiedliche Stufen + \item Festlegung innerhalb eines Unternehmens / Projektes + \end{itemize*} \item Prioritäten von Fehlern (bugs) \end{itemize*} @@ -3360,22 +2690,22 @@ \item Zusammenfassen der Tests \item Gesamtstatus dokumentieren und kommunizieren \item Entscheidungen herbeiführen z.B.: Auslieferung? - \begin{itemize*} - \item Ziele erreicht - nächste Schritte (Auslieferung) - \item Tests vorzeitig beenden oder unterbrechen - \item Gründe dokumentieren - \item Vollständiger Nachtest oder Teiltest möglich? - \end{itemize*} + \begin{itemize*} + \item Ziele erreicht - nächste Schritte (Auslieferung) + \item Tests vorzeitig beenden oder unterbrechen + \item Gründe dokumentieren + \item Vollständiger Nachtest oder Teiltest möglich? + \end{itemize*} \item Unterlagen archivieren \end{itemize*} Testautomatisierung \begin{itemize*} \item Automatische Code-Validierung - \begin{itemize*} - \item Statisch: lint (C), Compiler - \item Dynamisch: run-time checking, memory leaks etc. - \end{itemize*} + \begin{itemize*} + \item Statisch: lint (C), Compiler + \item Dynamisch: run-time checking, memory leaks etc. + \end{itemize*} \item Beispiel: Test-Framework JUnit \end{itemize*} @@ -3404,58 +2734,58 @@ Softwareverteilung (deployment) \begin{itemize*} \item Prozess zur Installation von Software auf - \begin{itemize*} - \item Anwender-PC‘s, Servern, Maschinen in Produktion ... - \end{itemize*} + \begin{itemize*} + \item Anwender-PC‘s, Servern, Maschinen in Produktion ... + \end{itemize*} \item Steuerung der Installation der Software \item Voraussetzungen für die Software schaffen - \begin{itemize*} - \item Schulungen planen und durchführen - \end{itemize*} + \begin{itemize*} + \item Schulungen planen und durchführen + \end{itemize*} \item Softwareverteilung ist ein kritischer Prozess! - \begin{itemize*} - \item Fehler können zu vielen Störungen und Ausfällen führen - \end{itemize*} + \begin{itemize*} + \item Fehler können zu vielen Störungen und Ausfällen führen + \end{itemize*} \item Ziele - \begin{itemize*} - \item Automatische Installation, Konfiguration und Wartung einer großen Anzahl von Systemen mit geringem Aufwand - \item Erreichen eines störungsarmen und sicheren Betriebs - \item Möglichst einheitliche Softwareversionen auf allen Systemen - \end{itemize*} + \begin{itemize*} + \item Automatische Installation, Konfiguration und Wartung einer großen Anzahl von Systemen mit geringem Aufwand + \item Erreichen eines störungsarmen und sicheren Betriebs + \item Möglichst einheitliche Softwareversionen auf allen Systemen + \end{itemize*} \end{itemize*} Installationsarten \begin{itemize*} \item Erstinstallation \item Software-Update (Software-Aktualisierung) - \begin{itemize*} - \item Aktualisierung der Software, Daten oder Konfiguration - \end{itemize*} + \begin{itemize*} + \item Aktualisierung der Software, Daten oder Konfiguration + \end{itemize*} \item Hotfixes und Service Packs - \begin{itemize*} - \item Nur bestimmte Teile der Software werden aktualisiert - \item Meist nur Fehlerbehebung, keine neuen Features - \end{itemize*} + \begin{itemize*} + \item Nur bestimmte Teile der Software werden aktualisiert + \item Meist nur Fehlerbehebung, keine neuen Features + \end{itemize*} \item Upgrade - \begin{itemize*} - \item Erweitert eine Software deutlich um neue Funktionen - \end{itemize*} + \begin{itemize*} + \item Erweitert eine Software deutlich um neue Funktionen + \end{itemize*} \item Unbeaufsichtigte (automatische) Installation - \begin{itemize*} - \item Installation erfolgt ohne Benutzereingriff - \item Periodisch, durch Aufruf des Anwenders, beim Programmstart - \item Einstellungen in einem Skript festgelegt oder werden als Parameter übergeben - \end{itemize*} + \begin{itemize*} + \item Installation erfolgt ohne Benutzereingriff + \item Periodisch, durch Aufruf des Anwenders, beim Programmstart + \item Einstellungen in einem Skript festgelegt oder werden als Parameter übergeben + \end{itemize*} \end{itemize*} Installationshilfsmittel \begin{itemize*} \item Installationsprogramm (Installer) - \begin{itemize*} - \item Windows: Windows Installer, InstallShield - \item Linux: RPM, Port, APT - \item MAC-OS: Installer, WarpIn - \end{itemize*} + \begin{itemize*} + \item Windows: Windows Installer, InstallShield + \item Linux: RPM, Port, APT + \item MAC-OS: Installer, WarpIn + \end{itemize*} \item Installations-Script \item Installationsanweisung \end{itemize*} @@ -3466,11 +2796,11 @@ \item Anzahl der Clients kann weit über 10.000 liegen! \item Rollout abhängig von verschiedenen Kriterien (Vorherige Installation, Hardwarekonfiguration, Zeit, Kunde) \item Rollout-Varianten - \begin{itemize*} - \item Zentral / Dezentral - \item Manuell (Benutzer löst Installation aus) - \item Automatisiert (ohne Benutzerinteraktion) - \end{itemize*} + \begin{itemize*} + \item Zentral / Dezentral + \item Manuell (Benutzer löst Installation aus) + \item Automatisiert (ohne Benutzerinteraktion) + \end{itemize*} \end{itemize*} Vollständige Verteilung (big bang) @@ -3502,10 +2832,11 @@ \begin{itemize*} \item Einführung erfolgt schrittweise mit einer definierten Anzahl \item von Installationen (Rampe - ramp-up) - \item Höhere Fehlerwahrscheinlichkeit -> Bessere Reproduzierbarkeit -> schnelleres Finden von Fehlern -> Erfahrungsgewinn + \item Höhere Fehlerwahrscheinlichkeit $\rightarrow$ Bessere Reproduzierbarkeit $\rightarrow$ schnelleres Finden von Fehlern $\rightarrow$ Erfahrungsgewinn \item Begrenztes Risiko, mittlerer Zeitaufwand \end{itemize*} + \newpage \section{Vorgehensmodelle} \subsection{Einführung} Wie läuft Softwareerstellung ab? @@ -3513,14 +2844,14 @@ \item (oder besser, wie sollte sie ablaufen?) \item Aufgaben und Phasen siehe vorangegangene Kapitel \item Wann wird was getan? Abhängigkeiten? - \begin{itemize*} - \item Sequentiell / nebenläufig, - \end{itemize*} + \begin{itemize*} + \item Sequentiell / nebenläufig, + \end{itemize*} \item Prozessmodelle der Softwareentwicklung - \begin{itemize*} - \item Regelwerke, Erfahrungen, best practices für große Projekte - \item Aktives Entwicklungsgebiet - \end{itemize*} + \begin{itemize*} + \item Regelwerke, Erfahrungen, best practices für große Projekte + \item Aktives Entwicklungsgebiet + \end{itemize*} \item Erweiterbar zum Software-Lebenszyklus mit Inbetriebnahme, Wartung, Außerdienststellung usw. \end{itemize*} @@ -3531,12 +2862,12 @@ \item Ziel: Softwareentwicklungsprozess übersichtlich, plan- und strukturierbar \item Zerlegung des Softwareentwicklungsprozesses in überschaubare Einheiten \item Unternehmensspezifisch, anpassbar, erweiterbar - \begin{itemize*} - \item Eigene Varianten, evtl. projektabhängig - \item An spezielle Bedürfnisse des Informationsbereichs angepasst - \item Kein allgemeingültiges Vorgehen - \item Einsetzbar in verschiedenartigen Projekten - \end{itemize*} + \begin{itemize*} + \item Eigene Varianten, evtl. projektabhängig + \item An spezielle Bedürfnisse des Informationsbereichs angepasst + \item Kein allgemeingültiges Vorgehen + \item Einsetzbar in verschiedenartigen Projekten + \end{itemize*} \end{itemize*} Phasen @@ -3545,12 +2876,12 @@ \item Zeitlich begrenzte Phasen \item Auch inhaltlich und organisatorisch begrenzte Phasen möglich \item Teilprozesse / Aktivitäten - \begin{itemize*} - \item Inhaltliche Zerlegung - \item Satz von Aufgaben - \item Verteilung der Teilprozesse / Aktivitäten auf verschiedene Phasen - \item Begleitet von unterstützenden, übergreifenden Aktivitäten - \end{itemize*} + \begin{itemize*} + \item Inhaltliche Zerlegung + \item Satz von Aufgaben + \item Verteilung der Teilprozesse / Aktivitäten auf verschiedene Phasen + \item Begleitet von unterstützenden, übergreifenden Aktivitäten + \end{itemize*} \end{itemize*} Aufgabe @@ -3574,118 +2905,118 @@ Unterstützungsprozesse / -Aktivitäten \begin{itemize*} \item Projektmanagement - \begin{itemize*} - \item Projektplanung, -verfolgung und -steuerung - \item Risikomanagement - \end{itemize*} + \begin{itemize*} + \item Projektplanung, -verfolgung und -steuerung + \item Risikomanagement + \end{itemize*} \item Anforderungsmanagement - \begin{itemize*} - \item Im Gegensatz zur Anforderungsaufnahme und -analyse - \end{itemize*} + \begin{itemize*} + \item Im Gegensatz zur Anforderungsaufnahme und -analyse + \end{itemize*} \item Qualitätsmanagement - \begin{itemize*} - \item Problem Management - \item Softwaremetriken (Messung von Softwareeigenschaften) - \item Statische + dynamische Analyse (Bestimmung von Schwachstellen) - \end{itemize*} + \begin{itemize*} + \item Problem Management + \item Softwaremetriken (Messung von Softwareeigenschaften) + \item Statische + dynamische Analyse (Bestimmung von Schwachstellen) + \end{itemize*} \item Konfigurationsmanagement - \begin{itemize*} - \item Versionsverwaltung, Änderungsmanagement - \end{itemize*} + \begin{itemize*} + \item Versionsverwaltung, Änderungsmanagement + \end{itemize*} \item Dokumentation \end{itemize*} \subsection{Sequenzielle Modelle} \begin{itemize*} \item Wasserfallmodell - \begin{itemize*} - \item Abhängigkeiten zwischen Teilergebnissen - \item Ursprung in System- Hardwareentwicklung - \begin{itemize*} - \item Wurde für die SW-Entwicklung übernommen - \item Auch heute verbreitetes Vorgehen bei HW-Entwicklung - \end{itemize*} - \item Sequenzielles Phasenmodell (Abschluss der Phasen) - \item Stark Dokumentengetrieben (Ergebnisse der Phasen) - \item Unterteilung in abgeschlossene Phasen: - \begin{itemize*} - \item Analyse - \item Design/Entwurf - \item Implementierung - \item Test \& Integration - \item Einführung, Betrieb \& Wartung - \end{itemize*} - \item Alternativ: - \begin{itemize*} - \item Planung - \item Definition - \item Entwurf - \item Implementierung - \item Test \& Integration - \item Einsatz und Wartung - \end{itemize*} - \item Vorteile - \begin{itemize*} - \item Einfach und verständlich, bekannt und verbreitet - \item Erleichterte Planung und Steuerung - \end{itemize*} - \item Nachteile - \begin{itemize*} - \item Idealisierte Annahme rein sequentiellen Ablaufs - \item Starke Abhängigkeiten zwischen Teilergebnissen - \item Ungeeignet, falls Anforderungen zu Beginn unklar - \item Unflexibel gegenüber Änderungen - \item Erst sehr spät greifbare Ergebnisse - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Abhängigkeiten zwischen Teilergebnissen + \item Ursprung in System- Hardwareentwicklung + \begin{itemize*} + \item Wurde für die SW-Entwicklung übernommen + \item Auch heute verbreitetes Vorgehen bei HW-Entwicklung + \end{itemize*} + \item Sequenzielles Phasenmodell (Abschluss der Phasen) + \item Stark Dokumentengetrieben (Ergebnisse der Phasen) + \item Unterteilung in abgeschlossene Phasen: + \begin{itemize*} + \item Analyse + \item Design/Entwurf + \item Implementierung + \item Test \& Integration + \item Einführung, Betrieb \& Wartung + \end{itemize*} + \item Alternativ: + \begin{itemize*} + \item Planung + \item Definition + \item Entwurf + \item Implementierung + \item Test \& Integration + \item Einsatz und Wartung + \end{itemize*} + \item Vorteile + \begin{itemize*} + \item Einfach und verständlich, bekannt und verbreitet + \item Erleichterte Planung und Steuerung + \end{itemize*} + \item Nachteile + \begin{itemize*} + \item Idealisierte Annahme rein sequentiellen Ablaufs + \item Starke Abhängigkeiten zwischen Teilergebnissen + \item Ungeeignet, falls Anforderungen zu Beginn unklar + \item Unflexibel gegenüber Änderungen + \item Erst sehr spät greifbare Ergebnisse + \end{itemize*} + \end{itemize*} \item Erweitertes Wasserfallmodell - \begin{itemize*} - \item Verbesserung für Änderungen und Fehler - Rückschritte - \end{itemize*} + \begin{itemize*} + \item Verbesserung für Änderungen und Fehler - Rückschritte + \end{itemize*} \item Alternative Arten von Phasenmodellen - \begin{itemize*} - \item Sequenziell - \begin{itemize*} - \item Phasen strikt nacheinander, Dokumenten-orientiert - \item Keine Änderungen abgeschlossener Artefakte - \end{itemize*} - \item Nebenläufig - \begin{itemize*} - \item Phasen laufen teilweise parallel für bessere Zeitnutzung - \item Weiterhin keine Änderungen fertiger Dokumente - \end{itemize*} - \item Inkrementell - \begin{itemize*} - \item Unterteilung des Produkts in Teile - \item Schnellere Auslieferung von Teilfunktionalität nach vollständiger Aufnahme der Anforderungen - \end{itemize*} - \item Alternative: Evolutionär - \begin{itemize*} - \item Anforderungen entwickeln sich im Projekt - \item Ausgelieferte Versionen ergeben neue Anforderungen - \end{itemize*} - \item V-Modell [Boehm] - \begin{itemize*} - \item Explizite Adressierung der Qualitätssicherung - %\item %![VModell](Assets/Softwaretechnik1_VModell.png) - \item Entwicklung des V-Modells in Deutschland - \begin{itemize*} - \item Leitfaden, in Bundesbehörden ab 1990er verbindlich - \item Version V-Modell 97 erweitert um Werkzeuganforderungen, Rollen und Submodelle der Beteiligten - \item Kritik: schlecht skalier\item und anpassbar, zu unflexibel, - \item bürokratisch, nicht an moderner OO-SWEntw. orientiert - \end{itemize*} - \item V-Modell XT (extreme tailoring) - \begin{itemize*} - \item Aktuelle Version ab 2004/05 - \item Einfache projektspezifische Anpassbarkeit - \item Assistent www.v-modell-xt.de (kleines Projekt ~40 Dok.!) - \item Überprüfbarer Projektfortschritt - \item AG/AN-Sichten und Schnittstellen, Ausschreibungen - \item Gesamter SW-Lebenszyklus - \end{itemize*} - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Sequenziell + \begin{itemize*} + \item Phasen strikt nacheinander, Dokumenten-orientiert + \item Keine Änderungen abgeschlossener Artefakte + \end{itemize*} + \item Nebenläufig + \begin{itemize*} + \item Phasen laufen teilweise parallel für bessere Zeitnutzung + \item Weiterhin keine Änderungen fertiger Dokumente + \end{itemize*} + \item Inkrementell + \begin{itemize*} + \item Unterteilung des Produkts in Teile + \item Schnellere Auslieferung von Teilfunktionalität nach vollständiger Aufnahme der Anforderungen + \end{itemize*} + \item Alternative: Evolutionär + \begin{itemize*} + \item Anforderungen entwickeln sich im Projekt + \item Ausgelieferte Versionen ergeben neue Anforderungen + \end{itemize*} + \item V-Modell [Boehm] + \begin{itemize*} + \item Explizite Adressierung der Qualitätssicherung + %\item %![VModell](Assets/Softwaretechnik1_VModell.png) + \item Entwicklung des V-Modells in Deutschland + \begin{itemize*} + \item Leitfaden, in Bundesbehörden ab 1990er verbindlich + \item Version V-Modell 97 erweitert um Werkzeuganforderungen, Rollen und Submodelle der Beteiligten + \item Kritik: schlecht skalier\item und anpassbar, zu unflexibel, + \item bürokratisch, nicht an moderner OO-SWEntw. orientiert + \end{itemize*} + \item V-Modell XT (extreme tailoring) + \begin{itemize*} + \item Aktuelle Version ab 2004/05 + \item Einfache projektspezifische Anpassbarkeit + \item Assistent www.v-modell-xt.de (kleines Projekt ~40 Dok.!) + \item Überprüfbarer Projektfortschritt + \item AG/AN-Sichten und Schnittstellen, Ausschreibungen + \item Gesamter SW-Lebenszyklus + \end{itemize*} + \end{itemize*} + \end{itemize*} \end{itemize*} @@ -3719,81 +3050,81 @@ Unified Process \begin{itemize*} \item Vorgehensmodelle zur objektorientierten Softwareentwicklung - \begin{itemize*} - \item Ivar Jacobson, Grady Booch and James Rumbaugh: The Unified Software Development Process, (Rational/IBM), 1999 - \end{itemize*} + \begin{itemize*} + \item Ivar Jacobson, Grady Booch and James Rumbaugh: The Unified Software Development Process, (Rational/IBM), 1999 + \end{itemize*} \item Phasen der Entwicklung - \begin{itemize*} - \item Anfang, Ausarbeitung, Erstellung, Überleitung - \item Unterteilung in Iterationen - \item Definition von Meilensteinen - \end{itemize*} + \begin{itemize*} + \item Anfang, Ausarbeitung, Erstellung, Überleitung + \item Unterteilung in Iterationen + \item Definition von Meilensteinen + \end{itemize*} \item Definition von Kernprozessen, die in den Phasen ablaufen - \begin{itemize*} - \item Geschäftsprozessmodellierung, Anforderungsanalyse, Analyse \& Design, Implementierung, Test, Auslieferung - \item In unterschiedlichen Anteilen parallel ablaufend! - \end{itemize*} + \begin{itemize*} + \item Geschäftsprozessmodellierung, Anforderungsanalyse, Analyse \& Design, Implementierung, Test, Auslieferung + \item In unterschiedlichen Anteilen parallel ablaufend! + \end{itemize*} \end{itemize*} Prinzipieller Ablauf des Unified Process %![Unified Process](Assets/Softwaretechnik1_UnifiedProcess.png) \begin{itemize*} \item Haupteigenschaften des UP - \begin{itemize*} - \item Inkrementell, iterativ, evolutionär - \item Anwendungsgetrieben - \item Architekturzentriert - \item Risikoorientiert - \item Ereignisorientiert - \item Nutzt die UML als Notationssprache - \item Erweiterbar / Anpassbar - \end{itemize*} + \begin{itemize*} + \item Inkrementell, iterativ, evolutionär + \item Anwendungsgetrieben + \item Architekturzentriert + \item Risikoorientiert + \item Ereignisorientiert + \item Nutzt die UML als Notationssprache + \item Erweiterbar / Anpassbar + \end{itemize*} \item Verbreitete Vertreter - \begin{itemize*} - \item Rational Unified Process - RUP (Rational / IBM) - \item Open Unified Process - OpenUP (Eclipse Foundation) - \item Object Engineering Process - OEP (oose GmbH) - \end{itemize*} + \begin{itemize*} + \item Rational Unified Process - RUP (Rational / IBM) + \item Open Unified Process - OpenUP (Eclipse Foundation) + \item Object Engineering Process - OEP (oose GmbH) + \end{itemize*} \item Vorteile - \begin{itemize*} - \item Vorteile der Eigenschaften (iterativ, inkrementell, anpassbar, ...) - \item Berücksichtigung des Risikos - \item Passend für objektorientiertes Paradigmas und UML - \item Tool-Unterstützung - \item Reaktion auf Änderungen möglich - \item Industriestandard - \end{itemize*} + \begin{itemize*} + \item Vorteile der Eigenschaften (iterativ, inkrementell, anpassbar, ...) + \item Berücksichtigung des Risikos + \item Passend für objektorientiertes Paradigmas und UML + \item Tool-Unterstützung + \item Reaktion auf Änderungen möglich + \item Industriestandard + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Hoher Bürokratischer Aufwand -> Tailoring notwendig! - \item Relativ hohe „Lernkurve“ aller Beteiligten - \item Keine schnelle Reaktion auf Änderungen - \item Keine integrierte Qualitätssicherung - \end{itemize*} + \begin{itemize*} + \item Hoher Bürokratischer Aufwand $\rightarrow$ Tailoring notwendig! + \item Relativ hohe „Lernkurve“ aller Beteiligten + \item Keine schnelle Reaktion auf Änderungen + \item Keine integrierte Qualitätssicherung + \end{itemize*} \end{itemize*} \subsection{Agile Methoden} \begin{itemize*} \item Ausgangspunkt - \begin{itemize*} - \item Ziv's Unsicherheitsprinzip des Software Engineering: "Unsicherheit ist im Software-Entwicklungsprozess und den Produkten inhärent und unvermeidlich." (Ziv, 1996) - \item Humphrey's Prinzip der Anforderungsunsicherheit: "In einem neuen Software System werden die Anforderungen solange nicht komplett bekannt sein, bis die Anwender damit arbeiten." (Humphrey, 1995) - \item Wegner's Lemma: "Es ist unmöglich, ein interaktives System komplett zu spezifizieren." (Wegner, 1995) - \end{itemize*} + \begin{itemize*} + \item Ziv's Unsicherheitsprinzip des Software Engineering: "Unsicherheit ist im Software-Entwicklungsprozess und den Produkten inhärent und unvermeidlich." (Ziv, 1996) + \item Humphrey's Prinzip der Anforderungsunsicherheit: "In einem neuen Software System werden die Anforderungen solange nicht komplett bekannt sein, bis die Anwender damit arbeiten." (Humphrey, 1995) + \item Wegner's Lemma: "Es ist unmöglich, ein interaktives System komplett zu spezifizieren." (Wegner, 1995) + \end{itemize*} \item Ziele - \begin{itemize*} - \item geringer bürokratischer Aufwand - \item Hauptziel ist die Softwareentwicklung - \item nur wenige Regeln bzw. Verhalten definiert - \item sehr flexibel gehaltenes Vorgehen - \item stark Anwendungs- und Ereignisorientiert - \item iterativ / inkrementell / evolutionär - \item sehr schnelle Entwicklungsiterationen - \item meist Architekturzentriert - \item auch testgetriebenes Vorgehen möglich - \item Berücksichtigung sozialer Aspekte - \item Softwareentwicklung: Kreative Arbeit von Kreativen - \end{itemize*} + \begin{itemize*} + \item geringer bürokratischer Aufwand + \item Hauptziel ist die Softwareentwicklung + \item nur wenige Regeln bzw. Verhalten definiert + \item sehr flexibel gehaltenes Vorgehen + \item stark Anwendungs- und Ereignisorientiert + \item iterativ / inkrementell / evolutionär + \item sehr schnelle Entwicklungsiterationen + \item meist Architekturzentriert + \item auch testgetriebenes Vorgehen möglich + \item Berücksichtigung sozialer Aspekte + \item Softwareentwicklung: Kreative Arbeit von Kreativen + \end{itemize*} \end{itemize*} Das Agile Manifest (2001) @@ -3810,142 +3141,142 @@ \item Kleine Teams 5-8 Personen \item Definition von Richtlinien, Werten und Prinzipien \item Beispiele für Werte - \begin{itemize*} - \item Kommunikation (Kommunikation statt Dokumentation) - \item Einfachheit (KISS „Keep it small and simple“) - \item Feedback - \item Mut - \item Respekt - \end{itemize*} + \begin{itemize*} + \item Kommunikation (Kommunikation statt Dokumentation) + \item Einfachheit (KISS „Keep it small and simple“) + \item Feedback + \item Mut + \item Respekt + \end{itemize*} \item Beispiele für Prinzipien - \begin{itemize*} - \item Beidseitiger Vorteil - \item Fehlschläge hinnehmen - \item Ständige Verbesserungen - \item Ständige Lauffähigkeit des Codes - \item Kleine Schritte - \item Wiederverwendung bestehender / bewährter Lösungen - \end{itemize*} + \begin{itemize*} + \item Beidseitiger Vorteil + \item Fehlschläge hinnehmen + \item Ständige Verbesserungen + \item Ständige Lauffähigkeit des Codes + \item Kleine Schritte + \item Wiederverwendung bestehender / bewährter Lösungen + \end{itemize*} \item Beispiele für Praktiken - \begin{itemize*} - \item Pair-Programing, Coding Rules - \item Kollektives Eigentum / Gemeinsamer Codebesitz - \item Testgetriebene Entwicklung - \item Ständiges Refactoring - \item Keine Überstunden - \end{itemize*} + \begin{itemize*} + \item Pair-Programing, Coding Rules + \item Kollektives Eigentum / Gemeinsamer Codebesitz + \item Testgetriebene Entwicklung + \item Ständiges Refactoring + \item Keine Überstunden + \end{itemize*} \item Vorteile agiler Methoden - \begin{itemize*} - \item Geringer bürokratischer Aufwand - \item Besseres Arbeitsklima (Berücksichtigung Sozialer Aspekte) - \item Ständige Verfügbarkeit einer lauffähigen Version - \item Mögliche / nötige Einflussnahme des Kunden - \item „Freie“ Wahl der Prinzipien/Regeln - \item Vermeidung von Spezialistentum und individuellem Besitz - \end{itemize*} + \begin{itemize*} + \item Geringer bürokratischer Aufwand + \item Besseres Arbeitsklima (Berücksichtigung Sozialer Aspekte) + \item Ständige Verfügbarkeit einer lauffähigen Version + \item Mögliche / nötige Einflussnahme des Kunden + \item „Freie“ Wahl der Prinzipien/Regeln + \item Vermeidung von Spezialistentum und individuellem Besitz + \end{itemize*} \item Nachteile - \begin{itemize*} - \item Schwierigeres Projektmanagement - \begin{itemize*} - \item Chaotische Vorgehen - \item Schwere Planbarkeit des Ergebnisses - \end{itemize*} - \item Notwendige Beteiligung des Kunden - \item Ergebnis ist schwer vorherzusagen - \end{itemize*} + \begin{itemize*} + \item Schwierigeres Projektmanagement + \begin{itemize*} + \item Chaotische Vorgehen + \item Schwere Planbarkeit des Ergebnisses + \end{itemize*} + \item Notwendige Beteiligung des Kunden + \item Ergebnis ist schwer vorherzusagen + \end{itemize*} \end{itemize*} \paragraph{eXtreme Programming (XP)} \begin{itemize*} \item Beck 1999, aus Kritik an „monumentalen Modellen“ \item Evolutionäre Entwicklung in kleinen Schritten - \begin{itemize*} - \item Möglichst einfaches Design - \end{itemize*} + \begin{itemize*} + \item Möglichst einfaches Design + \end{itemize*} \item Konzentration auf Programmcode als Analyseergebnis, Entwurfsdokument und Dokumentation \item Weglassen von explizitem Design, ausführlicher Dokumentation und Reviews \item Code wird permanent lauffähig gehalten (täglich) \item Schnell und flexibel \item Erfordert Disziplin der Teilnehmer \item Rollen: Projektleiter, Kunde (verfügbar), Entwickler - \begin{itemize*} - \item Max. 5-10 Entwickler - \end{itemize*} + \begin{itemize*} + \item Max. 5-10 Entwickler + \end{itemize*} \item Kunde bestimmt Anforderung und Prioritäten - \begin{itemize*} - \item planning game; story cards (use cases) - \end{itemize*} + \begin{itemize*} + \item planning game; story cards (use cases) + \end{itemize*} \item Implementierung in kleinen Schritten - \begin{itemize*} - \item pair programming, collective code ownership - \item Häufige Releases inkl. Integration - \item Refactoring bei Designänderungen - \item Programmier-Konventionen - \end{itemize*} + \begin{itemize*} + \item pair programming, collective code ownership + \item Häufige Releases inkl. Integration + \item Refactoring bei Designänderungen + \item Programmier-Konventionen + \end{itemize*} \item Regelmäßiges automatisiertes Testen - \begin{itemize*} - \item test-first Ansatz - \end{itemize*} + \begin{itemize*} + \item test-first Ansatz + \end{itemize*} \item Morgendliches Meeting im Stehen ohne Diskussionen \item 40h-Woche \item XP - \begin{itemize*} - \item Sammlung von 12 "best practices" - \item Test-getrieben - \item Flexibel, effizient - \item Kleine Teams - \item Erfordert Disziplin der Teilnehmer - %\item %![XP](Assets/Softwaretechnik1_XP.png) - \end{itemize*} + \begin{itemize*} + \item Sammlung von 12 "best practices" + \item Test-getrieben + \item Flexibel, effizient + \item Kleine Teams + \item Erfordert Disziplin der Teilnehmer + %\item %![XP](Assets/Softwaretechnik1_XP.png) + \end{itemize*} \end{itemize*} \paragraph{Scrum} \begin{itemize*} \item [Ken Schwaber, Jeff Sutherland und Mike Beedle] \item Haupteigenschaften - \begin{itemize*} - \item Iterativ / Inkrementell, Evolutionär - \item stark Anwendungs- und Ereignisorientiert - \item schnelle Entwicklungsiterationen - \end{itemize*} + \begin{itemize*} + \item Iterativ / Inkrementell, Evolutionär + \item stark Anwendungs- und Ereignisorientiert + \item schnelle Entwicklungsiterationen + \end{itemize*} \item Sprint - \begin{itemize*} - \item eine schnelle Iteration: Dauer ca. 30 Tage - \item Festlegung welche Features umgesetzt werden - \end{itemize*} + \begin{itemize*} + \item eine schnelle Iteration: Dauer ca. 30 Tage + \item Festlegung welche Features umgesetzt werden + \end{itemize*} \item Product Backlog - \begin{itemize*} - \item Liste der gewünschten Features des Produkts - \item Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt - \item Jeder kann Einträge beisteuern - \end{itemize*} + \begin{itemize*} + \item Liste der gewünschten Features des Produkts + \item Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt + \item Jeder kann Einträge beisteuern + \end{itemize*} \item Rollen - \begin{itemize*} - \item Product Owner - \begin{itemize*} - \item Erfasst Bedürfnisse der Kunden und Stakeholder - \item Pflegt Backlog, definiert, priorisiert Features pro Sprint - \end{itemize*} - \item Scrum Master - \begin{itemize*} - \item Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings - \item Schützt das Team vor äußeren Störungen - \item Repräsentiert Team gegenüber Management - \end{itemize*} - \item Scrum Team (ca. 5-9 Personen) - \begin{itemize*} - \item Team organisiert sich und die Aufgaben selbst - \item Team bedeutet: Zielgerichtet und funktionsübergreifend arbeiten, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Product Owner + \begin{itemize*} + \item Erfasst Bedürfnisse der Kunden und Stakeholder + \item Pflegt Backlog, definiert, priorisiert Features pro Sprint + \end{itemize*} + \item Scrum Master + \begin{itemize*} + \item Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings + \item Schützt das Team vor äußeren Störungen + \item Repräsentiert Team gegenüber Management + \end{itemize*} + \item Scrum Team (ca. 5-9 Personen) + \begin{itemize*} + \item Team organisiert sich und die Aufgaben selbst + \item Team bedeutet: Zielgerichtet und funktionsübergreifend arbeiten, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten + \end{itemize*} + \end{itemize*} \end{itemize*} Sprint Backlog \begin{itemize*} \item Für die aktuelle Iteration ausgewählte Aufgaben - \begin{itemize*} - \item Aufgabe nicht länger als 2 Tage Aufwand - \end{itemize*} + \begin{itemize*} + \item Aufgabe nicht länger als 2 Tage Aufwand + \end{itemize*} \item Team-Mitglieder wählen Tasks aus - keine Zuweisung \item Restaufwand wird täglich aktualisiert - Burndown Chart \item Team-Mitglied kann Tasks hinzufügen, löschen, ändern @@ -3965,19 +3296,19 @@ \begin{itemize*} \item Präsentation des Erreichten (Feature Demo) \item Product Owner, Kunde usw. geben Feedback - \begin{itemize*} - \item Neue Anforderungen hinzufügen / Neu priorisieren - \item Qualitätsansprüche ändern - \end{itemize*} + \begin{itemize*} + \item Neue Anforderungen hinzufügen / Neu priorisieren + \item Qualitätsansprüche ändern + \end{itemize*} \end{itemize*} Sprint-Retrospektive \begin{itemize*} \item Rückkopplungsschleife - \begin{itemize*} - \item Was war gut und was hat nicht funktioniert? - \item Was kann verbessert werden? - \end{itemize*} + \begin{itemize*} + \item Was war gut und was hat nicht funktioniert? + \item Was kann verbessert werden? + \end{itemize*} \item Nach jedem Sprint \item Diskussion der identifizierten Probleme \item Identifikation von wenigen „Action Items“ @@ -3986,124 +3317,125 @@ Burndown Chart \begin{itemize*} \item Darstellung der offenen und erledigten Aufwände / Tasks - %\item %![Burndown Chart](Assets/Softwaretechnik1_Burndownchart.png) + %\item %![Burndown Chart](Assets/Softwaretechnik1_Burndownchart.png) \end{itemize*} \subsection{Zusammenfassung} \begin{itemize*} \item Software-Entwicklungsmethode - \begin{itemize*} - \item Elemente - \begin{itemize*} - \item Darstellung - Notation und Semantik für Modelle, Diagrammtypen, Dokumentvorlagen (Artefakte) - \item Vorgehensmodell - Phasen, Arbeitsschritte - \item Verfahren - Regeln, Anweisungen, Aktivitäten (+Rollen) - \item Werkzeuge - \end{itemize*} - \item Industriestandards: RUP + UML - \item Öffentliche Auftraggeber: V-Modell - \item Firmenintern: eigene Varianten, evtl. projektabhängig - \item Weitere Themen - \begin{itemize*} - \item Reifegradbeurteilung CMMI, SPICE, ISO 9000 - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Elemente + \begin{itemize*} + \item Darstellung - Notation und Semantik für Modelle, Diagrammtypen, Dokumentvorlagen (Artefakte) + \item Vorgehensmodell - Phasen, Arbeitsschritte + \item Verfahren - Regeln, Anweisungen, Aktivitäten (+Rollen) + \item Werkzeuge + \end{itemize*} + \item Industriestandards: RUP + UML + \item Öffentliche Auftraggeber: V-Modell + \item Firmenintern: eigene Varianten, evtl. projektabhängig + \item Weitere Themen + \begin{itemize*} + \item Reifegradbeurteilung CMMI, SPICE, ISO 9000 + \end{itemize*} + \end{itemize*} \item Charakterisierung von Vorgehensmodellen - \begin{itemize*} - \item Sequenziell - \begin{itemize*} - \item Teilprozesse strikt nacheinander - \item Keine Änderungen abgeschlossener Artefakte - \end{itemize*} - \item Nebenläufig - \begin{itemize*} - \item Teilprozesse laufen teilweise parallel für bessere Zeitnutzung - \end{itemize*} - \item Dokumentgetrieben - \begin{itemize*} - \item Erstellung von Dokumenten (Artefakte) im Vordergrund - \item Festlegung der Dokumente pro Phase - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Sequenziell + \begin{itemize*} + \item Teilprozesse strikt nacheinander + \item Keine Änderungen abgeschlossener Artefakte + \end{itemize*} + \item Nebenläufig + \begin{itemize*} + \item Teilprozesse laufen teilweise parallel für bessere Zeitnutzung + \end{itemize*} + \item Dokumentgetrieben + \begin{itemize*} + \item Erstellung von Dokumenten (Artefakte) im Vordergrund + \item Festlegung der Dokumente pro Phase + \end{itemize*} + \end{itemize*} \item Charakterisierung von Vorgehensmodellen - \begin{itemize*} - \item Iterativ - \begin{itemize*} - \item Definition einer sich wiederholenden Abfolge von Teil-Prozessen bzw. Aktivitäten - \item Schnelles Wiederholen dieser Abfolgen - \end{itemize*} - \item Inkrementell - \begin{itemize*} - \item Definition und Kontrolle des Fortschritts pro Iteration - \item Kleine Erweiterungen - \end{itemize*} - \item Evolutionäres Vorgehen - \begin{itemize*} - \item Schnelle Prototypen - \item Lauffähiger Prototyp jederzeit vorhanden - \item Toolunterstützung (Versionierung) - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Iterativ + \begin{itemize*} + \item Definition einer sich wiederholenden Abfolge von Teil-Prozessen bzw. Aktivitäten + \item Schnelles Wiederholen dieser Abfolgen + \end{itemize*} + \item Inkrementell + \begin{itemize*} + \item Definition und Kontrolle des Fortschritts pro Iteration + \item Kleine Erweiterungen + \end{itemize*} + \item Evolutionäres Vorgehen + \begin{itemize*} + \item Schnelle Prototypen + \item Lauffähiger Prototyp jederzeit vorhanden + \item Toolunterstützung (Versionierung) + \end{itemize*} + \end{itemize*} \item Charakterisierung von Vorgehensmodellen - \begin{itemize*} - \item Ereignisorientiert - \begin{itemize*} - \item Schnelle Reaktion auf Anforderungsänderungen - \item Keine starre Abfolge von Tätigkeiten / Prozessen - \item Voraussetzung: Prozesse laufen parallel ab - \end{itemize*} - \item Architekturzentriert - \begin{itemize*} - \item Starke Gewichtung der Architektur - \item Verwendung von Modellen, Mustern und vorhandenem Wissen - \end{itemize*} - \item Anwendungsgetrieben - \begin{itemize*} - \item Orientierung an den Anwendungsfällen - \item Umsetzen, was einem Anwendungsfall zugeordnet werden kann - \item Anwender steht im Mittelpunkt (User Stories) - \end{itemize*} - \item Risikoorientiert - \begin{itemize*} - \item Risiko der Entwicklung wird in Planung berücksichtigt - \item Risiko- / Nutzen-Analyse - \end{itemize*} - \item Test- / Qualitätsgetrieben - \begin{itemize*} - \item Qualität steht im Vordergrund - \item Test wird während oder sogar vor der Implementierungs-phase erstellt - \end{itemize*} - \item Erweiterbar / Anpassbar (tailoring) - \begin{itemize*} - \item Nur Rahmen des Vorgehens festgelegt - \item Konkretes Vorgehen wird an die Bedürfnisse angepasst - \item Grundlegende Eigenschaft von Vorgehensmodellen - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Ereignisorientiert + \begin{itemize*} + \item Schnelle Reaktion auf Anforderungsänderungen + \item Keine starre Abfolge von Tätigkeiten / Prozessen + \item Voraussetzung: Prozesse laufen parallel ab + \end{itemize*} + \item Architekturzentriert + \begin{itemize*} + \item Starke Gewichtung der Architektur + \item Verwendung von Modellen, Mustern und vorhandenem Wissen + \end{itemize*} + \item Anwendungsgetrieben + \begin{itemize*} + \item Orientierung an den Anwendungsfällen + \item Umsetzen, was einem Anwendungsfall zugeordnet werden kann + \item Anwender steht im Mittelpunkt (User Stories) + \end{itemize*} + \item Risikoorientiert + \begin{itemize*} + \item Risiko der Entwicklung wird in Planung berücksichtigt + \item Risiko- / Nutzen-Analyse + \end{itemize*} + \item Test- / Qualitätsgetrieben + \begin{itemize*} + \item Qualität steht im Vordergrund + \item Test wird während oder sogar vor der Implementierungs-phase erstellt + \end{itemize*} + \item Erweiterbar / Anpassbar (tailoring) + \begin{itemize*} + \item Nur Rahmen des Vorgehens festgelegt + \item Konkretes Vorgehen wird an die Bedürfnisse angepasst + \item Grundlegende Eigenschaft von Vorgehensmodellen + \end{itemize*} + \end{itemize*} \item Softwareprojekt im Sommersemester - \begin{itemize*} - \item Auswahl aus 3 Vorgehensmodellen - \begin{itemize*} - \item Klassisches Vorgehen - \item Unified Process - \item Agiles Vorgehen - \end{itemize*} - \end{itemize*} + \begin{itemize*} + \item Auswahl aus 3 Vorgehensmodellen + \begin{itemize*} + \item Klassisches Vorgehen + \item Unified Process + \item Agiles Vorgehen + \end{itemize*} + \end{itemize*} \end{itemize*} + \newpage \section{Projektmanagement} Was ist ein Projekt? \begin{itemize*} \item Merkmale von Projekten - \begin{itemize*} - \item Zielgerichtetes Vorhaben - \item Einmaligkeit - \item Zeitliche, finanzielle und personelle Rahmenbedingungen - \item Abgrenzung zu anderen Vorhaben - \item Projektspezifische Organisation - \item Komplexität (Unterteilung in abhängige Teilaufgaben nötig) - \end{itemize*} + \begin{itemize*} + \item Zielgerichtetes Vorhaben + \item Einmaligkeit + \item Zeitliche, finanzielle und personelle Rahmenbedingungen + \item Abgrenzung zu anderen Vorhaben + \item Projektspezifische Organisation + \item Komplexität (Unterteilung in abhängige Teilaufgaben) + \end{itemize*} \item Unsicherheit vor allem in den Frühphasen \item Risiko durch unbekannte Aufgabe \end{itemize*} @@ -4112,18 +3444,15 @@ \begin{itemize*} \item Überbegriff für planende und durchsetzende Aktivitäten zur Vorbereitung und Durchführung eines Projekts \item Management des Problemlösungsprozesses - \begin{itemize*} - \item Nicht die Lösung selbst, eigene Disziplin - \end{itemize*} \item Aufgaben - \begin{itemize*} - \item Problemabgrenzung - \item Zielfestlegung, Ablaufplanung - \item Planung und Bereitstellung personeller, finanzieller und sachlicher Ressourcen - \item Führen der Projektgruppe und Koordination der Aktivitäten - \item Steuerung und Überwachung des Projektablaufes - \item Zum großen Teil Planungs- und Kommunikationsleistung! - \end{itemize*} + \begin{itemize*} + \item Problemabgrenzung + \item Zielfestlegung, Ablaufplanung + \item Planung und Bereitstellung personeller, finanzieller und sachlicher Ressourcen + \item Führen der Projektgruppe und Koordination der Aktivitäten + \item Steuerung und Überwachung des Projektablaufes + \item Zum großen Teil Planungs- und Kommunikationsleistung + \end{itemize*} \end{itemize*} \subsection{Projektplanung} @@ -4131,90 +3460,74 @@ \begin{itemize*} \item Zunächst wieder: Teile und Herrsche! \item Projektstruktur - \begin{itemize*} - \item Teilung der Projektaufgabe in Arbeitspakete (work packages) und darin enthaltenen Aktivitäten (activities) - \item Einteilung möglich anhand Produktstruktur, fachlicher Struktur oder Phasenmodell des Entwicklungsprozesses - \end{itemize*} + \begin{itemize*} + \item Teilung der Projektaufgabe in Arbeitspakete (work packages) und darin enthaltenen Aktivitäten (activities) + \item Einteilung anhand Produktstruktur, fachlicher Struktur oder Phasenmodell + \end{itemize*} \item Überblick weiterer Planungsaufgaben - \begin{itemize*} - \item Bestimmen der Abhängigkeiten - \item Ermitteln der nötigen Ressourcen - \item Schätzen der Aufwände - \item Zeitplan aufstellen - \item Meilensteine definieren - \end{itemize*} + \begin{itemize*} + \item Bestimmen der Abhängigkeiten + \item Ermitteln der nötigen Ressourcen + \item Schätzen der Aufwände + \item Zeitplan aufstellen + \item Meilensteine definieren + \end{itemize*} \end{itemize*} %![Projektstruktur](Assets/Softwaretechnik1_Projektstruktur.png) Ablaufplanung \begin{itemize*} - \item Abhängigkeiten (Anordnungsbeziehungen) zwischen Vorgängen A und B: 4 Möglichkeiten - \begin{itemize*} - \item Ende-Anfang (Normalfolge) - \begin{itemize*} - \item B kann begonnen werden, sobald A beendet worden ist - \end{itemize*} - \item Anfang-Anfang (Anfangsfolge) - \begin{itemize*} - \item B kann begonnen werden, sobald A begonnen worden ist - \end{itemize*} - \item Anfang-Ende (Sprungfolge) - \begin{itemize*} - \item B kann beendet werden, sobald A begonnen worden ist - \end{itemize*} - \item Ende-Ende (Endfolge) - \begin{itemize*} - \item B kann beendet werden, sobald A beendet worden ist - \end{itemize*} - \end{itemize*} + \item Abhängigkeiten zwischen Vorgängen A und B + \begin{itemize*} + \item Ende-Anfang (Normalfolge) + \begin{itemize*} + \item B kann begonnen werden, sobald A beendet worden + \end{itemize*} + \item Anfang-Anfang (Anfangsfolge) + \begin{itemize*} + \item B kann begonnen werden, sobald A begonnen worden + \end{itemize*} + \item Anfang-Ende (Sprungfolge) + \begin{itemize*} + \item B kann beendet werden, sobald A begonnen worden + \end{itemize*} + \item Ende-Ende (Endfolge) + \begin{itemize*} + \item B kann beendet werden, sobald A beendet worden + \end{itemize*} + \end{itemize*} \item Netzplantechnik - \begin{itemize*} - \item Planungsarten - \begin{itemize*} - \item Vorwärtsplanung (ab Startzeitpunkt) - \item Rückwärtsplanung (ab gewünschtem Projektende) - \end{itemize*} - \item Berechnete Daten für Vorgänge - \begin{itemize*} - \item Frühester und spätester Anfangszeitpunkt (FAZ / SAZ) - \item Frühester und spätester Endzeitpunkt (FEZ / SEZ) - \item Pufferzeiten, z.B. freier Puffer (Verzögerung ohne Verschiebung des Nachfolgers), Gesamtpuffer (Verzögerung ohne Gefährdung des Projektendes) - \item Notation unterschiedlich - \end{itemize*} - \item Allgemein - \begin{itemize*} - \item Kritischer Pfad (Verzögerung vergrößert Projektdauer) - \item Kritische Vorgänge: Teil des kritischen Pfades - \end{itemize*} - \end{itemize*} - \end{itemize*} - - Beispiel: - \begin{itemize*} - \item Arbeitspakete laut Pflichtenheft (z.B.: Use Case) - \item Aufgaben festlegen - \item Abhängigkeiten festlegen - \item Vorwärtsrechnung durchführen - \item Rückwärtsrechnung durchführen - \item Kritischer Pfad und Puffer finden - %\item %![Projektplanung](Assets/Softwaretechnik1_ProjektplanungBeispiel.png) + \begin{itemize*} + \item Planungsarten + \begin{itemize*} + \item Vorwärtsplanung (ab Startzeitpunkt) + \item Rückwärtsplanung (ab gewünschtem Projektende) + \end{itemize*} + \item Berechnete Daten für Vorgänge + \begin{itemize*} + \item Frühester und spätester Anfangszeitpunkt (FAZ/SAZ) + \item Frühester und spätester Endzeitpunkt (FEZ/SEZ) + \item Pufferzeiten, Gesamtpuffer + \item Notation unterschiedlich + \end{itemize*} + \item Allgemein + \begin{itemize*} + \item Kritischer Pfad: Verzögerung der Projektdauer + \item Kritische Vorgänge: Teil des kritischen Pfades + \end{itemize*} + \end{itemize*} \end{itemize*} Aufwandsschätzung \begin{itemize*} \item Aus Erfahrungswerten systematisiert \item Versuch, wichtige Einflussfaktoren zu erfassen - \begin{itemize*} - \item Metriken für Spezifikationen - \item Komplexität von Teilfunktionen - \item Menge der Funktionen - \item Anpassung durch individuelle Faktoren, z.B. abhängig von Erfahrung in der Projektorganisation - \end{itemize*} - \item Methoden - \begin{itemize*} - \item Function Point Analyse - \item CoCoMo - \end{itemize*} + \begin{itemize*} + \item Metriken für Spezifikationen + \item Komplexität von Teilfunktionen + \item Menge der Funktionen + \item Anpassung durch individuelle Faktoren + \end{itemize*} \end{itemize*} \paragraph{Function Point Analyse} @@ -4222,47 +3535,35 @@ \item Ursprung IBM Ende 1970er Jahre \item Funktionsumfang und Schwierigkeitsgrad von Software \item Verschiedene Verfahren - \begin{itemize*} - \item für Echtzeit- (Full Function Point Method) und „normale“ Software (Int. Function Point User Group, ISO14143) - \end{itemize*} - %\item %![FPA](Assets/Softwaretechnik1_FPA1.png) \item Jeweils Anzahl x Gewicht \item Summe aller Werte = Unadjusted Function Points (UFP) \item Function Points = UFP x EG \item Einflussgrad EG = 1 + 0.01 x SummeEinflussfaktoren \item Einflussfaktoren: Einfluss auf Anwendungsentwicklung - %\item %![FPA2](Assets/Softwaretechnik1_FPA2.png) + %\item %![FPA2](Assets/Softwaretechnik1_FPA2.png) \item Berechnung der Personen-Monate aus Erfahrungen vorangegangener Projekte - \begin{itemize*} - \item Aufwand, der von einer Person in einem Monat unter Idealbedingungen erledigt werden kann - \end{itemize*} + \begin{itemize*} + \item Aufwand, der von einer Person in einem Monat unter Idealbedingungen erledigt werden kann + \end{itemize*} \item Umrechnung mit Tabelle (nichtlinearer Verlauf) - %\item %![FPA3](Assets/Softwaretechnik1_FPA3.png) + %\item %![FPA3](Assets/Softwaretechnik1_FPA3.png) \end{itemize*} \paragraph{CoCoMo II} \begin{itemize*} \item Constructive Cost Model [Boehm2000] \item Ausgangspunkt: geschätzte Anzahl Zeilen Quellcode - \begin{itemize*} - \item SLOC, source lines of code (zB. aus UFP schätzen) - \end{itemize*} + \begin{itemize*} + \item SLOC, source lines of code (zB. aus UFP schätzen) + \end{itemize*} \item Aufwand Personen-Monate (PM) $PM = A * Size^E \prod_{i=1}^n EM$ mit $E=B+0,01*\sum_{j=1}^5 SF_j$ \item Faktoren $A=2.94$ und $B=0.91$ (anpassbare Koeffizienten) \item Effort multiplier $EM: n=6..16$, Tabelle nach Boehm - \begin{itemize*} - \item Beispiele: Komplexität, Wiederverwendbarkeit, ... - \item Werte $0,7 .. 3,0$ - \end{itemize*} \item Scale factor SF: Fünf Einflüsse auf Rentabilität der Softwareentwicklung \item Notwendige Entwicklungszeit (time to develop) $TDEV = C * PM^F$ mit $F = D + 0,2 * ( E - B )$ \item Faktoren $C=3,67$ und $D=0,28$, anpassbar \item Ressourcenplanung %![Ressourcenplanung](Assets/Softwaretechnik1_Ressourcenplanung.png) - \item Zeitplanung - \begin{itemize*} - \item Zeitplan aus Abhängigkeiten, Aufwänden und Ressourcen sowie festen Terminen - \item Darstellung als Gantt-Chart / Balkendiagramm - \end{itemize*} + \item Zeitplanung (Gantt-Chart / Balkendiagramm) \end{itemize*} \subsection{Projektdurchführung} @@ -4270,85 +3571,75 @@ \begin{itemize*} \item Teilnehmer: Personen, Rollen, Verantwortung, Teams \item Linienorganisation: - \begin{itemize*} - \item hierarchisch %![hierarchisch](Assets/Softwaretechnik1_Organisation_hierarchisch.png) - \item Matrixorganisation %![matrix](Assets/Softwaretechnik1_Organisation_matrix.png) - \item Reine Projektorganisation: Mitarbeiter werden aus Organisation herausgelöst und Projektleiter unterstellt - \end{itemize*} + \begin{itemize*} + \item hierarchisch %![hierarchisch](Assets/Softwaretechnik1_Organisation_hierarchisch.png) + \item Matrixorganisation %![matrix](Assets/Softwaretechnik1_Organisation_matrix.png) + \item Reine Projektorganisation: Mitarbeiter werden aus Organisation herausgelöst und Projektleiter unterstellt + \end{itemize*} \end{itemize*} Projektmanager - Rolle und Aufgaben \begin{itemize*} \item Planung, Start, Kontrolle und Beenden des Projekts \item Schnittstelle zur Umgebung des Projekts - \begin{itemize*} - \item Kunden, Unterauftragnehmer, interne Kontakte, Verträge - \end{itemize*} + \begin{itemize*} + \item Kunden, Unterauftragnehmer, interne Kontakte, Verträge + \end{itemize*} \item Team zusammenstellen und steuern - \begin{itemize*} - \item 5-7 Mitglieder gemischter Qualifikation - \item Team von äußeren Aufgaben abschirmen - \item Teilaufgaben definieren, vergeben und koordinieren - \item Fortschritt kontrollieren und Probleme beseitigen - \end{itemize*} + \begin{itemize*} + \item 5-7 Mitglieder gemischter Qualifikation + \item Team von äußeren Aufgaben abschirmen + \item Teilaufgaben definieren, vergeben und koordinieren + \item Fortschritt kontrollieren und Probleme beseitigen + \end{itemize*} \item Weitere Ressourcen bereitstellen \item Notwendige Planänderungen erkennen und reagieren - \item Wichtiger Dienstleister für den Projekterfolg \end{itemize*} Projektstart \begin{itemize*} \item Nach Abschluss der Planungsphase \item Festlegung von ... - \begin{itemize*} - \item Arbeitsstil und interne Organisation - \item Aufgabenverteilung und Themen-Verantwortung - \item Erste Aufgaben, Verantwortliche und Termine - \item Einigung über Meilensteine und Termine - \item Art und Termine der Projekttreffen - \item Informationen und Kommunikationswege - \item Technische Infrastruktur (Versionskontrollsystem, Entwicklungsumgebung, Dokumentverwaltung, Rechnerzugang, verwendete PM-Software usw.) - \end{itemize*} + \begin{itemize*} + \item Arbeitsstil und interne Organisation + \item Aufgabenverteilung und Themen-Verantwortung + \item Erste Aufgaben, Verantwortliche und Termine + \item Einigung über Meilensteine und Termine + \item Art und Termine der Projekttreffen + \item Informationen und Kommunikationswege + \item Technische Infrastruktur + \end{itemize*} \item Starttreffen des Projekts (kick-off meeting) \end{itemize*} Meetings / Projekttreffen \begin{itemize*} \item Regelmäßige Abstimmung der Projektteilnehmer - \begin{itemize*} - \item Außerdem zu wichtigen Meilensteinen - \end{itemize*} \item Inhalt und Ablauf: geplant (Tagesordnung), Moderator - \begin{itemize*} - \item Protokoll des letzten Treffens korrekt? - \item Aktueller Stand - \item Bericht über individuelle Aufgaben - \item Planung des nächsten Termins - \end{itemize*} + \begin{itemize*} + \item Aktueller Stand + \item Bericht über individuelle Aufgaben + \item Planung des nächsten Termins + \end{itemize*} \item Protokoll - \begin{itemize*} - \item Datum, Zeit, Ort, Teilnehmer, Moderator - \item Bezeichnung - \item Tagesordnung mit einzelnen Punkten - \item Kurz und knapp, neutral bei Diskussionen! - \end{itemize*} + \begin{itemize*} + \item Datum, Zeit, Ort, Teilnehmer, Moderator + \item Bezeichnung + \item Tagesordnung mit einzelnen Punkten + \item Kurz und knapp, neutral bei Diskussionen + \end{itemize*} \end{itemize*} Fortschrittskontrolle \begin{itemize*} - \item Meilensteine - \begin{itemize*} - \item Klar definiertes Zwischenresultat zur Beurteilung des Projektfortschritts - \item Beispiele: Feinentwurfsdokument fertiggestellt und an Auftraggeber übergeben oder Paket XYZ implementiert und fertig getestet - \end{itemize*} + \item Meilensteine: Klar definiertes Zwischenresultat zur Beurteilung des Projektfortschritts \item Besprechung in Projekttreffen - \begin{itemize*} - \item Besprechung des Status jedes Meilensteins / jeder Aufgabe - \item Welche Aufgaben sind bereits erledigt? - \item Welche Probleme sind aufgetreten / gelöst? - \item Verbleibender Aufwand - Terminverschiebung nötig? - \item Planung der nächsten Schritte (Aufgabe, Verantwortlicher, Termin) - \end{itemize*} + \begin{itemize*} + \item Besprechung des Status jedes Meilensteins / jeder Aufgabe + \item Welche Probleme sind aufgetreten / gelöst? + \item Verbleibender Aufwand - Terminverschiebung nötig? + \item Planung der nächsten Schritte (Aufgabe, Termin) + \end{itemize*} \end{itemize*} Meilenstein-Trendanalyse @@ -4356,28 +3647,25 @@ \item Technik zur Fortschrittskontrolle \item Überwachung des Projektfortschritts zur Erkennung von Terminverzögerungen \item Bei Verzögerungen: - \begin{itemize*} - \item Ressourcen erhöhen - \item Termine verschieben - \item Funktionen reduzieren - \end{itemize*} + \begin{itemize*} + \item Ressourcen erhöhen + \item Termine verschieben + \item Funktionen reduzieren + \end{itemize*} \end{itemize*} Wie viel Planung? \begin{itemize*} - \item Planung ist wichtig, aber nicht übertreiben! \item Aufwand und Detaillierungsgrad der Planung an Projektgröße und „echten“ Aufwand anpassen \item Pläne müssen sich ändern können! - \begin{itemize*} - \item Projekte sind einmalig und daher unvorhersehbar - \end{itemize*} + \item Projekte sind einmalig und daher unvorhersehbar \item Adaptiv planen: nächste Aufgaben genau, spätere grob \item Einsatz von Projektmanagement-Software \item Projektende - \begin{itemize*} - \item Abschlusstreffen - \item Bewertung von Ergebnis und Organisation - was kann in Zukunft besser gemacht werden? - \end{itemize*} + \begin{itemize*} + \item Abschlusstreffen + \item Bewertung von Ergebnis und Organisation + \end{itemize*} \end{itemize*} \end{multicols}