2278 lines
91 KiB
TeX
2278 lines
91 KiB
TeX
\documentclass[a4paper]{article}
|
||
\usepackage[ngerman]{babel}
|
||
\usepackage{multicol}
|
||
\usepackage{calc}
|
||
\usepackage{ifthen}
|
||
\usepackage[landscape]{geometry}
|
||
\usepackage{amsmath,amsthm,amsfonts,amssymb}
|
||
\usepackage{color,graphicx,overpic}
|
||
\usepackage{listings}
|
||
\usepackage[compact]{titlesec} %less space for headers
|
||
\usepackage{mdwlist} %less space for lists
|
||
\usepackage[utf8]{inputenc}
|
||
\usepackage{tikz}
|
||
\usepackage{pdflscape}
|
||
\usepackage{verbatim}
|
||
\usepackage[hidelinks,pdfencoding=auto]{hyperref}
|
||
\usepackage{fancyhdr}
|
||
\usepackage{lastpage}
|
||
\pagestyle{fancy}
|
||
\fancyhf{}
|
||
\fancyhead[L]{Softwaretechnik}
|
||
\fancyfoot[L]{\thepage/\pageref{LastPage}}
|
||
\renewcommand{\headrulewidth}{0pt} %obere Trennlinie
|
||
\renewcommand{\footrulewidth}{0pt} %untere Trennlinie
|
||
|
||
\pdfinfo{
|
||
/Title (Softwaretechnik - Cheatsheet)
|
||
/Creator (TeX)
|
||
/Producer (pdfTeX 1.40.0)
|
||
/Author (Robert Jeutter)
|
||
/Subject ()
|
||
}
|
||
% Information boxes
|
||
\newcommand*{\info}[4][16.3]{
|
||
\node [ annotation, #3, scale=0.65, text width = #1em, inner sep = 2mm ] at (#2) {
|
||
\list{$\bullet$}{\topsep=0pt\itemsep=0pt\parsep=0pt
|
||
\parskip=0pt\labelwidth=8pt\leftmargin=8pt
|
||
\itemindent=0pt\labelsep=2pt}
|
||
#4
|
||
\endlist
|
||
};
|
||
}
|
||
|
||
% This sets page margins to .5 inch if using letter paper, and to 1cm
|
||
% if using A4 paper. (This probably isn't strictly necessary.)
|
||
% If using another size paper, use default 1cm margins.
|
||
\ifthenelse{\lengthtest { \paperwidth = 11in}}
|
||
{ \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} }
|
||
{\ifthenelse{ \lengthtest{ \paperwidth = 297mm}}
|
||
{\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
|
||
{\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
|
||
}
|
||
|
||
% Redefine section commands to use less space
|
||
\makeatletter
|
||
\renewcommand{\section}{\@startsection{section}{1}{0mm}%
|
||
{-1ex plus -.5ex minus -.2ex}%
|
||
{0.5ex plus .2ex}%x
|
||
{\normalfont\large\bfseries}}
|
||
\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}%
|
||
{-1explus -.5ex minus -.2ex}%
|
||
{0.5ex plus .2ex}%
|
||
{\normalfont\normalsize\bfseries}}
|
||
\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}%
|
||
{-1ex plus -.5ex minus -.2ex}%
|
||
{1ex plus .2ex}%
|
||
{\normalfont\small\bfseries}}
|
||
\makeatother
|
||
|
||
% Don't print section numbers
|
||
\setcounter{secnumdepth}{0}
|
||
|
||
\setlength{\parindent}{0pt}
|
||
\setlength{\parskip}{0pt plus 0.5ex}
|
||
% compress space
|
||
\setlength\abovedisplayskip{0pt}
|
||
\setlength{\parskip}{0pt}
|
||
\setlength{\parsep}{0pt}
|
||
\setlength{\topskip}{0pt}
|
||
\setlength{\topsep}{0pt}
|
||
\setlength{\partopsep}{0pt}
|
||
\linespread{0.5}
|
||
\titlespacing{\section}{0pt}{*0}{*0}
|
||
\titlespacing{\subsection}{0pt}{*0}{*0}
|
||
\titlespacing{\subsubsection}{0pt}{*0}{*0}
|
||
|
||
\begin{document}
|
||
|
||
\raggedright
|
||
\begin{multicols}{3}\scriptsize
|
||
% multicol parameters
|
||
% These lengths are set only within the two main columns
|
||
%\setlength{\columnseprule}{0.25pt}
|
||
\setlength{\premulticols}{1pt}
|
||
\setlength{\postmulticols}{1pt}
|
||
\setlength{\multicolsep}{1pt}
|
||
\setlength{\columnsep}{2pt}
|
||
|
||
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*}
|
||
\item Verwendung von:
|
||
\begin{itemize*}
|
||
\item Abstraktion, Modelle, Notation, Simulation
|
||
\item Wiederverwendung:Muster, Komponenten, Framework
|
||
\end{itemize*}
|
||
\item Organisation
|
||
\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*}
|
||
\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
|
||
|
||
\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 setzt Verstehen voraus
|
||
\item ist nicht automatisierbar
|
||
\end{itemize*}
|
||
|
||
\subsection{Objektorientierung}
|
||
\begin{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*}
|
||
\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*}
|
||
|
||
\subsection{Unified Modeling Language}
|
||
\begin{itemize*}
|
||
\item Grafisches Beschreibungsmittel für Aspekte des Softwareentwurfs diskreter Systeme
|
||
\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
|
||
\end{itemize*}
|
||
|
||
Nachteile UML
|
||
\begin{itemize*}
|
||
\item UML ist in vielen Facetten nicht präzise festgelegt
|
||
\item Werkzeuge für Transformation, Analyse etc. fehlen noch
|
||
\item UML ist keine „kleine Sprache“: Lernaufwand notwendig
|
||
\item Komponenten sind nicht adäquat darstellbar
|
||
\end{itemize*}
|
||
|
||
\subsection{Klassische Modelle}
|
||
\begin{description*}
|
||
\item[Funktionen] Funktionsbaum, Blockschaltbild
|
||
\item[Daten] Data Dictionary, Entity Relationship Diagram
|
||
\item[Systemumgebung] Datenflussdiagramm
|
||
\item[Algorithmen] Entscheidungstabelle, Pseudocode, Programmablaufplan
|
||
\item[Dynamisches Verhalten] diskrete Zustände und atomare zustandübergänge; Zustandsautomat, Flow-Chart
|
||
\item[Objektorientierte Modelle] Klassendiagramme, UML
|
||
\item[Struktur] Klassen-, Objekt-, Komponenten-, Kompositions-Strukturdiagramm
|
||
\item[Verhalten] Use-Case-, Aktivitäts- und Zustandsdiagramms
|
||
\item[Interaktion] Sequenz-, Kommunikations-, Timing-Diagramm
|
||
\end{description*}
|
||
|
||
\paragraph{Use-Case-Diagramm}
|
||
\begin{itemize*}
|
||
\item Beschreiben Systemfunktion aus Benutzersicht (Was, nicht Wie)
|
||
\item Erste Anforderungsspezifikation (requirements)
|
||
\item Planbare Einheiten als Inkremente für die Entwicklung
|
||
\item Keine Modellierung eines Ablaufs!
|
||
\item Erstellen von Testfällen (test case generation)
|
||
\end{itemize*}
|
||
|
||
\paragraph{Klassendiagramm}
|
||
\begin{itemize*}
|
||
\item Modellierung der Struktur (Aufbau) eines Systems
|
||
\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 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 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
|
||
\item Zum Grobentwurf von Systemen
|
||
\item Löschen des Pakets bewirkt Löschen beinhalteter Elemente
|
||
\item Definition von Sichtbarkeit / Zugriffsrechte
|
||
\begin{itemize*}
|
||
\item '+' - public (default)
|
||
\item '-' - private
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\paragraph{Komponentendiagramm}
|
||
\begin{itemize*}
|
||
\item Strukturierung des Systems durch Komponenten
|
||
\item Komponente: Modulare, austauschbare Einheit (Substitution)
|
||
\item Modellierung der Abhängigkeiten zwischen Komponenten
|
||
\item Modellierung der inneren Struktur von Komponenten
|
||
\item Definition von Schnittstellen
|
||
\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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\paragraph{Kompositionsstrukturdiagramm}
|
||
\begin{itemize*}
|
||
\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 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 Use-Cases
|
||
\end{itemize*}
|
||
|
||
\paragraph{Interaktionsdiagramme}
|
||
\begin{itemize*}
|
||
\item Modellierung von Kommunikation \& Operationen
|
||
\item Sehr detaillierte Diagramme
|
||
\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}
|
||
\begin{itemize*}
|
||
\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)
|
||
\item Erzeugen/Zerstören von Lebenslinien
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\paragraph{Kommunikationsdiagramm}
|
||
\begin{itemize*}
|
||
\item Kommunikationsbeziehungen der Kommunikationspartner stehen
|
||
\item Welche Komponenten arbeiten zusammen $\rightarrow$ Funktion erfüllen
|
||
\end{itemize*}
|
||
|
||
\paragraph{Timing-Diagramm}
|
||
\begin{itemize*}
|
||
\item Genaue zeitliche Darstellung von Zustandsübergängen
|
||
\item Kommunikation abhängiger Zustandsautomaten
|
||
\item Modellierung einzelner Interaktion
|
||
\item Zeitlicher Verlauf senkrecht
|
||
\item Kommunikationspartner waagerecht (unsortiert)
|
||
\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 von endlichen Automaten (Zustandsmaschinen)
|
||
\item Modellierung von verteilten Systemen/parallelem Verhalten
|
||
\item Grundlage zur Codegenerierung
|
||
\end{itemize*}
|
||
|
||
Blockdiagramm
|
||
\begin{itemize*}
|
||
\item Klassisches Beschreibungsmittel für Systemaufbau
|
||
\item Nicht Teil von UML
|
||
\end{itemize*}
|
||
|
||
Konfigurationsdiagramm
|
||
\begin{itemize*}
|
||
\item meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten
|
||
\item Nicht Teil von UML
|
||
\end{itemize*}
|
||
|
||
Verteilungsdiagramm (UML deployment diagram)
|
||
\begin{itemize*}
|
||
\item Darstellung der Hardwaretopologie
|
||
\item Zuordnung von Artefakten zu Hardwareeinheiten (Knoten)
|
||
\item Kommunikationsverbindung und Abhängigkeiten zwischen Knoten
|
||
\item Relativ spät im Projekt Installation / Wartung des Systems
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\section{Analyse}
|
||
Funktionale Anforderungen - Was soll es tun?
|
||
\begin{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 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 Untersuchung der Projektrisiken bereits in der Analysephase
|
||
\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 Werden nicht umgesetzt
|
||
\item Schränken Lösungsraum ein
|
||
\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{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 |
|
||
%| Notation | Text | Text + (semi-) formales Modell |
|
||
%| Kommunikation | mit dem Kunden | zwischen Entwicklern |
|
||
%| Sichtweise | des Anwenders | äußere Systemaspekte |
|
||
%Vor allem: Kommunikationsleistung!
|
||
|
||
\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 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 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
|
||
\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 Modellierung}
|
||
\begin{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
|
||
\end{itemize*}
|
||
\item Eingangsdokumente (Lastenheft, Anforderungsspezifikation)
|
||
\item Typische Ergebnisse
|
||
\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 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
|
||
\item Use Case durch Interaktion verfeinern
|
||
\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 (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: 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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Dokumentation von Anforderungen}
|
||
\begin{itemize*}
|
||
\item Lastenheft
|
||
\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*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\section{Grobentwurf}
|
||
\begin{itemize*}
|
||
\item Entwurfsziele identifizieren
|
||
\item Grobe Systemstruktur festlegen (Architektur)
|
||
\item Zerlegung in Subsysteme, Spezifikation
|
||
\item Bewerten der Zerlegung anhand der Entwurfsziele
|
||
\item Schnittstellen festlegen
|
||
\end{itemize*}
|
||
|
||
\subsection{Systemzerlegung}
|
||
Kopplung/Abhängigkeiten von Subsystemen
|
||
\begin{itemize*}
|
||
\item Möglichst lose Kopplung
|
||
\begin{itemize*}
|
||
\item Änderungen haben geringe Auswirkungen
|
||
\item Erleichtert Wartbarkeit und Arbeitsteilung
|
||
\end{itemize*}
|
||
\item Mittel zur Verringerung
|
||
\begin{itemize*}
|
||
\item Zusätzliche Unterteilung in Subsysteme
|
||
\item Aber: dann größere Komplexität!
|
||
\end{itemize*}
|
||
\item Kopplungsarten
|
||
\begin{description*}
|
||
\item[Daten] vermeiden oder zentralisieren
|
||
\item[Schnittstellen] gegenseitiges Aufrufen
|
||
\item[Struktur] gemeinsame Elemente vermeiden über Paketgrenzen
|
||
\end{description*}
|
||
\end{itemize*}
|
||
|
||
Kohäsion (cohesion)
|
||
\begin{itemize*}
|
||
\item Maß für Zusammengehörigkeit der Elemente
|
||
\item hohe Kohäsion erleichtert Verständnis, Wartung und Anpassung
|
||
\item Mittel zum Erreichen hoher Kohäsion: Datenkapselung
|
||
\end{itemize*}
|
||
\begin{description*}
|
||
\item[Fan-in] Anzahl der Stellen, wo Kontrollfluss auf das betrachtete Modul M übergeht + 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{description*}
|
||
\begin{itemize*}
|
||
\item Heuristik Kopplung / Kohäsion
|
||
\begin{itemize*}
|
||
\item Hoher Fan-out bedeutet hohe Kopplung $\rightarrow$ minimieren
|
||
\item Hoher Fan-in kann auf geringe Kohäsion von M hindeuten
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Prinzipien des OO-Entwurfs
|
||
\begin{itemize*}
|
||
\item Keep it simple stupid (KISS)
|
||
\item Entwerfen nach Verantwortlichkeiten
|
||
\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 Schnitts. (viele kleine statt wenig große)
|
||
\item Umkehr der Abhängigkeiten (dependency inversion)
|
||
\end{itemize*}
|
||
\item Offen / Geschlossen Prinzip
|
||
\end{itemize*}
|
||
|
||
Symptome schlechten Designs
|
||
\begin{itemize*}
|
||
\item Starrheit (Änderungen schwer machbar)
|
||
\item Zerbrechlichkeit (Änderungen werfen Fehler)
|
||
\item Schlechte Wiederverwendbarkeit
|
||
\end{itemize*}
|
||
|
||
Wann ist ein Entwurf „gut“?
|
||
\begin{itemize*}
|
||
\item Korrekt (Anforderungen erfüllen)
|
||
\item Verständlich und präzise, gut dokumentiert
|
||
\item Anpassbar
|
||
\item Hohe Kohäsion innerhalb der Komponenten
|
||
\item Schwache Kopplung zwischen den Komponenten
|
||
\item Wiederverwendung
|
||
\item Kriterien gelten auf allen Ebenen des Entwurfs!
|
||
\end{itemize*}
|
||
|
||
\subsection{Architekturmodelle}
|
||
\begin{itemize*}
|
||
\item Definition Diagrammunabhängig: Meist Klassendiagramm
|
||
\item Ähnlich Semantik einer Klasse: Nur public-Attribute und Operationen
|
||
\item Definiert Verpflichtung zur Implementierung von
|
||
\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 Klasse realisiert alle Attribute und Operationen
|
||
\item Schnittstellen werden realisiert, nicht instanziiert
|
||
\item Schnittstelle kann von anderen Schnittstellen erben
|
||
\item Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen $\rightarrow$ Generalisierung verwenden
|
||
\item Wiederverwendung auf sehr hoher Abstraktionsstufe
|
||
\end{itemize*}
|
||
|
||
Schichten-Architektur (layers)
|
||
\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*}
|
||
|
||
Client-Server (Klient/Anbieter) Two-tier
|
||
\begin{itemize*}
|
||
\item Client (front-end): Benutzungsschnittstelle
|
||
\item Server (back-end): Datenhaltung, evtl. Fachlogik
|
||
\item Asynchroner Kontrollfluss
|
||
\item Aufteilung Funktionen Client / Server
|
||
\item Vorteile
|
||
\begin{itemize*}
|
||
\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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Pipes and Filters
|
||
\begin{itemize*}
|
||
\item Datenstrom- oder Kontrollflussorientiertes System
|
||
\item Kombination der Berechnungskomponenten nur vom Typ der Ein- und Ausgabedaten abhängig
|
||
\item Verwendung von globalen Steuerungskontrollstrukturen
|
||
\item Vorteile
|
||
\begin{itemize*}
|
||
\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
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Plug-In Architektur (Microkernel)
|
||
\begin{itemize*}
|
||
\item Stabile, schlanker verbreitete Standard-Anwendung (Kern)
|
||
\item Funktionalität durch Komponenten leicht erweiterbar sein
|
||
\item Dritte sollen Komponenten leicht erstellen können
|
||
\item Plugin-Manager verwaltet Komponenten: Laden, Entladen
|
||
\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 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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Model-View-Controller (MVC)
|
||
\begin{itemize*}
|
||
\item Erlauben Austausch von Anzeige- und Speichersystem
|
||
\begin{description*}
|
||
\item[Model] verwaltet Domänenwissen, Daten und Zustand; Datenbank
|
||
\item[View] Darstellung, Anzeige, GUI
|
||
\item[Controller] Steuerung der Interaktion, Nutzerbefehle
|
||
\end{description*}
|
||
\item Geeignet für interaktive Systeme
|
||
\item Daten enthält Kernfunktionalität, kapselt und speichert Daten
|
||
\item Sichten stellt die Daten in unterschiedlicher Art dar
|
||
\item Steuerung realisiert die Interaktion mit dem Benutzer, übernimmt die Eingaben vom View und ändert die Daten im Modell
|
||
\end{itemize*}
|
||
|
||
\subsection{Frameworks}
|
||
\begin{itemize*}
|
||
\item Menge von zusammengehörigen Klassen, für eine Problemfamilie
|
||
\item Wiederverwendung von Code, Architektur, Entwurfsprinzipien
|
||
\item Ähnliche Benutzungsschnittstelle
|
||
\item Klassifikation I
|
||
\begin{itemize*}
|
||
\item Anwendungs-Framework (application framework)
|
||
\item Bereichsspezifisches Framework (domain framework)
|
||
\item Infrastrukturgerüst (support framework)
|
||
\end{itemize*}
|
||
\item Klassifikation II
|
||
\begin{description*}
|
||
\item[Offene Programmgerüste] (white box) Erweiterbarkeit durch Vererbung und dynamische Bindung
|
||
\item[Geschlossene Programmgerüste] (black box) Erweiterbarkeit durch Definition von Schnittstellen für Module
|
||
\end{description*}
|
||
\item Webframeworks
|
||
\end{itemize*}
|
||
|
||
\subsection{Systemarchitektur und Verteilung}
|
||
\begin{itemize*}
|
||
\item Aufbau und Elemente der Ablaufumgebung, Hardware
|
||
\item Häufig enger Zusammenhang mit Softwarearchitektur
|
||
\item Besonders bei eingebetteten Systemen
|
||
\item Systemarchitektur hat Einfluss auf Softwarearchitektur
|
||
\end{itemize*}
|
||
|
||
\subsection{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
|
||
\end{itemize*}
|
||
\item Nebenläufigkeit auf Architekturebene
|
||
\begin{itemize*}
|
||
\item Threads , Prozesse, verteiltes System
|
||
\item Asynchroner Nachrichtenaustausch
|
||
\end{itemize*}
|
||
\item Einfluss auf Architektur / abhängig von Architektur
|
||
\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 Datenflussgesteuert (data flow architecture)
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Weitere Aufgaben beim Grobentwurf}
|
||
\begin{itemize*}
|
||
\item Entwurf einer persistenten Datenverwaltung (Datenbank)
|
||
\item Sicherheit
|
||
\begin{itemize*}
|
||
\item Zugriffskontrolle
|
||
\item Fehlertoleranz (Daten und Hardware)
|
||
\item Protokollfunktionen
|
||
\end{itemize*}
|
||
\item Kontrollfluss
|
||
\item Dokumentation
|
||
\begin{itemize*}
|
||
\item Verständlich aus Sicht des Lesers formulieren (Glossar)
|
||
\item Das Warum beschreiben (Entwurfsentscheidungen)
|
||
\item Annahmen, Voraussetzungen, Randbedingungen
|
||
\item Notation erklären oder Standards verwenden (UML)
|
||
\item Auf Zweckdienlichkeit prüfen, Reviews durchführen
|
||
\item Verschiedene Sichten für verschiedene Zielgruppen
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Schicht
|
||
\begin{itemize*}
|
||
\item Gruppe von Subsystemen in der Zerlegungshierarchie
|
||
\item Verwandte Dienste
|
||
\item Ähnlicher Abstraktionsgrad
|
||
\item Abhängigkeit nur von darunter liegenden!
|
||
\end{itemize*}
|
||
|
||
Repository (Depot, blackboard)
|
||
\begin{itemize*}
|
||
\item Zentrale Datenhaltung
|
||
\item Anwendungen tauschen Daten nur über Repository aus
|
||
\item Kontrollfluss z.B. über Signale oder Semaphore
|
||
\item Gut für datenintensive Verarbeitungsaufgaben geeignet
|
||
\end{itemize*}
|
||
|
||
Peer-to-peer
|
||
\begin{itemize*}
|
||
\item Gleichberechtigte Partner, Föderation
|
||
\item Verteilte kommunizierende Subsysteme
|
||
\item Orts- und Umgebungsunabhängigkeit
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\section{Feinentwurf}
|
||
Schließen der Lücke zwischen Grobentwurf und Implementierung
|
||
\begin{itemize*}
|
||
\item Identifizieren und Entwerfen von Klassen der Lösungsdomäne
|
||
\item Identifikation und Verwendung von Entwurfsmustern
|
||
\item Detaillierte Beschreibung der Klassen
|
||
\item Beschreibung von Schnittstellen
|
||
\item Iterativer Prozess!
|
||
\end{itemize*}
|
||
|
||
Objektorientierter Feinentwurf
|
||
\begin{itemize*}
|
||
\item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen)
|
||
\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*}
|
||
|
||
\subsection{Klassen- und Objektentwurf}
|
||
\begin{itemize*}
|
||
\item Klassen der Lösungsdomäne
|
||
\item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen
|
||
\item Entstehungsgründe
|
||
\begin{itemize*}
|
||
\item Architektur von Software und System
|
||
\item nichtfunktionale Anforderungen
|
||
\item Sichtbare Grenz- und Steuerungsobjekte werden schon in der Analyse identifiziert
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Responsibility-Driven Design
|
||
\begin{description*}
|
||
\item[Application] set of interacting objects
|
||
\item[Object] implementation of role(s)
|
||
\item[Role] set of related responsibilities
|
||
\item[Responsibility] obligation to perform a task or know information
|
||
\item[Collaboration] interaction of objects or roles
|
||
\item[Contract] agreement outlining collaboration terms
|
||
\end{description*}
|
||
|
||
Arten von Rollen
|
||
\begin{description*}
|
||
\item[Information holder] knows and provides information
|
||
\item[Structurer] maintains relationship between objects and information about relationships
|
||
\item[Service provider] performs work, offers computing services
|
||
\item[Coordinator] reacts to events by delegating tasks to others
|
||
\item[Controller] makes decisions and directs other’s actions
|
||
\item[Interfacer] transforms information and requests between system parts
|
||
\end{description*}
|
||
|
||
Hilfsmittel: CRC-Karten
|
||
\begin{itemize*}
|
||
\item Candidate (or class), Responsibility, Collaboration
|
||
\item Informelles Mittel zum Finden, Beschreiben und iterativen Verändern von Klassen
|
||
\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*}
|
||
\item Kohärenz: zusammengehörende Verantwortlichkeiten in einer Klasse konzentrieren!
|
||
\end{itemize*}
|
||
|
||
\subsection{Entwurfsprinzipien}
|
||
\begin{itemize*}
|
||
\item Kapselung
|
||
\begin{itemize*}
|
||
\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
|
||
\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!
|
||
\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
|
||
\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
|
||
\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 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*}
|
||
\item Verbesserung der Erweiterbarkeit: Abstrakte Schnittstellen einsetzen!
|
||
\end{itemize*}
|
||
|
||
Vererbung oder Assoziation
|
||
\begin{itemize*}
|
||
\item Schlüsselwort Vererbung: ist ein
|
||
\item Schlüsselwort Assoziation: besteht aus, ist Teil, hat,...
|
||
\item Vererbung: Unterscheidungsmerkmal definierbar (Diskriminator)
|
||
\item Vermeide Vererbung, wenn es Alternativen gibt
|
||
\item Mehrfachvererbung
|
||
\end{itemize*}
|
||
|
||
Abstrakte Klassen
|
||
\begin{itemize*}
|
||
\item Nur Unterklassen, keine Instanzen
|
||
\item Attribute in Unterklassen füllen
|
||
\end{itemize*}
|
||
|
||
Offen / Geschlossen-Prinzip
|
||
\begin{itemize*}
|
||
\item Erweiterbarkeit eines Entwurfs
|
||
\item Offen für Erweiterungen,
|
||
\begin{itemize*}
|
||
\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 (private)
|
||
\item Beschränkung der Erweiterbarkeit
|
||
\begin{itemize*}
|
||
\item Keine Einschränkungen der Funktionalität der Basisklasse!
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Liskovsches Ersetzungsprinzip
|
||
\begin{itemize*}
|
||
\item Wenn S eine Unterklasse von T ist, dann können Objekte des Typs T in einem Programm durch Objekte des Typs S ersetzt werden, ohne die Funktion des Programms zu verändern
|
||
\item Engere Definition als „ist-ein“-Beziehung
|
||
\item Kein unerwartetes Verhalten eines Objektes eines Subtyps
|
||
\item Methoden, die Objekte der Basisklasse erwarten, müssen auch mit Objekten der abgeleiteten Klasse funktionieren
|
||
\item Zusicherungen der Basisklasse müssen von der abgeleiteten Klasse erfüllt werden!
|
||
\end{itemize*}
|
||
|
||
Gesetz von Demeter (LoD)
|
||
\begin{itemize*}
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Ein Objekt sollte
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Entwurfsmodell Klassendiagramm}
|
||
\begin{itemize*}
|
||
\item Elemente des Klassendiagramms
|
||
\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*}
|
||
\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*}
|
||
\item Parameterlisten
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Schnittstellen}
|
||
\begin{itemize*}
|
||
\item Vereinbarung über Art des Aufrufs
|
||
\begin{itemize*}
|
||
\item Homogenität gleicher Funktionen
|
||
\item Spezifikation von Operationen
|
||
\item keine Implementierung, keine Attribute
|
||
\end{itemize*}
|
||
\item Schnittstellen in UML
|
||
\begin{itemize*}
|
||
\item Funktion ähnlich abstrakter Klasse
|
||
\item Meist für technische Aspekte
|
||
\end{itemize*}
|
||
\item Verträge („design by contract“)
|
||
\begin{itemize*}
|
||
\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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Protokollrollen - Dynamisches Verhalten von Schnittstellen
|
||
\begin{itemize*}
|
||
\item Ohne Sicht auf innere Implementierung
|
||
\item Protokoll = Kollaboration von Protokollrollen
|
||
\item Modell: Zustandsautomat
|
||
\item Beschreibung der Synchronisation von Objekten
|
||
\end{itemize*}
|
||
|
||
\subsection{Entwurfsmuster}
|
||
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*}
|
||
\item Arten von Entwurfsmustern
|
||
\begin{itemize*}
|
||
\item Erzeugungsmuster
|
||
\item Strukturmuster
|
||
\item Verhaltensmuster
|
||
\end{itemize*}
|
||
\item Erzeugungsmuster
|
||
\begin{description*}
|
||
\item[Factory Method] Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert
|
||
\item[Abstract Factory] Schnittstelle zur Erzeugung von Familien verwandter Objekte
|
||
\item[Prototype] Objekterzeugung durch Vorlage und Kopie
|
||
\item[Builder] Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen
|
||
\item[Singleton] Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet
|
||
\end{description*}
|
||
\end{itemize*}
|
||
|
||
Strukturmuster
|
||
\begin{description*}
|
||
\item[Adapter] Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle
|
||
\item[Bridge] Abstraktion (Schnittstelle) von Implementierung entkoppeln, um beide unabhängig zu ändern; Impl.-Klasse nur als Verweis
|
||
\item[Decorator] Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen)
|
||
\item[Facade] Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff
|
||
\item[Flyweight] Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand)
|
||
\item[Composite] Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden, Baumstruktur
|
||
\item[Proxy] kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt
|
||
\end{description*}
|
||
|
||
Verhaltensmuster
|
||
\begin{description*}
|
||
\item[Command] Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen)
|
||
\item[Observer] 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
|
||
\item[Visitor] Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird
|
||
\item[Interpreter] Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache
|
||
\item[Iterator] Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung
|
||
\item[Memento] Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können
|
||
\item[Template Method] Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden
|
||
\item[Strategy] Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte
|
||
\item[Mediator] 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
|
||
\item[State] Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt
|
||
\item[Chain of Responsibility] Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist
|
||
\end{description*}
|
||
|
||
Anwendung von Entwurfsmustern
|
||
\begin{itemize*}
|
||
\item Untersuche Anwendbarkeit und Konsequenzen
|
||
\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*}
|
||
\item Wähle anwendungsspezifische Namen für Operationen
|
||
\item Implementiere Operationen entsprechend den Verantwortlichkeiten und Kollaborationen des Musters
|
||
\end{itemize*}
|
||
|
||
\subsection{Klassenbibliotheken und Komponenten}
|
||
\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*}
|
||
\item Wird in Anwendung eingebunden (importiert), API
|
||
\item Objekte instanziieren oder Klassen ableiten
|
||
\item Meist passiv: Kontrollfluss wird von Anwendung gesteuert
|
||
\end{itemize*}
|
||
|
||
Komponentenbasierte Entwicklung
|
||
\begin{itemize*}
|
||
\item Bausteinorientierte Programmierung (component-ware)
|
||
\item Softwareentwicklung: Konstruktion aus vorgegebenen Bausteinen
|
||
\item Entsprechung für Wiederverwendung: Generische Bausteine (components)
|
||
\item Werkzeuggestützte bzw. grafische Kompositionsmechanismen
|
||
\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
|
||
\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
|
||
\item Sind nicht von Kopien ihrer selbst unterscheidbar
|
||
\item Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung
|
||
\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*}
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Dokumentation}
|
||
\begin{itemize*}
|
||
\item Möglichkeiten
|
||
\begin{itemize*}
|
||
\item Eigenständiges Dokument
|
||
\item Erweiterung des Lastenhefts / Grobkonzepts
|
||
\item Eingebettet in den Quellcode
|
||
\end{itemize*}
|
||
\item Inhalt
|
||
\begin{itemize*}
|
||
\item Ähnlich Grobkonzept
|
||
\item Zusätzlich detaillierte Modelle
|
||
\item Abwägungen des Objektentwurfs
|
||
\item Klassenschnittstellen
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\section{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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Konventionen und Werkzeuge}
|
||
\begin{description*}
|
||
\item[Klasse] (mit) Substantiv, „UpperCamelCase“
|
||
\item[Methode] (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“
|
||
\item[Attribut, Variable] (mit) Substantiv, „lowerCamelCase“
|
||
\item[Konstante] Nur Großbuchstaben, Worte mit "\_" zusammengesetzt
|
||
\end{description*}
|
||
|
||
Formatierungs-Richtlinien
|
||
\begin{itemize*}
|
||
\item Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit
|
||
\item Einheitliche Verwendung von Leerzeilen und Leerzeichen
|
||
\item Einheitliche Dateistruktur verwenden
|
||
\item Werkzeuge: source beautifier, oft in IDEs enthalten
|
||
\item Editor: syntax highlighting
|
||
\end{itemize*}
|
||
|
||
Änderungsfreundlicher Code
|
||
\begin{itemize*}
|
||
\item Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung
|
||
\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
|
||
\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*}
|
||
\item Übersichtliche Ausdrücke
|
||
\item Variablen möglichst lokal und immer private deklarieren
|
||
\item Wiederverwendung "äußerer" Namen vermeiden
|
||
\end{itemize*}
|
||
|
||
\subsection{Code-Qualität}
|
||
\begin{itemize*}
|
||
\item Portierbarer Code: ohne Änderungen in anderes System (Compiler, Betriebssystem, Rechner) übertragen kann
|
||
\item Implementierungsabhängiges Verhalten
|
||
\begin{itemize*}
|
||
\item Compiler übersetzen Sprachkonstrukte unterschiedlich
|
||
\item Verhalten ist konsistent festgelegt und dokumentiert
|
||
\item Kompilierung von standardkonformem Code ist erfolgreich
|
||
\item char kann signed oder unsigned sein: Nicht damit rechnen!
|
||
\end{itemize*}
|
||
\item Sicherer Code mit const
|
||
\begin{description*}
|
||
\item[Const Variable] Stellt sicher, dass sich der Wert nicht verändert
|
||
\item[Const Parameter] Übergabeparameter ändert sich nicht
|
||
\item[Const Operationen] Sicherstellen, dass Operation das Exemplar nicht ändert
|
||
\end{description*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Dokumentation}
|
||
\begin{description*}
|
||
\item[Integrierte] Dokumentation
|
||
\begin{itemize*}
|
||
\item Verständlichkeit, Wartbarkeit - auch für Programmierer!
|
||
\item Code selbst sollte möglichst verständlich sein
|
||
\item Dokumentation in Programm schreiben und aktualisieren
|
||
\item Beschreibung der Bedeutung des Codes!
|
||
\item Als Konventionen festschreiben
|
||
\item Programmvorspann
|
||
\item Kurzbeschreibung Datei / Klasse / Funktion ...
|
||
\item Verwaltungsinformationen
|
||
\item Laufende Kommentare im Quellcode
|
||
\end{itemize*}
|
||
\item[Programmierer] Dokumentation
|
||
\begin{itemize*}
|
||
\item Als eigenes Dokument elektronisch oder gedruckt
|
||
\item Einstieg in Programmverständnis (z.B. Bachelor-Arbeit)
|
||
\item Konsistenz mit Quelltext? Verweise?
|
||
\item Technische Unterstützung: JavaDoc (Java), doxygen (C++)
|
||
\item Ergänztes Java-Programm: Dokumentation HTML, PDF,
|
||
\end{itemize*}
|
||
\item[Benutzer] Dokumentation
|
||
\begin{itemize*}
|
||
\item Benutzer-Handbuch, Online-Dokumentation
|
||
\item Unterstützung ohne Support?
|
||
\item Vollständige und fehlerfreie Beschreibung der Benutzung
|
||
\item Arten: Tutorial, Beschreibung
|
||
\end{itemize*}
|
||
\end{description*}
|
||
|
||
\subsection{Codegenerierung}
|
||
\begin{itemize*}
|
||
\item Vorwärtsmodellierung: Modell - Code
|
||
\item Rückwärtsmodellierung: Code - Modell
|
||
\item Modelltransformation, Refaktorisierung
|
||
\item Idealfall: Automatische Übersetzung durch SW-Werkzeug
|
||
\item Statisch: Quelltext der Klassen mit Beziehungen, Attributen...
|
||
\item Dynamisch: Quelltext der Zustandssteuerung einer Klasse
|
||
\end{itemize*}
|
||
|
||
Optimierung des Entwurfsmodells
|
||
\begin{itemize*}
|
||
\item Zugriffspfade
|
||
\item Klassen in Attribute umwandeln
|
||
\item Verzögerung von Berechnungen
|
||
\item Zwischenspeicherung aufwändiger Ergebnisse
|
||
\end{itemize*}
|
||
|
||
Codegenerierung aus StateCharts
|
||
\begin{itemize*}
|
||
\item Einfachste Möglichkeit: Switch (Case) Statement
|
||
\item Zustände werden durch Datenwerte repräsentiert
|
||
\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
|
||
\end{itemize*}
|
||
|
||
Anpassung der Generierung
|
||
\begin{itemize*}
|
||
\item Verschiedene Zielsprachen (Java, C++, ...)
|
||
\item Model2Text-Transformationen
|
||
\item Generierung aus dem Modellierungswerkzeug
|
||
\end{itemize*}
|
||
|
||
\subsection{Implementierung aktiver Objekte}
|
||
Realisierung aktiver Entwurfsobjekte
|
||
\begin{itemize*}
|
||
\item Reagieren nicht nur (Methodenaufruf), sondern implementieren eigenes Verhalten
|
||
\item Aktive Klassen, z.B. Steuerobjekte
|
||
\end{itemize*}
|
||
|
||
Arten von Programmabarbeitung
|
||
\begin{description*}
|
||
\item[Sequentiell] es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt
|
||
\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 (concurrent)
|
||
\end{description*}
|
||
|
||
Vorteile
|
||
\begin{itemize*}
|
||
\item Höhere Geschwindigkeit
|
||
\item Kein aktives Warten auf Ereignisse
|
||
\item Getrennte Implementierung unabhängiger Aspekte
|
||
\end{itemize*}
|
||
|
||
Ergebnisse eines Programms
|
||
\begin{itemize*}
|
||
\item Ein Programm, dessen Ablauf eindeutig vorherbestimmt ist, nennt man deterministisch (deterministic)
|
||
\item Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert (determined)
|
||
\item Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert
|
||
\item Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt
|
||
\item Determiniertheit nebenläufiger Programme: Synchronisation
|
||
\end{itemize*}
|
||
|
||
\subsection{Verifikation und Testen}
|
||
Wie erreicht man qualitativ hochwertige Software?
|
||
\begin{itemize*}
|
||
\item Wissen, Erfahrung und Methodenkompetenz der Programmierer
|
||
\item Projektstruktur, klare Verantwortlichkeiten
|
||
\item Kosten- und Zeitdruck? Änderungen?
|
||
\item Programmier- und Testmethoden (pair programming, code reading)
|
||
\item Technische Unterstützung (Versionierung, Dokumentation, Testen)
|
||
\end{itemize*}
|
||
|
||
Begriffe
|
||
\begin{description*}
|
||
\item[Zuverlässigkeit] Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
|
||
\item[Unzuverlässigkeit] Fehler (bug, fault), fehlerhafter Programmcode
|
||
\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{description*}
|
||
|
||
\paragraph{Verifikation}
|
||
\begin{itemize*}
|
||
\item Mathematisch formaler Beweis genügt
|
||
\item Vorteil: wenn anwendbar, dann vollständiger Beweis
|
||
\item Problem: für viele (realistisch große) Fälle nicht anwendbar
|
||
\item Theoretische Informatik: Berechenbarkeitstheorie, Semantik
|
||
\end{itemize*}
|
||
|
||
Testen
|
||
\begin{itemize*}
|
||
\item Systematischer Versuch, Defekte in der Software zu finden
|
||
\item Ingenieurtechnik zur Erhöhung des Vertrauens
|
||
\item Aufgabe: Unterschiede zwischen Modell und System finden
|
||
\item Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben
|
||
\end{itemize*}
|
||
|
||
Testplanung
|
||
\begin{itemize*}
|
||
\item Testen ist aufwändig, deshalb ist gute Planung nötig!
|
||
\item Testplanung sollte bereits mit der Anforderungsanalyse beginnen
|
||
\item Typische Bestandteile einer Test-Spezifikation (Testdrehbuch)
|
||
\begin{itemize*}
|
||
\item Phasenmodell des Testprozesses
|
||
\item Zusammenhang zur Anforderungsspezifikation
|
||
\item Zu testende Produkte
|
||
\item Zeitplan für die Tests
|
||
\item Abhängigkeiten der Testphasen
|
||
\item Aufzeichnung der Testergebnisse
|
||
\item Hardware- und Softwareanforderungen
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\begin{description*}
|
||
\item[Komponententest] Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System
|
||
\item[Integrationstest] Zusammenspiel von Komponenten
|
||
\item[Systemtest] Vollständiges System; Szenarios
|
||
\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
|
||
\item[Akzeptanztest, Installationstest]: Kunde, Abnahme
|
||
\end{description*}
|
||
|
||
\begin{itemize*}
|
||
\item Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert
|
||
\begin{itemize*}
|
||
\item Teststumpf simuliert aufgerufene Komponenten
|
||
\item Testtreiber simuliert aufrufende Komponenten
|
||
\end{itemize*}
|
||
\item Vorgehensweisen: Bottom-up, Top-down, Sandwich, Schichtenweise
|
||
\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*}
|
||
\item Weitere Begriffe
|
||
\begin{itemize*}
|
||
\item Regressionstest: geänderte 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)
|
||
\begin{itemize*}
|
||
\item Testfallauswahl beruht auf Spezifikation
|
||
\item Ohne Wissen über inneren Aufbau
|
||
\item E/A-Zusammenhang
|
||
\end{itemize*}
|
||
|
||
Strukturtest (white box test, glass box test)
|
||
\begin{itemize*}
|
||
\item Testfallauswahl beruht auf Programmstruktur
|
||
\item Wie erreicht man möglichst vollständige Abdeckung?
|
||
\item Kontrollflussorientiert (Anweisungsüberdeckung anhand Quellcode)
|
||
\item Datenflussorientiert (Abarbeitungspfade von Definition)
|
||
\item Zustandsorientiert
|
||
\end{itemize*}
|
||
|
||
\subsection{Testaktivitäten und Werkzeuge}
|
||
\begin{itemize*}
|
||
\item Wann wird getestet? 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*}
|
||
\item Inkrementell, d.h. für jede überschaubare Änderung
|
||
\item Spezielle Vorgehensweise: test first-Ansatz
|
||
\item Wie wird getestet? Geplant, systematisch, möglichst automatisiert, dokumentiert, wiederholbar
|
||
\end{itemize*}
|
||
|
||
Testplanung
|
||
\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*}
|
||
\item Ergebnis: Inhalt des Testplans
|
||
\end{itemize*}
|
||
|
||
Testspezifikation
|
||
\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*}
|
||
\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*}
|
||
\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
|
||
\item Bereitstellung von Testdaten in die Testumgebung
|
||
\item Benutzer und Benutzerrechte anlegen
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Testdurchführung
|
||
\begin{itemize*}
|
||
\item Durchführung der spezifizierten Tests (Manuell/Automatisiert)
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Testauswertung
|
||
\begin{itemize*}
|
||
\item Überprüfung der Ergebnisse
|
||
\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
|
||
\item Fehler im Fehlermanagement eintragen (Bug report)
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
Bugbeschreibung
|
||
\begin{itemize*}
|
||
\item Möglichst genaue Beschreibung des Fehlers
|
||
\item Ziel ist die Reproduzierbarkeit des Fehlers
|
||
\item Zuordnung zu Projektplan: Meilenstein, Version
|
||
\item Fehlerklassifikation
|
||
\begin{description*}
|
||
\item[defect] Fehler in einer bestehenden Funktionalität
|
||
\item[enhancement/feature] Funktionale Anforderung (Erweiterung)
|
||
\item[task] Allgemeine Aufgabe
|
||
\end{description*}
|
||
\item Priorität festlegen
|
||
\begin{description*}
|
||
\item[blocker] Schwerwiegender Fehler, führt zur Arbeitsunfähigkeit anderer
|
||
\item[critical] Schwerer Fehler, grundlegende Funktionalität des Systems nicht gegeben
|
||
\item[major] normaler Fehler. System kann weiterhin verwendet werden
|
||
\item[minor] Kleiner Fehler, behindert nicht weiter die Funktionsfähigkeit des Systems
|
||
\item[trivial] Schönheitsfehler, stört während des Betrieb des Systems nicht.
|
||
\end{description*}
|
||
\end{itemize*}
|
||
|
||
Testabschluss
|
||
\begin{itemize*}
|
||
\item Zusammenfassen der Tests dokumentieren und kommunizieren
|
||
\item Entscheidungen herbeiführen
|
||
\begin{itemize*}
|
||
\item Ziele erreicht - nächste Schritte (Auslieferung)
|
||
\item Tests vorzeitig beenden oder unterbrechen
|
||
\item Gründe dokumentieren
|
||
\end{itemize*}
|
||
\item Unterlagen archivieren
|
||
\end{itemize*}
|
||
|
||
Testautomatisierung
|
||
\begin{itemize*}
|
||
\item Automatische Code-Validierung
|
||
\item Statisch: lint (C), Compiler
|
||
\item Dynamisch: run-time checking, memory leaks etc.
|
||
\end{itemize*}
|
||
|
||
Behebung funktionaler Fehler
|
||
\begin{itemize*}
|
||
\item Log-Ausschriften bzw. Signale
|
||
\item Debugger: Vorwärts / Rückwärts
|
||
\item Haltepunkte setzen: Bedingte Haltepunkte für Schleifen
|
||
\item Darstellung der Variablenbelegung, Werte setzen
|
||
\item Analyse des Aufruf-Stacks
|
||
\end{itemize*}
|
||
|
||
Behebung nichtfunktionaler Fehler
|
||
\begin{itemize*}
|
||
\item Geschwindigkeit: profiling z.B. mit Eclipse TPTP
|
||
\item Aufrufe, Zeitverbrauch in Methoden usw.
|
||
\end{itemize*}
|
||
|
||
Memory Leaks
|
||
\begin{itemize*}
|
||
\item Runtime heap summary: Welche Objekte verbrauchen Speicher?
|
||
\item Reference graph: Wer referenziert diese Objekte, so dass sie nicht per garbage collection gelöscht werden?
|
||
\end{itemize*}
|
||
|
||
\subsection{Softwareverteilung (deployment)}
|
||
\begin{itemize*}
|
||
\item Prozess zur Installation von Software auf PC‘s, Servern, Maschinen in Produktion
|
||
\item Steuerung der Installation der Software
|
||
\item Voraussetzungen für die Software schaffen
|
||
\begin{itemize*}
|
||
\item Schulungen planen und durchführen
|
||
\end{itemize*}
|
||
\item Softwareverteilung ist ein kritischer Prozess!
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Installationsarten
|
||
\begin{description*}
|
||
\item[Erstinstallation]
|
||
\item[Software-Update] Aktualisierung der Software, Daten oder Konfiguration
|
||
\item[Hotfixes/Service Packs] Nur bestimmte Teile der Software werden aktualisiert; Meist nur Fehlerbehebung, keine neuen Features
|
||
\item[Upgrade] Erweitert eine Software deutlich um neue Funktionen
|
||
\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*}
|
||
\end{description*}
|
||
|
||
Software-Rollout
|
||
\begin{itemize*}
|
||
\item Vorgang des Veröffentlichens und Verteilens
|
||
\item Rollout abhängig von verschiedenen Kriterien
|
||
\item Rollout-Varianten
|
||
\begin{itemize*}
|
||
\item Zentral / Dezentral
|
||
\item Manuell (Benutzer löst Installation aus)
|
||
\item Automatisiert (ohne Benutzerinteraktion)
|
||
\end{itemize*}
|
||
\item Verteilungsarten
|
||
\begin{description}
|
||
\item[Vollständige Verteilung] (big bang) Alle Installationen werden mit einem Mal installiert (Sehr hohes Risiko)
|
||
\item[Rollback] Wiederherstellung des Ursprungszustands
|
||
\item[Pilot] Einführung für wenige ausgewählte Installationen (Sehr hohe Sicherheit)
|
||
\item[Iterativ (schrittweise)] mit definierten Anzahl von Installationen bessere Reproduzierbarkeit
|
||
\end{description}
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\section{Vorgehensmodelle}
|
||
\begin{itemize*}
|
||
\item Methode zur Erstellung von Softwaresystemen
|
||
\item Systematisch, rational und schrittweise zur Lösung
|
||
\item Softwareentwicklungsprozess übersichtlich, plan- und strukturierbar
|
||
\item Zerlegung des Softwareentwicklungsprozesses in Einheiten
|
||
\item Unternehmensspezifisch, anpassbar, erweiterbar
|
||
\end{itemize*}
|
||
|
||
Phasen
|
||
\begin{itemize*}
|
||
\item Überwiegend zeitliche Zerlegung
|
||
\item Zeitlich begrenzte Phasen
|
||
\item Auch inhaltlich und organisatorisch begrenzte Phasen möglich
|
||
\item Teilprozesse / Aktivitäten
|
||
\end{itemize*}
|
||
|
||
Aufgabe
|
||
\begin{itemize*}
|
||
\item Erzeugt Arbeitsergebnis (Artefakt)
|
||
\item Verbraucht Ressourcen (z.B. Arbeitskraft, Zeit, Ausrüstung)
|
||
\end{itemize*}
|
||
|
||
Arbeitsergebnis (oder Artefakt)
|
||
\begin{itemize*}
|
||
\item Dokument, Modell, System, Programmcode, Lastenheft,...
|
||
\item Intern zu lieferndes Ergebnis
|
||
\end{itemize*}
|
||
|
||
Teilnehmer und Rollen
|
||
\begin{itemize*}
|
||
\item Verantwortungsbereich eines Teilnehmers (z.B. Kunde, Projektmanager, Entwickler, Architekt)
|
||
\item Rolle bearbeitet / enthält Satz von Aufgaben
|
||
\end{itemize*}
|
||
|
||
Unterstützungsprozesse / -Aktivitäten
|
||
\begin{description*}
|
||
\item[Projektmanagement] Projektplanung, -verfolgung und -steuerung, Risikomanagement
|
||
\item[Anforderungsmanagement] Im Gegensatz zur Anforderungsaufnahme und -analyse
|
||
\item[Qualitätsmanagement] Softwaremetriken, Statische + dynamische Analyse (Bestimmung von Schwachstellen)
|
||
\item[Konfigurationsmanagement] Versionsverwaltung, Änderungsmanagement
|
||
\item[Dokumentation]
|
||
\end{description*}
|
||
|
||
\subsection{Sequenzielle Modelle}
|
||
\begin{itemize*}
|
||
\item Wasserfallmodell
|
||
\begin{itemize*}
|
||
\item Abhängigkeiten zwischen Teilergebnissen
|
||
\item Ursprung in System- Hardwareentwicklung
|
||
\item Sequenzielles Phasenmodell (Abschluss der Phasen)
|
||
\item Stark Dokumentengetrieben (Ergebnisse der Phasen)
|
||
\item Unterteilung in abgeschlossene Phasen:
|
||
\begin{itemize*}
|
||
\item Analyse (Planung)
|
||
\item Design/Entwurf
|
||
\item Implementierung
|
||
\item Test \& Integration
|
||
\item Einführung, Betrieb \& Wartung
|
||
\end{itemize*}
|
||
\item Einfach und verständlich, bekannt und verbreitet
|
||
\item Starke Abhängigkeiten zwischen Teilergebnissen
|
||
\item Ungeeignet, falls Anforderungen zu Beginn unklar
|
||
\item Unflexibel gegenüber Änderungen
|
||
\end{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 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 Entwicklung des V-Modells in Deutschland
|
||
\item V-Modell XT (extreme tailoring)
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Iterative Modelle}
|
||
\begin{itemize*}
|
||
\item Spezifikation, Entwurf und Implementierung müssen immer wieder verändert und angepasst werden
|
||
\item Häufiges Integrieren, Validieren und Testen
|
||
\item Wenn möglich, sollte es immer einen lauffähigen (unvollständigen) Prototypen geben
|
||
\item Neue Funktionen sofort integrieren
|
||
\item Neue Versionen gegenüber Anforderungen Validieren
|
||
\end{itemize*}
|
||
|
||
Spiralmodell
|
||
\begin{itemize*}
|
||
\item Risikogetrieben: Größte Projektrisiken identifizieren und als erstes bearbeiten
|
||
\item Spirale = iterativer Zyklus durch dieselben Schritte
|
||
\item Ziele jedes Durchlaufs aus alten Ergebnissen ableiten
|
||
\item Regelmäßige Überprüfung des Prozessmodells
|
||
\item Hoher Management-Overhead, große Projekte
|
||
\end{itemize*}
|
||
|
||
Unified Process
|
||
\begin{itemize*}
|
||
\item Vorgehensmodelle zur objektorientierten Softwareentwicklung
|
||
\item Phasen der Entwicklung
|
||
\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*}
|
||
\item Variation
|
||
\begin{itemize*}
|
||
\item Inkrementell, iterativ, evolutionär
|
||
\item Anwendungsgetrieben
|
||
\item Architekturzentriert
|
||
\item Risikoorientiert
|
||
\item Ereignisorientiert
|
||
\end{itemize*}
|
||
\item Passend für objektorientiertes Paradigmas und UML
|
||
\item Tool-Unterstützung
|
||
\item Reaktion auf Änderungen möglich
|
||
\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*}
|
||
|
||
\subsection{Agile Methoden}
|
||
Das Agile Manifest (2001)
|
||
\begin{itemize*}
|
||
\item Individuen und Interaktionen $>$ als Prozesse und Tools
|
||
\item Funktionierende Software $>$ als übermäßige Dokumentation
|
||
\item Stetige Zusammenarbeit mit Kunden $>$ als Vertragsverhandlung
|
||
\item Mut und Offenheit für Änderungen $>$ als Befolgen eines Plans
|
||
\end{itemize*}
|
||
|
||
Eigenschaften agiler Vorgehensmodelle
|
||
\begin{itemize*}
|
||
\item Team ist für Ergebnis verantwortlich und organisiert sich selbst
|
||
\item Kleine Teams 5-8 Personen
|
||
\item Definition von Richtlinien, Werten und Prinzipien
|
||
\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*}
|
||
\item Nachteile
|
||
\begin{itemize*}
|
||
\item Schwierigeres Projektmanagement
|
||
\item Chaotische Vorgehen
|
||
\item Schwere Planbarkeit des Ergebnisses
|
||
\item Notwendige Beteiligung des Kunden
|
||
\item Ergebnis ist schwer vorherzusagen
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\paragraph{eXtreme Programming (XP)}
|
||
\begin{itemize*}
|
||
\item Evolutionäre Entwicklung in kleinen Schritten
|
||
\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
|
||
\end{itemize*}
|
||
|
||
\paragraph{Scrum}
|
||
\begin{itemize*}
|
||
\item Iterativ / Inkrementell, Evolutionär
|
||
\item stark Anwendungs- und Ereignisorientiert
|
||
\item schnelle Entwicklungsiterationen
|
||
\item Sprint: eine schnelle Iteration/Umsetzung Features (30 Tage)
|
||
\item Product Backlog: Liste der gewünschten Features des Produkts
|
||
\begin{itemize*}
|
||
\item Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt
|
||
\item Jeder kann Einträge beisteuern
|
||
\end{itemize*}
|
||
\item Rollen
|
||
\begin{description*}
|
||
\item[Product Owner] Erfasst Bedürfnisse der Kunden und Stakeholder, Pflegt Backlog, definiert, priorisiert Features pro Sprint
|
||
\item[Scrum Master] Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings, Schützt das Team vor äußeren Störungen, Repräsentiert Team gegenüber Management
|
||
\item[Scrum Team] Team organisiert sich und die Aufgaben selbst, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten
|
||
\end{description*}
|
||
\item Sprint Backlog
|
||
\begin{itemize*}
|
||
\item Für die aktuelle Iteration ausgewählte Aufgaben ($\leq$ 2 Tage)
|
||
\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
|
||
\end{itemize*}
|
||
\item Daily Meeting (15 Minuten)
|
||
\begin{itemize*}
|
||
\item Was wurde geschafft? Was ist zu tun? Was behindert den Fortschritt?
|
||
\item Weiterführende Diskussionen erst im Anschluss
|
||
\end{itemize*}
|
||
\item Sprint Review-Meeting
|
||
\begin{itemize*}
|
||
\item Präsentation des Erreichten (Feature Demo)
|
||
\item Product Owner, Kunde usw. geben Feedback
|
||
\item Neue Anforderungen hinzufügen / Neu priorisieren
|
||
\item Qualitätsansprüche ändern
|
||
\end{itemize*}
|
||
\item Sprint-Retrospektive
|
||
\begin{itemize*}
|
||
\item Rückkopplungsschleife: Was war gut und was hat nicht funktioniert?
|
||
\item Nach jedem Sprint
|
||
\item Diskussion der identifizierten Probleme
|
||
\item Identifikation von wenigen „Action Items“
|
||
\end{itemize*}
|
||
\item Burndown Chart: Darstellung der offenen und erledigten Aufwände / Tasks
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
\newpage
|
||
\begin{multicols}{3}\scriptsize
|
||
|
||
\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)
|
||
\end{itemize*}
|
||
\item Unsicherheit vor allem in den Frühphasen
|
||
\item Risiko durch unbekannte Aufgabe
|
||
\end{itemize*}
|
||
|
||
Was ist Projektmanagement?
|
||
\begin{itemize*}
|
||
\item Überbegriff für planende und durchsetzende Aktivitäten zur Vorbereitung und Durchführung eines Projekts
|
||
\item Management des Problemlösungsprozesses
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
\subsection{Projektplanung}
|
||
Planung des Projektablaufs
|
||
\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 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*}
|
||
\end{itemize*}
|
||
%![Projektstruktur](Assets/Softwaretechnik1_Projektstruktur.png)
|
||
|
||
Ablaufplanung
|
||
\begin{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, 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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\paragraph{Function Point Analyse}
|
||
\begin{itemize*}
|
||
\item Ursprung IBM Ende 1970er Jahre
|
||
\item Funktionsumfang und Schwierigkeitsgrad von Software
|
||
\item Verschiedene Verfahren
|
||
\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 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*}
|
||
\item Umrechnung mit Tabelle (nichtlinearer Verlauf)
|
||
%\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*}
|
||
\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
|
||
\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 (Gantt-Chart / Balkendiagramm)
|
||
\end{itemize*}
|
||
|
||
\subsection{Projektdurchführung}
|
||
Projektorganisation
|
||
\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*}
|
||
\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*}
|
||
\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*}
|
||
\item Weitere Ressourcen bereitstellen
|
||
\item Notwendige Planänderungen erkennen und reagieren
|
||
\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
|
||
\end{itemize*}
|
||
\item Starttreffen des Projekts (kick-off meeting)
|
||
\end{itemize*}
|
||
|
||
Meetings / Projekttreffen
|
||
\begin{itemize*}
|
||
\item Regelmäßige Abstimmung der Projektteilnehmer
|
||
\item Inhalt und Ablauf: geplant (Tagesordnung), Moderator
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Fortschrittskontrolle
|
||
\begin{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 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
|
||
\begin{itemize*}
|
||
\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*}
|
||
\end{itemize*}
|
||
|
||
Wie viel Planung?
|
||
\begin{itemize*}
|
||
\item Aufwand und Detaillierungsgrad der Planung an Projektgröße und „echten“ Aufwand anpassen
|
||
\item Pläne müssen sich ändern können!
|
||
\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
|
||
\end{itemize*}
|
||
\end{itemize*}
|
||
|
||
\end{multicols}
|
||
|
||
\end{document} |