4385 lines
		
	
	
		
			183 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			4385 lines
		
	
	
		
			183 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \documentclass[a4paper]{article}
 | ||
| \usepackage[ngerman]{babel}
 | ||
| \usepackage{multicol}
 | ||
| \usepackage{calc}
 | ||
| \usepackage{ifthen}
 | ||
| \usepackage[landscape,left=1cm,top=1cm,right=1cm,nohead,nofoot]{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}
 | ||
| \usetikzlibrary{mindmap, arrows,shapes,positioning,shadows,trees}
 | ||
| \tikzstyle{every node}=[draw=black,thin,anchor=west, minimum height=2em]
 | ||
| \usepackage[hidelinks,pdfencoding=auto]{hyperref}
 | ||
| 
 | ||
| \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=1cm,left=1cm,right=1cm,bottom=1cm} }
 | ||
|         {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} }
 | ||
|     }
 | ||
| 
 | ||
| % 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
 | ||
| 
 | ||
| % Define BibTeX command
 | ||
| \def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
 | ||
|     T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
 | ||
| 
 | ||
| % 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}
 | ||
| 
 | ||
| %Tikz global setting
 | ||
| \tikzset{
 | ||
|     topic/.style={
 | ||
|                 text centered,
 | ||
|                 text width=5cm,
 | ||
|                 level distance=1mm,
 | ||
|                 sibling distance=5mm,
 | ||
|                 rounded corners=2pt
 | ||
|             },
 | ||
|         subtopic/.style={
 | ||
|                 yshift=1.5cm,
 | ||
|                 text centered,
 | ||
|                 text width=3cm,
 | ||
|                 rounded corners=2pt,
 | ||
|                 fill=gray!10
 | ||
|             },
 | ||
|         theme/.style={
 | ||
|                 grow=down,
 | ||
|                 xshift=-0.6cm,
 | ||
|                 text centered,
 | ||
|                 text width=3cm,
 | ||
|                 edge from parent path={(\tikzparentnode.205) |\item (\tikzchildnode.west)}
 | ||
|             },
 | ||
|         description/.style={
 | ||
|                 grow=down,
 | ||
|                 xshift=-0.5cm,
 | ||
|                 right,
 | ||
|                 text centered,
 | ||
|                 edge from parent path={(\tikzparentnode.200) |\item (\tikzchildnode.west)}
 | ||
|             },
 | ||
|         level 1/.style={sibling distance=5.5cm},
 | ||
|         level 1/.append style={level distance=2.5cm},
 | ||
| }
 | ||
| 
 | ||
| % Turn off header and footer
 | ||
| \pagestyle{empty}
 | ||
| \begin{document}
 | ||
| 
 | ||
| \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}
 | ||
| 
 | ||
|   Gute Software ist schwer herzustellen
 | ||
|   \begin{itemize*}
 | ||
|     \item Entspricht Kundenwünsche, Vollständigkeit
 | ||
|     \item Funktioniert Korrekt
 | ||
|     \item Kosten- und Termintreue bei der Erstellung
 | ||
|     \item weitere nicht-funktionale Qualitätsforderungen
 | ||
|           \begin{itemize*}
 | ||
|             \item Benutzerfreundlichkeit, Ergonomie
 | ||
|             \item Sicherheit
 | ||
|             \item Zuverlässigkeit, Fehlertoleranz
 | ||
|             \item Performanz
 | ||
|             \item Ressourcen-Effizienz, Skalierbarkeit, Übertragbarkeit
 | ||
|             \item Wartbarkeit, Änder- und Erweiterbarkeit
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Softwaretechnik
 | ||
|   \begin{itemize*}
 | ||
|     \item Technische Disziplin der Software Herstellung
 | ||
|     \item Zielorientierte Bereitstellung uns systematische Verwendung von Prinzipien, Methoden und Werkzeugen für die arbeitsteilige, ingenieurmäßige Entwicklung und Anwendung von umfangreichen Softwaresystemen [Balzert]
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Wie kann man Software besser entwickeln?
 | ||
|   \begin{itemize*}
 | ||
|     \item Ingenieursmäßige Herangehensweise
 | ||
|           \begin{itemize*}
 | ||
|             \item Verwendung bekannter Prinzipien und Methoden
 | ||
|             \item Systematische Vorgehensweise
 | ||
|           \end{itemize*}
 | ||
|     \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 [Brügge]
 | ||
|   $\rightarrow$ Beschreibung eines Ausschnitts der Realität
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item erstellen einer Abstraktion
 | ||
|     \item abbilden signifikanter Eigenschaften
 | ||
|     \item Deskriptiv/präskriptiv (real oder geplant)
 | ||
|     \item Sichtweise auf ein System (Struktur, Verhalten, Zustand,...)
 | ||
|     \item heißt Weglassen
 | ||
|     \item setzt Verstehen voraus
 | ||
|     \item ist nicht automatisierbar
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Verschiedene Modelle:
 | ||
|   \begin{itemize*}
 | ||
|     \item Analysemodell
 | ||
|     \item Entwurfsmodell
 | ||
|     \item Implementierung (-smodell)
 | ||
|     \item Vorgehensmodell
 | ||
|     \item Produktmodell
 | ||
|     \item Dokumentation, Alternativen-Auswahl
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Modelle für:
 | ||
|   \begin{itemize*}
 | ||
|     \item Sichten
 | ||
|     \item Funktionen
 | ||
|     \item Daten
 | ||
|     \item Algorithmen
 | ||
|     \item Systemumgebung
 | ||
|     \item Dynamisches Verhalten
 | ||
|     \item Objektorientierte Modelle
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Klassische Modelle}
 | ||
|   \begin{itemize*}
 | ||
|     \item Funktionen:
 | ||
|           \begin{itemize*}
 | ||
|             \item Funktionsbaum
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Hierarchische Dekomosition der Fkt
 | ||
|                     \item nummerieren der Ebenen/Funktionen möglich
 | ||
|                     \item Bsp: Abonnement Verwaltung
 | ||
|                   \end{itemize*}
 | ||
|             \item Blockschaltbild
 | ||
|                   \begin{itemize*}
 | ||
|                     \item eingebettetes System, HW/SW
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Daten
 | ||
|           \begin{itemize*}
 | ||
|             \item Data Dictionary
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Verzeichnis von Daten mit Strukturinformationen
 | ||
|                     \item Backus-Naur-Form, kontextfreie Grammatik
 | ||
|                   \end{itemize*}
 | ||
|             \item Entity Relationship Diagram
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Daten und ihre Beziehungen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Systemumgebung
 | ||
|           \begin{itemize*}
 | ||
|             \item Datenflussdiagramm
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Fluss und Transformation von Daten zwischen Funktionen, Speichern und Schnittstellen
 | ||
|                     \item kein Kontrollfluss
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Algorithmen
 | ||
|           \begin{itemize*}
 | ||
|             \item Entscheidungstabelle
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Regelbasierte Beschreibung
 | ||
|                     \item Bedingung
 | ||
|                     \item Aktionen
 | ||
|                     \item Reduktionsregeln
 | ||
|                   \end{itemize*}
 | ||
|             \item Pseudocode
 | ||
|                   \begin{itemize*}
 | ||
|                     \item von Programmiersprache abstrahierende, detaillierte Beschreibung eines Algorithmus
 | ||
|                   \end{itemize*}
 | ||
|             \item Programmablaufplan
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Grafische Beschreibung des Kontrollflusses
 | ||
|                     \item DIN 66001
 | ||
|                     \item Unstrukturiert
 | ||
|                   \end{itemize*}
 | ||
|             \item Struktogramm
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Nassi-Shneidermann-Diagramm
 | ||
|                     \item keine Sprünge
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Dynamisches Verhalten (diskrete Zustände und atomare zustandübergänge)
 | ||
|           \begin{itemize*}
 | ||
|             \item Zustandsautomat
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Verhalten mit Zuständen und -übergängen
 | ||
|                     \item Automatenmodelle und -theorie
 | ||
|                     \item Ggf zerlegung oder kommunizierende Automaten
 | ||
|                   \end{itemize*}
 | ||
|             \item Flow-Chart
 | ||
|             \item Ereignisgesteuerte Prozesskette (EPK)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Geschäftsprozesse
 | ||
|                     \item BPM
 | ||
|                   \end{itemize*}
 | ||
|             \item Petri-Netz (ggf. mit Zeitmodell)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Grafische Beschreibung von Nebenläufigkeit und Synchronisation
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Objektorientierte Modelle
 | ||
|           \begin{itemize*}
 | ||
|             \item Klassendiagramme
 | ||
|             \item UML
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Objektorientierung}
 | ||
|   \begin{itemize*}
 | ||
|     \item bessere Strukturierung für komplexe Zusammenhänge
 | ||
|     \item Abstraktere Sichtweise
 | ||
|     \item Grundprinzip: Zerlegung; Teile und Herrsche
 | ||
|     \item ein System besteht aus vielen Objekten
 | ||
|     \item ein Objekt hat
 | ||
|           \begin{itemize*}
 | ||
|             \item definiertes Verhalten
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Menge genau definierter Operationen
 | ||
|                     \item Operation wird beim Empfang einer Nachricht ausgeführt
 | ||
|                   \end{itemize*}
 | ||
|             \item inneren Zustand
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Zustand des Objekts ist Privatsache
 | ||
|                     \item Resultat einer Operation hängt vom aktuellen Zustand ab
 | ||
|                   \end{itemize*}
 | ||
|             \item eindeutige Identität
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Identität ist unabhängig von anderen Eigenschaften
 | ||
|                     \item Mehrere verschiedene Objekte mit identischem Verhalten und identischem inneren Zustand im gleichen System möglich
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Klasse
 | ||
|           \begin{itemize*}
 | ||
|             \item Gleichartige Objekte mit ggf. verschiedenen Zuständen
 | ||
|             \item Verhaltensschema - Operationen
 | ||
|             \item Innere Struktur - Attribute
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Vorteile der Objektorientierung
 | ||
|   \begin{itemize*}
 | ||
|     \item Zuständigkeitsbereiche
 | ||
|           \begin{itemize*}
 | ||
|             \item Daten, Operationen und Zustand: lokal und gekapselt
 | ||
|           \end{itemize*}
 | ||
|     \item Klare Schnittstellen
 | ||
|           \begin{itemize*}
 | ||
|             \item Definiertes Objektverhalten, Nachrichten
 | ||
|           \end{itemize*}
 | ||
|     \item Hierarchie
 | ||
|           \begin{itemize*}
 | ||
|             \item Vererbung und Polymorphie (Spezialisierung), Klassenschachtelung
 | ||
|           \end{itemize*}
 | ||
|     \item Baukastenprinzip
 | ||
|           \begin{itemize*}
 | ||
|             \item Benutzung vorgefertigter Klassenbibliotheken, Anpassung durch Spezialisierung (mittels Vererbung)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Unified Modeling Language}
 | ||
|   \begin{itemize*}
 | ||
|     \item Grafisches Beschreibungsmittel für Aspekte des Softwareentwurfs diskreter Systeme
 | ||
|     \item Spezifikation, Entwurf, Visualisierung, Konstruktion, Dokumentation von Software
 | ||
|     \item Für OO-Softwareentwicklung und -prozess geeignet
 | ||
|     \item UML ist weder Methode noch Prozess
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Warum UML?
 | ||
|   \begin{itemize*}
 | ||
|     \item Objektorientierung ist zur Zeit das vorherrschende Modellierungs-Paradigma, Industrie-Standard
 | ||
|     \item Kombination von Struktur-, Verhaltens-, Interaktions-, und Verteilungsmodellen
 | ||
|     \item Für Analyse, Entwurf, Implementierung und Test einsetzbar
 | ||
|     \item Gute Werkzeugunterstützung für Editieren, Versionierung, Codegenerierung
 | ||
|     \item Erweiterbarkeit der UML mit Stereotypen und Tags
 | ||
|     \item Semi-formale Modelle, z.T. verschiedene Interpretationen
 | ||
|     \item Offenheit: Erweiterung mit stereotypes, tags, constraints
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Nachteile UML
 | ||
|   \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
 | ||
|     \item Sprachen wie die UML werden erlernt durch Übung!
 | ||
|     \item Aber: LV SWT ist kein kompletter UML-Kurs
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Überblick über Modelle}
 | ||
|   \begin{itemize*}
 | ||
|     \item 14 Diagrammarten
 | ||
|     \item Struktur-Diagramme
 | ||
|           \begin{itemize*}
 | ||
|             \item Klassen-, Objekt-, Komponenten-, Kompositions-Struktur-,
 | ||
|             \item Paket- und Verteilungsdiagramm
 | ||
|             \item Profildiagramm - zur UML-Erweiterung
 | ||
|           \end{itemize*}
 | ||
|     \item Verhaltens-Diagramme
 | ||
|           \begin{itemize*}
 | ||
|             \item Use-Case-, Aktivitäts- und Zustandsdiagramms
 | ||
|             \item Interaktionsdiagramme: Sequenz-, Kommunikations-, Timing- und Interaktionsübersichts-Diagramm
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \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)
 | ||
|     \item Grundelemente
 | ||
|           \begin{itemize*}
 | ||
|             \item Anwendungsfall: Use Case
 | ||
|             \item Beteiligte: Aktor
 | ||
|           \end{itemize*}
 | ||
|     \item Verfeinerung mittels Use-Case-Realisierung notwendig
 | ||
|           \begin{itemize*}
 | ||
|             \item Textuelle Beschreibung
 | ||
|             \item Verhaltensdiagramme
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Klassendiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Modellierung der Struktur (Aufbau) eines Systems
 | ||
|     \item Modellierung von statischen Aspekten
 | ||
|     \item Modellierung der Struktur von Daten
 | ||
|     \item Klasse im Mittelpunkt
 | ||
|           \begin{itemize*}
 | ||
|             \item Aufbau: Attribute, Operationen
 | ||
|             \item Beziehungen zueinander: Assoziationen, Vererbung
 | ||
|           \end{itemize*}
 | ||
|     \item Verbreitetstes und bekanntestes Diagramm der UML
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Objektdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Struktur des Systems zur Laufzeit zu einem Zeitpunkt
 | ||
|     \item Tatsächliche Zusammenhänge und Belegungen von Attributen von Objekten zu einem Zeitpunkt
 | ||
|     \item Eine detaillierte Sicht auf einen Aspekt
 | ||
|           \begin{itemize*}
 | ||
|             \item Keine vollständige Beschreibung (zu komplex)
 | ||
|             \item Für kompliziertere Abhängigkeiten (z.B. Rekursion)
 | ||
|           \end{itemize*}
 | ||
|     \item Objektdiagramm für alle Arten von Exemplaren
 | ||
|           \begin{itemize*}
 | ||
|             \item z.B.: Klasse (Objekt), Komponente, Knoten, ...
 | ||
|           \end{itemize*}
 | ||
|     \item Keine Exemplare von Operationen -> Ablauf -> Verhaltensdiagramme / Interaktionsdiagramme
 | ||
|     \item Kein Verlauf der Wertebelegung über die Zeit
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Paketdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Gliederung (Strukturierung) des Systems in Teile (Pakete)
 | ||
|     \item Zuordnung von Elementen zu einem Paket
 | ||
|     \item Bildung von Hierarchien (Enthält-Beziehung)
 | ||
|     \item Abhängigkeiten zwischen den Paketen
 | ||
|           \begin{itemize*}
 | ||
|             \item "Include" von Quellcode-Dateien (<<import>>)
 | ||
|           \end{itemize*}
 | ||
|     \item Anwendung:
 | ||
|           \begin{itemize*}
 | ||
|             \item Zum Grobentwurf von Systemen
 | ||
|             \item Definition von Schichten
 | ||
|           \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
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Kompositionsstrukturdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Teile-Ganzes-Strukturen -> Kompositionsstruktur
 | ||
|     \item Strukturell statische Kompositionsstrukturen:
 | ||
|           \begin{itemize*}
 | ||
|             \item Kurzschreibweise bei vielen Kompositionen
 | ||
|             \item Modellierung des Aufbaus komplexer Systeme
 | ||
|           \end{itemize*}
 | ||
|     \item Strukturell dynamische Kompositionsstrukturen:
 | ||
|           \begin{itemize*}
 | ||
|             \item Notwendige Strukturen zur Realisierung eines Verhaltens
 | ||
|             \item Definition von Rollen, zur Lösung wiederkehrender Probleme -> Modellierung von Mustern
 | ||
|           \end{itemize*}
 | ||
|     \item Starke Verwandtschaft mit dem Klassendiagramm
 | ||
|     \item Spezialisierte Kompositionsbeziehung -> erweiterte Semantik
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Aktivitätsdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Modellierung von
 | ||
|           \begin{itemize*}
 | ||
|             \item Kontrollflüssen
 | ||
|             \item Datenflüssen
 | ||
|             \item Parallelem Verhalten
 | ||
|             \item Verzweigungen, bedingten und gewichteten Abläufen
 | ||
|           \end{itemize*}
 | ||
|     \item Geschäftsprozessmodellierung möglich
 | ||
|     \item Abstrakte und detaillierte Verhaltensbeschreibung möglich
 | ||
|     \item Grundlage zur Codegenerierung
 | ||
|     \item Zur Verfeinerung von
 | ||
|           \begin{itemize*}
 | ||
|             \item Use-Cases
 | ||
|             \item Operationen / Interaktionen
 | ||
|             \item anderen Aktionen und Aktivitäten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Interaktionsdiagramme}
 | ||
|   \begin{itemize*}
 | ||
|     \item Modellierung von
 | ||
|           \begin{itemize*}
 | ||
|             \item Kommunikation zwischen Kommunikationspartnern (Lebenslinie)
 | ||
|             \item Operationen (Modellierung eines Programms)
 | ||
|             \item Informationsaustausch / Nachrichten
 | ||
|           \end{itemize*}
 | ||
|     \item Gemeinsames Grundkonzept der Interaktionsdiagramme
 | ||
|     \item Sehr detaillierte Diagramme
 | ||
|           \begin{itemize*}
 | ||
|             \item Meist nicht zur vollständigen Beschreibung eines Systems
 | ||
|             \item Betrachtung eines wichtigen Teilaspekts
 | ||
|           \end{itemize*}
 | ||
|     \item Grundlage zur Codegenerierung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Sequenzdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Genaue zeitliche Abfolge von Nachrichten
 | ||
|     \item Umfangreichstes Interaktionsdiagramm
 | ||
|     \item Kontrollelemente möglich (Schleifen, Verzweigungen)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Kommunikationsdiagramm}
 | ||
|   \begin{itemize*}
 | ||
|     \item Kommunikationsbeziehungen der Kommunikationspartner stehen im Vordergrund
 | ||
|     \item Welche Komponenten arbeiten wie zusammen, um eine Funktion zu 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
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Prinzipieller Aufbau}
 | ||
|   \begin{itemize*}
 | ||
|     \item Zeitlicher Verlauf senkrecht
 | ||
|     \item Kommunikationspartner waagerecht (unsortiert)
 | ||
|     \item Lebenslinie
 | ||
|           \begin{itemize*}
 | ||
|             \item Rechteck mit gestrichelter senkrechter Linie
 | ||
|             \item Start, Ende und Dauer der Ausführung einer Operation
 | ||
|             \item Rekursive Aufrufe möglich
 | ||
|           \end{itemize*}
 | ||
|     \item Ereignisspezifikation
 | ||
|           \begin{itemize*}
 | ||
|             \item Stelle des Sendens / Empfangens der Nachricht
 | ||
|             \item Definition der Reihenfolge des Auftretens
 | ||
|             \item Trace: Folge von Sende- und Empfangsereignissen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Weitere Elemente des Sequenzdiagramms}
 | ||
|   \begin{itemize*}
 | ||
|     \item Nachrichten ohne Sender
 | ||
|           \begin{itemize*}
 | ||
|             \item z.B. am Beginn einer Interaktion
 | ||
|           \end{itemize*}
 | ||
|     \item Verlorene Nachrichten (ohne Empfänger)
 | ||
|           \begin{itemize*}
 | ||
|             \item Nachricht ohne dargestellten Empfänger
 | ||
|             \item z. B. am Ende einer Interaktion
 | ||
|           \end{itemize*}
 | ||
|     \item Erzeugen von Lebenslinien
 | ||
|           \begin{itemize*}
 | ||
|             \item Gestrichelte Linie mit geöffnetem Pfeil
 | ||
|             \item Keine Rückgabenachricht
 | ||
|             \item Zeitliche Einrückung des Rechtecks
 | ||
|           \end{itemize*}
 | ||
|     \item Zerstören von Lebenslinien
 | ||
|           \begin{itemize*}
 | ||
|             \item Durchgezogene Linie mit Dreieckende
 | ||
|             \item Kann Rückgabenachricht erzeugen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Nachrichten in Interaktionsdiagrammen}
 | ||
|   \begin{itemize*}
 | ||
|     \item Ereignis des Sendens bzw. Empfangens von Nachrichten
 | ||
|     \item Typen:
 | ||
|           \begin{itemize*}
 | ||
|             \item Operationsaufruf (synchron / asynchron)
 | ||
|             \item Antwort Nachricht
 | ||
|             \item Signal (asynchron), Create-/ Delete Message
 | ||
|           \end{itemize*}
 | ||
|     \item Operationsaufruf: Parameterliste muss kompatibel sein
 | ||
|     \item Nachrichtentypen
 | ||
|   \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)
 | ||
|           \begin{itemize*}
 | ||
|             \item Deterministische
 | ||
|             \item Nichtdeterministische
 | ||
|           \end{itemize*}
 | ||
|     \item Verfeinerung von Zuständen möglich
 | ||
|     \item Modellierung von verteilten Systemen / parallelem Verhalten
 | ||
|     \item Grundlage zur Codegenerierung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \section{Analyse}
 | ||
|   \begin{itemize*}
 | ||
|     \item Einordnung in den Projektablauf
 | ||
|     \item Was ist eine Anforderung?
 | ||
|           \begin{itemize*}
 | ||
|             \item Merkmal, Eigenschaft, Bedingung oder Einschränkung eines Systems
 | ||
|             \item Notwendig für die Akzeptanz vom Kunden
 | ||
|             \item Definition (IEEE 610.12-1990)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Dokumentierte Darstellung einer Fähigkeit oder Eigenschaft
 | ||
|                     \item von Anwender benötigt zur Problemlösung bzw. um Ziel zu erreichen
 | ||
|                     \item Muss von System oder Komponente erfüllt werden, um Vertrag oder Standard zu erfüllen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Funktionale Anforderungen - Was soll es tun?
 | ||
|           \begin{itemize*}
 | ||
|             \item „...Legt eine vom Softwaresystem oder einer seiner Komponenten bereitzustellende Funktion oder Service dar“ [Balzert]
 | ||
|             \item Was leistet das System
 | ||
|             \item Welche Funktionen bietet es
 | ||
|             \item Wie interagiert es mit der Umgebung
 | ||
|             \item Anforderungen an:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Verhalten
 | ||
|                     \item Struktur
 | ||
|                     \item (Alternativ: Statik, Dynamik, Logik)
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Nichtfunktionale Anforderungen - Wie?
 | ||
|           \begin{itemize*}
 | ||
|             \item „...legen qualitative oder quantitative Eigenschaften des Softwareprojektes oder einer Komponente fest“ [Balzert]
 | ||
|             \item Auch Bezeichnet als:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Quality of Service
 | ||
|                     \item Qualitätsanforderungen
 | ||
|                   \end{itemize*}
 | ||
|             \item Arten - FURPS (ISO 9126):
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Functionality (Funktionalität)
 | ||
|                     \item Usability (Benutzbarkeit)
 | ||
|                     \item Reliability (Zuverlässigkeit)
 | ||
|                     \item Performance (Effizienz) / Portability (Übertragbarkeit)
 | ||
|                     \item Supportability (Änderbarkeit/ Wartbarkeit)
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Funktionalität
 | ||
|           \begin{itemize*}
 | ||
|             \item Angemessen, Genauigkeit
 | ||
|             \item Sicherheit: Vertraulichkeit, Informationssicherheit, Datenintegrität, Verfügbarkeit
 | ||
|             \item (Nicht ausreichend spezifizierte funktionale Anforderung)
 | ||
|           \end{itemize*}
 | ||
|     \item Benutzbarkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Verständlichkeit, Erlernbarkeit, Bedienbarkeit, Attraktivität
 | ||
|           \end{itemize*}
 | ||
|     \item Zuverlässigkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Reife (Fehler-Anzahl), Fehlertoleranz, Wiederherstellbarkeit
 | ||
|           \end{itemize*}
 | ||
|     \item Effizient/ Leistungsanforderungen
 | ||
|           \begin{itemize*}
 | ||
|             \item Zeitverhalten, Verbrauchsverhalten, Wirtschaftlichkeit
 | ||
|           \end{itemize*}
 | ||
|     \item Portabilität
 | ||
|           \begin{itemize*}
 | ||
|             \item Anpassbarkeit, Installierbarkeit, Koexistenz, Austauschbarkeit
 | ||
|           \end{itemize*}
 | ||
|     \item Wartbarkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Analysierbarkeit, Änder\item und Erweiterbarkeit, Stabilität (bei Änderungen), Testbarkeit
 | ||
|           \end{itemize*}
 | ||
|     \item Weitere:
 | ||
|           \begin{itemize*}
 | ||
|             \item Konformität zu Konventionen und Bestimmungen
 | ||
|             \item Interoperabilität zu anderen Systemen
 | ||
|             \item Implementierungsanforderungen
 | ||
|             \item Schnittstellenanforderungen
 | ||
|             \item Skalierbarkeit (Änderungen des Problemumfangs)
 | ||
|             \item Betriebliche und rechtliche Rahmenbedingungen
 | ||
|             \item Liefer\item und Verpackungsanforderungen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Nichtfunktionale Anforderungen}
 | ||
|   Schwierigkeit nichtfunktionaler Anforderungen
 | ||
|   \begin{itemize*}
 | ||
|     \item Hängen oft von Verhalten ab: daher komplex und nicht direkt sichtbar
 | ||
|     \item „Das Auto hat vier Räder“ (Struktur)
 | ||
|     \item „Wenn der Blinker betätigt wird, blinkt das Auto dreimal wenn die Zündung an ist; ansonsten wird das Standlicht einseitig eingeschaltet“ (Korrektes Verhalten)
 | ||
|     \item „Das Motorsteuergerät darf innerhalb von 5 Jahren und 150.000km Laufleistung höchstens mit 0.1\% Wahrscheinlichkeit ausfallen“ (Zuverlässigkeit)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Umgang mit nichtfunktionalen Eigenschaften
 | ||
|   \begin{itemize*}
 | ||
|     \item Nicht direkt „by construction“ zu realisieren
 | ||
|     \item Naive Herangehensweise: Ignorieren!
 | ||
|           \begin{itemize*}
 | ||
|             \item Entwerfen und Implementieren der Software ohne Berücksichtigung nichtfunktionaler Eigenschaften
 | ||
|             \item Testen der nichtfunktionalen Eigenschaften
 | ||
|             \item Wenn nicht erfüllt: Entwurf und Implementierung ändern!
 | ||
|           \end{itemize*}
 | ||
|     \item Funktioniert nur bei sehr einfachen Systemen, bzw. wenn nichtfunktionale Eigenschaften nicht wichtig sind!
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Sinnvoller Umgang mit nichtfunktionalen Eigenschaften
 | ||
|   \begin{itemize*}
 | ||
|     \item Untersuchung der Projektrisiken bereits in der Analysephase
 | ||
|           \begin{itemize*}
 | ||
|             \item größte Risiken zuerst betrachten!
 | ||
|             \item Immer fragen: Geht das so überhaupt?
 | ||
|             \item Festlegungen des Entwurfs möglichst früh gegen Anforderungen prüfen - aber wie?
 | ||
|           \end{itemize*}
 | ||
|     \item Modellbasierter Entwurf
 | ||
|           \begin{itemize*}
 | ||
|             \item Modellierung des Systems und seiner Umwelt
 | ||
|             \item Bewertung des Modells (Simulation)
 | ||
|             \item Lehrveranstaltungen Systementwurf, KIS, LTS
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Randbedingungen
 | ||
|   \begin{itemize*}
 | ||
|     \item „... Eine Randbedingung ist eine organisatorische oder technologische Vorgabe, die die Art und Weise einschränkt, wie das betrachtete System realisiert werden kann.“
 | ||
|     \item Werden nicht umgesetzt
 | ||
|     \item Schränken Lösungsraum ein
 | ||
|     \item Beispiele:
 | ||
|           \begin{itemize*}
 | ||
|             \item Kosten
 | ||
|             \item Durchlaufzeit: Time to Market
 | ||
|             \item Vorgaben durch Marketing und Vertrieb
 | ||
|             \item Technische Randbedingungen (nichtfunktionale Anforderung)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %
 | ||
|   %
 | ||
| 
 | ||
|   Geforderte (Meta-)Eigenschaften
 | ||
|   \begin{itemize*}
 | ||
|     \item Vollständig: alle Szenarien sind beschrieben
 | ||
|     \item Konsistent: keine Widersprüche
 | ||
|     \item Eindeutig: nur eine Interpretation möglich
 | ||
|     \item Korrekt: genaue und richtige Darstellung
 | ||
|     \item Realistisch: unter geg. Einschränkungen implementierbar
 | ||
|     \item Überprüfbar: durch Tests am Endprodukt nachweisbar
 | ||
|     \item Rückverfolgbar: Auswirkungen bis zur Implementierung nachvollziehbar (Testfälle, Auswirkung von Änderungen)
 | ||
|     \item Klassifizierbar (Risiko, Priorität, Dringlichkeit, Nutzen ...)
 | ||
|     \item Validierung mit dem Kunden
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Requirements Engineering
 | ||
|           \begin{itemize*}
 | ||
|             \item Ermittlung, Analyse und Verwaltung von Anforderungen
 | ||
|             \item Ausgangspunkt: Projektidee
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungsermittlung
 | ||
|           \begin{itemize*}
 | ||
|             \item requirements elicitation, requirements definition
 | ||
|             \item Bestimmen und dokumentieren der Anforderungen an das geplante System
 | ||
|             \item Beteiligt: Entwickler, Kunde, Benutzer
 | ||
|             \item Ergebnis: Anforderungsspezifikation - Glossar, Vertrag, Lastenheft
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungs-Analyse
 | ||
|           \begin{itemize*}
 | ||
|             \item requirements analysis, system modeling
 | ||
|             \item Beschreibung im Detail und formal strukturiert
 | ||
|             \item Beteiligt: Entwickler
 | ||
|             \item Ergebnis: funktionale Spezifikation - Produktdefinition, Analysemodell, Pflichtenheft
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %
 | ||
| 
 | ||
|   %| | 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!
 | ||
| 
 | ||
|   Bedeutung:
 | ||
|   \begin{itemize*}
 | ||
|     \item Falsche Anforderungen führen zu falschem System
 | ||
|     \item Frühe Fehler im Entwicklungsprozess sind teuer!
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Fehlerentstehung und Fehlerquellen bei Anforderungserfassung
 | ||
|   \begin{itemize*}
 | ||
|     \item 83\% sprachliche Fehler (Un- bzw. Missverständlich)
 | ||
|     \item 75\% Logische Fehler (Widersprüchlichkeit, Redundanz)
 | ||
|     \item 73\% Inhaltliche Fehler (Falsche Sachverhalte, Unvollständig)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Ermiteln von Anforderungen}
 | ||
|   Woher kommen Anforderungen?
 | ||
|   \begin{itemize*}
 | ||
|     \item Ausgangspunkt
 | ||
|           \begin{itemize*}
 | ||
|             \item Projektidee, schriftliche Skizze
 | ||
|             \item Kurz und knapp
 | ||
|             \item Stichpunkte der wichtigsten Funktionen
 | ||
|             \item Lastenheft (falls schon existiert)
 | ||
|           \end{itemize*}
 | ||
|     \item Interessenhalter (stakeholder)
 | ||
|           \begin{itemize*}
 | ||
|             \item Identifizieren, Wichtigkeit bewerten (berücksichtigen?)
 | ||
|             \item Ansprechpartner? Interessen und Erwartungen
 | ||
|             \item Fachexperten, Verantwortliche, Betroffene
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Beteiligte Rollen
 | ||
|   \begin{itemize*}
 | ||
|     \item Endbenutzer
 | ||
|           \begin{itemize*}
 | ||
|             \item Aufnahme Ist-Zustand, Domänenwissen, Anforderungen
 | ||
|           \end{itemize*}
 | ||
|     \item Kunde
 | ||
|           \begin{itemize*}
 | ||
|             \item Definiert Ziel des Systems, Vertragsverhandlung
 | ||
|           \end{itemize*}
 | ||
|     \item Konfigurationsmanager
 | ||
|           \begin{itemize*}
 | ||
|             \item Revisionsgeschichte der Dokumente, Nachvollziehbarkeit
 | ||
|           \end{itemize*}
 | ||
|     \item Architekt
 | ||
|           \begin{itemize*}
 | ||
|             \item Integration von Anwendungsfall- und Objektmodellen
 | ||
|           \end{itemize*}
 | ||
|     \item Analytiker
 | ||
|           \begin{itemize*}
 | ||
|             \item Modelliert das System und erstellt Anwendungsfälle
 | ||
|           \end{itemize*}
 | ||
|     \item Redakteur
 | ||
|     \item Prüfer
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Wie ermittelt man Anforderungen?
 | ||
|   \begin{itemize*}
 | ||
|     \item Problem: Entwickler müssen sich in Begriffs- und Denkwelt des Kunden einarbeiten, sonst Kommunikationsprobleme
 | ||
|     \item Systematische Vorgehensweise
 | ||
|     \item Kommunikation mit Kunden
 | ||
|     \item Geschäftsprozess (business process)
 | ||
|           \begin{itemize*}
 | ||
|             \item fachlicher Ablauf, der Wert oder Kosten verursacht
 | ||
|           \end{itemize*}
 | ||
|     \item Akteur (actor)
 | ||
|           \begin{itemize*}
 | ||
|             \item Benutzer, Schnittstelle nach außen
 | ||
|           \end{itemize*}
 | ||
|     \item Szenario (scenario)
 | ||
|           \begin{itemize*}
 | ||
|             \item Interaktion mit System als Ablauf
 | ||
|           \end{itemize*}
 | ||
|     \item Anwendungsfall (use case)
 | ||
|           \begin{itemize*}
 | ||
|             \item Automatisierter Arbeitsschritt, vom System ausgeführt
 | ||
|           \end{itemize*}
 | ||
|     \item Interviews mit Fachanwendern
 | ||
|           \begin{itemize*}
 | ||
|             \item Mitschrift, später strukturierter Text und Tabelle
 | ||
|           \end{itemize*}
 | ||
|     \item Strukturierte Spezifikation
 | ||
|           \begin{itemize*}
 | ||
|             \item Vorlagen / sprachliche Anforderungsschablonen
 | ||
|             \item Formulare
 | ||
|             \item Reduzierung sprachlicher Mehrdeutigkeiten
 | ||
|           \end{itemize*}
 | ||
|     \item Anwendungsfalldiagramm (Use-Case-Diagramm)
 | ||
|           \begin{itemize*}
 | ||
|             \item Arbeitsschritt eines Geschäftsprozesses, der durch das System ausgeführt wird
 | ||
|             \item Anforderungen an das System modellieren - was soll das System leisten
 | ||
|             \item Systemgrenzen / Systemkontext festlegen
 | ||
|             \item Systembeteiligte modellieren
 | ||
|             \item Planbare Einheiten als Schritte für die Entwicklung
 | ||
|             \item Verwendung bereits ab Projektbeginn
 | ||
|             \item Keine Modellierung eines Ablaufs!
 | ||
|           \end{itemize*}
 | ||
|     \item Umgang mit Szenarien und Anwendungsfällen
 | ||
|           \begin{itemize*}
 | ||
|             \item Zunächst nur zum Verständnis kurz aufstellen
 | ||
|             \item Systemgrenze definieren
 | ||
|             \item Beschreibungen verfeinern
 | ||
|             \item Änderungen mit Kunden abstimmen
 | ||
|             \item Prototypen nur zur visuellen Unterstützung
 | ||
|             \item Benutzungsschnittstelle erst beginnen, wenn funktionale Anforderungen in etwa klar sind
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Leitfaden für Anwendungsfälle
 | ||
|   \begin{itemize*}
 | ||
|     \item Benennen mit Verbalphrasen, die Anwendersicht beschreiben (Simuliere)
 | ||
|     \item Akteure mit Substantiven benennen (Anwender)
 | ||
|     \item Systemgrenzen klären. Arbeitsschritte von Akteuren und System kennzeichnen
 | ||
|     \item Schritte im aktiven Stil beschreiben (Auto bremst)
 | ||
|     \item Ursächliche Beziehung zwischen Folgeschritten
 | ||
|     \item 1 Anwendungsfall = 1 vollständige Transaktion
 | ||
|     \item Normalfall darstellen; Ausnahmen gesondert beschreiben
 | ||
|     \item Nicht die Benutzungsschnittstelle beschreiben (statt dessen visuellen Prototypen verwenden)
 | ||
|     \item Übersichtlichkeit (max. 2-3 Seiten), sonst zerlegen
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Typische Probleme
 | ||
|           \begin{itemize*}
 | ||
|             \item Kommunikations- und Verständnisprobleme
 | ||
|             \item Viele verschiedene Beteiligte
 | ||
|             \item Kunden wissen nicht, was sie genau wollen und was geht
 | ||
|             \item Verwendung von Fachsprachen
 | ||
|             \item Widersprüchliche Anforderungen, verschiedene Interessen
 | ||
|             \item Nicht-technische organisatorische, historische oder rechtliche Rahmenbedingungen
 | ||
|             \item Zusätzliche Beteiligte können auftauchen
 | ||
|             \item Anforderungen ändern sich während der Entwicklung
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungsänderungen
 | ||
|           \begin{itemize*}
 | ||
|             \item Sind die Regel
 | ||
|           \end{itemize*}
 | ||
|     \item Tätigkeiten der Anforderungsanalyse
 | ||
|           \begin{itemize*}
 | ||
|             \item Anforderungen strukturieren
 | ||
|             \item Eigenschaften der Anforderungen bestimmen
 | ||
|             \item Anforderungen priorisieren
 | ||
|             \item Anforderungen in Textform, Grafiken, Modellen dokumentieren
 | ||
|             \item Anforderungen modellieren
 | ||
|             \item Anforderungen auf inhaltliche Qualität prüfen
 | ||
|             \item Auf Übereinstimmung mit den Zielen prüfen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Ziel Abnahme der Anforderung
 | ||
|                   \end{itemize*}
 | ||
|             \item Hängt mit Analyse des Systems zusammen
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungen strukturieren
 | ||
|           \begin{itemize*}
 | ||
|             \item Unterteilung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Funktional, Nichtfunktional
 | ||
|                     \item Muss, Kann,... oder Haupt- und Nebenanforderung
 | ||
|                   \end{itemize*}
 | ||
|             \item Hierarchische Zerlegung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Unterteilen, Verfeinern
 | ||
|                   \end{itemize*}
 | ||
|             \item Ordnung festlegen, eindeutig Nummerieren
 | ||
|                   \begin{itemize*}
 | ||
|                     \item auf Einmaligkeit achten
 | ||
|                   \end{itemize*}
 | ||
|             \item Beziehungen festhalten
 | ||
|             \item Verwendung von Werkzeugen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item MS-Project, Doors, Git issues, Trac, Bugzilla, MKS,...
 | ||
|                     \item Modellierungswerkzeuge
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Eigenschaften bestimmen
 | ||
|           \begin{itemize*}
 | ||
|             \item Wahl der Eigenschaften firmen- bzw. projektspezifisch
 | ||
|             \item Wichtige Eigenschaften
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Identifikationsnummer
 | ||
|                     \item Kurzbezeichnung
 | ||
|                     \item Beschreibung (Text, ggf. Grafik, Modell)
 | ||
|                     \item Aufwand
 | ||
|                     \item Priorität der Anforderung
 | ||
|                     \item Bearbeitungsstatus / Restaufwand
 | ||
|                     \item Zugeordnet (wer ist verantwortlich / bearbeitet)
 | ||
|                     \item Querverbindungen zu anderen Anforderungen
 | ||
|                     \item Ggf. zusätzliche Dokumente oder Bemerkungen
 | ||
|                     \item Stabilität der Anforderung (Änderungswkt.)
 | ||
|                     \item Kritikalität der Anforderung: Schäden bei Fehlern?
 | ||
|                     \item Entwicklungsrisiko: Erfolgsaussichten der Umsetzung
 | ||
|                     \item Abnahmekriterien / Erfüllungsnachweis durch?
 | ||
|                     \item Anforderungstyp: Funktional, nicht funktional ,...
 | ||
|                     \item Anforderungssicht: Dynamik, Statik, Logik, Struktur, Funktion
 | ||
|                     \item Mögliche Konflikte
 | ||
|                     \item Autor
 | ||
|                     \item Quelle: Wer möchte die Anforderung umgesetzt haben?
 | ||
|                     \item Status der Beschreibung: Idee, grober Inhalt, detailliert
 | ||
|                     \item Anforderungsversion
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungen priorisieren
 | ||
|           \begin{itemize*}
 | ||
|             \item MuSCoW-Priorisierung
 | ||
|             \item Muss-, Kann-, Optional, Nicht (Abgrenzungskriterien) (must, should, could, won‘t)
 | ||
|             \item Ad-hoc: Stakeholder priorisiert Anforderungen
 | ||
|             \item Priorisierungsmatrix / Kosten-Wert-Analyse
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Eigenschaften bewerten (Punkte vergeben)
 | ||
|                     \item Werte gewichten
 | ||
|                     \item Priorität berechnen $\text{Prioritäten} = \frac{\text{Nutzen} - \text{Nachteil}}{\text{Kosten} + \text{Risiko}}$
 | ||
|                   \end{itemize*}
 | ||
|             \item Kano-Klassifikation
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Basiseigenschaften: Werden vorausgesetzt (fehlen stört, wenig zusätzliche Zufriedenheit)
 | ||
|                     \item Leistungseigenschaften: Sonderwünsche
 | ||
|                     \item Begeisterungseigenschaften: Wird nicht erwartet
 | ||
|                     \item Abfragen per Fragenkatalog
 | ||
|                   \end{itemize*}
 | ||
|             \item Reihenfolge festlegen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   %
 | ||
|   %
 | ||
| 
 | ||
|   \subsection{Objektorientierte Analyse und Systemmodellierung}
 | ||
|   \begin{itemize*}
 | ||
|     \item Übersicht
 | ||
|           \begin{itemize*}
 | ||
|             \item Aufgabe: Systemmodell erstellen, funktionale Spezifikation
 | ||
|             \item Beschreibung der Systembenutzung und des Verhaltens
 | ||
|             \item Was, nicht wie - Implementierungsaspekte ausklammern
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Nicht: Datenhaltung, Verteilung, Technologien, Architektur, ..
 | ||
|                   \end{itemize*}
 | ||
|             \item Zusammenhang mit Anforderungsspezifikation
 | ||
|             \item OO: Modell des Anwendungsbereichs
 | ||
|           \end{itemize*}
 | ||
|     \item Analysemodell
 | ||
|           \begin{itemize*}
 | ||
|             \item Korrekt, vollständig, konsistent und nachprüfbar
 | ||
|             \item Struktur und Verhalten
 | ||
|             \item Verschiedene Sichten (OO, Strukturiert, ...)
 | ||
|           \end{itemize*}
 | ||
|     \item Eingangsdokumente
 | ||
|           \begin{itemize*}
 | ||
|             \item Lastenheft, Anforderungsspezifikation
 | ||
|           \end{itemize*}
 | ||
|     \item Typische Ergebnisse
 | ||
|           \begin{itemize*}
 | ||
|             \item Funktionales Modell
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Geschäftsprozesse und Anwendungsfälle
 | ||
|                   \end{itemize*}
 | ||
|             \item Objektmodell
 | ||
|             \item Dynamisches Modell - Systemverhalten
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Zustands- und Sequenzdiagramme
 | ||
|                   \end{itemize*}
 | ||
|             \item Vor- und Nachbedingungen von Systemoperationen
 | ||
|             \item Prototyp / Spezifikation Benutzungsschnittstelle
 | ||
|             \item Pflichtenheft
 | ||
|           \end{itemize*}
 | ||
|     \item Objektorientierte Analyse nach [Brügge / Dutoit]
 | ||
|           \begin{itemize*}
 | ||
|             \item Verdeutlicht iterativen Ablauf
 | ||
|             \item Unterteilung des Analysemodells in:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Funktionales Modell (Anwendungsfälle)
 | ||
|                     \item Objektmodell (Klassen und Objektdiagramme)
 | ||
|                     \item Dynamisches Modell (Zustands- und Sequenzdiagramme)
 | ||
|                     \item Unterscheidung der Objekttypen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %
 | ||
|   %
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Heuristik Sprache $\rightarrow$ OO-Modell
 | ||
|     \item Objektarten im Systemmodell
 | ||
|           \begin{itemize*}
 | ||
|             \item Entitätsobjekte - vom System verwaltete Informationen
 | ||
|             \item Grenzobjekte - Interaktion zwischen System und Akteuren
 | ||
|             \item Steuerungsobjekte - Durchführung der Anwendungsfälle
 | ||
|           \end{itemize*}
 | ||
|     \item Identifizierung von Entitätsobjekten
 | ||
|           \begin{itemize*}
 | ||
|             \item Begriffe, die klargestellt werden müssen
 | ||
|             \item Wiederkehrende Substantive in Anwendungsfällen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Heuristiken
 | ||
|                   \end{itemize*}
 | ||
|             \item Reale Objekte, die das System kennen muss
 | ||
|             \item Reale Prozesse, die das System verfolgen muss
 | ||
|             \item Anwendungsfälle
 | ||
|             \item Datenquellen und -senken
 | ||
|             \item Artefakte, mit denen der Nutzer interagiert
 | ||
|           \end{itemize*}
 | ||
|     \item Identifizierung von Grenzobjekten
 | ||
|           \begin{itemize*}
 | ||
|             \item Elemente der Benutzungsschnittstelle
 | ||
|             \item Formulare für Eingaben
 | ||
|             \item Nachrichten, Rückmeldungen
 | ||
|             \item Endgeräte
 | ||
|             \item In der Begriffswelt des Anwenders bleiben!
 | ||
|             \item Schnittstellen grafisch skizzieren bzw. Prototyp!
 | ||
|           \end{itemize*}
 | ||
|     \item Identifizierung von Steuerungsobjekten
 | ||
|           \begin{itemize*}
 | ||
|             \item Koordination von Grenz- und Entitätsobjekten
 | ||
|             \item Abarbeitung von Anwendungsfällen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Reihenfolge von Schritten
 | ||
|                     \item Informationen übernehmen und weiterleiten
 | ||
|                     \item Oft ein Steuerungsobjekt pro Anwendungsfall
 | ||
|                   \end{itemize*}
 | ||
|             \item Beispiel: Simulationsszenario
 | ||
|             \item Verhaltensmodell sinnvoll! Im folgenden: dynamische Modelle
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Abläufe der Anwendungsfälle modellieren
 | ||
|           \begin{itemize*}
 | ||
|             \item Ziel - Objekte finden
 | ||
|             \item Klassen identifizieren
 | ||
|             \item Verhalten / Operationen finden
 | ||
|           \end{itemize*}
 | ||
|     \item Use Case durch Interaktion verfeinern
 | ||
|           \begin{itemize*}
 | ||
|             \item einfacher kurzer Ablauf: textuelle Beschreibung, Aktivitätsdiagramm
 | ||
|             \item Ablauf mit Verzweigungen, Parallelitäten: Aktivitätsdiagramm (Kontrollflussmodellierung)
 | ||
|             \item datengetriebener Ablauf: Aktivitätsdiagramm (Objektflussmodellierung)
 | ||
|             \item Interaktion zwischen den Objekten wichtig: Kommunikationsdiagramm, Aktivitätsdiagramm (Aktivitätsbereiche), Sequenzdiagramm
 | ||
|             \item zeitliche Abfolge steht im Mittelpunkt: Sequenzdiagramm
 | ||
|             \item Zustandswechsel / zeitliche Abfolge von Zuständen: Zustandsdiagramm / Timing-Diagramm
 | ||
|             \item komplexe Abläufe mit Verzweigungen und Parallelitäten: Interaktionsübersichtsdiagramm
 | ||
|             \item komplexe Abläufe ohne Verzweigungen und Parallelitäten: weitere Verfeinerung durch Use-Case-Diagramm
 | ||
|             \item komplexer strukturierter Ablauf: Kollaboration aus dem Kompositionsstrukturdiagramm
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Dynamische UML-Modelle
 | ||
|   \begin{itemize*}
 | ||
|     \item Abläufe
 | ||
|           \begin{itemize*}
 | ||
|             \item Aktivitätsdiagramm (activity diagram)
 | ||
|             \item Kommunikationsdiagramm (communication diagram)
 | ||
|             \item Sequenzdiagram (sequence diagram)
 | ||
|             \item Zeitdiagramm (timing diagram)
 | ||
|           \end{itemize*}
 | ||
|     \item Zustandsabhängiges Verhalten von Objekten
 | ||
|           \begin{itemize*}
 | ||
|             \item Zustandsautomat (state chart diagram)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Aktivitätsdiagramm
 | ||
|           \begin{itemize*}
 | ||
|             \item Aktion - einzelner Schritt
 | ||
|             \item Aktivität
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Beschreibt einen Ablauf / repräsentiert ein Verhalten
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Beinhaltet eine Folge Aktionen, Kontroll- oder Objektknoten
 | ||
|                           \end{itemize*}
 | ||
|                     \item Schachtelung von Aktivitäten und Aktionen
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Aktionen in Aktivitäten enthalten
 | ||
|                             \item Aktionen durch Aktivitäten verfeinerbar
 | ||
|                           \end{itemize*}
 | ||
|                     \item Aktivitäten beschreiben / verfeinern
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Aktionen, Use Cases, Interaktionen, Operationen ...
 | ||
|                           \end{itemize*}
 | ||
|                     \item Ein- und Ausgabeparameter in Form von Objekten
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Parameterknoten entsprechend Pins der aufrufenden Aktion
 | ||
|                             \item Alternativ: Parameterangabe mit Name und Typ
 | ||
|                           \end{itemize*}
 | ||
|                     \item Angabe von Vor- und Nachbedingungen möglich
 | ||
|                     \item Optional: Parameter unter Aktivitätsnamen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Verfeinerung der Aktionen durch Aktivitäten
 | ||
|     \item Aktion durch Interaktionen verfeinern
 | ||
|           \begin{itemize*}
 | ||
|             \item Detaillierte Diagramme
 | ||
|             \item Meist entwurfsnah
 | ||
|           \end{itemize*}
 | ||
|     \item Verfeinerung der Aktionen durch StateChart
 | ||
|     \item Objekte zusammenstellen und klassifizieren
 | ||
|           \begin{itemize*}
 | ||
|             \item Toolunterstützung (Möglichkeiten stark toolabhängig)
 | ||
|             \item Objekte Ergebnis der Verhaltensmodellierung
 | ||
|             \item Ergebnis Verhaltensdiagramm: Operationen der Klassen
 | ||
|             \item Klassen generalisieren / spezialisieren $\rightarrow$ Klassenhierarchie
 | ||
|           \end{itemize*}
 | ||
|     \item Übergang zum Entwurf
 | ||
|           \begin{itemize*}
 | ||
|             \item Klassenstruktur festlegen
 | ||
|           \end{itemize*}
 | ||
|     \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 Gesamtheit der Forderungen eines Auftraggebers (AG) an die Lieferungen und Leistungen eines Auftragnehmers (AN), manchmal Vertragsbasis
 | ||
|             \item Muss-Kriterien, Kann-Kriterien, Abgrenzungskriterien
 | ||
|           \end{itemize*}
 | ||
|     \item Pflichtenheft
 | ||
|           \begin{itemize*}
 | ||
|             \item Entwurf aus AN-Sicht, Umsetzung des Lastenhefts
 | ||
|             \item Meist Vertragsbasis
 | ||
|           \end{itemize*}
 | ||
|     \item Inhalt Anforderungsspezifikation
 | ||
|           \begin{itemize*}
 | ||
|             \item Zielsetzung
 | ||
|             \item Allgemeine Beschreibung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Umgebung, generelle Funktion, Restriktionen, Benutzer
 | ||
|                   \end{itemize*}
 | ||
|             \item Spezifische funktionale Anforderungen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item möglichst quantitativ (z.B. Tabellenform)
 | ||
|                     \item eindeutig identifizierbar (Nummern)
 | ||
|                   \end{itemize*}
 | ||
|             \item Spezifische nicht-funktionale Anforderungen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item z.B. Antwortzeit, Speicherbedarf, HW/SW-Plattform
 | ||
|                     \item Entwicklungs- und Produkt-Standards
 | ||
|                   \end{itemize*}
 | ||
|             \item Qualitäts-Zielbestimmung
 | ||
|             \item Zu erwartende Evolution des Systems, Versionen
 | ||
|             \item Abkürzungsverzeichnis, Glossar, Index, Referenzen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   Pflichtenheft (Beispiel)
 | ||
|   \begin{enumerate}
 | ||
|     \item Einleitung, Zielbestimmung
 | ||
|     \item Übersicht
 | ||
|           \begin{itemize*}
 | ||
|             \item Einsatzbereich, Zielgruppen
 | ||
|             \item Produkt-Umgebung
 | ||
|             \item Produkt-Funktionen
 | ||
|             \item Restriktionen
 | ||
|             \item Annahmen und Abhängigkeiten
 | ||
|             \item Vorhandenes System (ggf.)
 | ||
|           \end{itemize*}
 | ||
|     \item Vorgeschlagenes System
 | ||
|           \begin{itemize*}
 | ||
|             \item Übersicht
 | ||
|             \item Funktionale Anforderungen
 | ||
|             \item Benutzungsschnittstelle
 | ||
|             \item Nichtfunktionale Anforderungen
 | ||
|             \item Systembeschreibung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Szenarien
 | ||
|                     \item Anwendungsfälle
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Glossar
 | ||
|   \end{enumerate}
 | ||
| 
 | ||
| 
 | ||
|   \section{Grobentwurf}
 | ||
|   \subsection{Einführung}
 | ||
|   Systementwurf - Aufgabe
 | ||
|   \begin{itemize*}
 | ||
|     \item Sicht des geplanten Systems von innen (Entwickler)
 | ||
|     \item Wie sollen vereinbartes Verhalten und Funktionen (Analysemodell) intern realisiert werden?
 | ||
|     \item Von Spezifikation von Anforderungen und Funktionen -> Vorbereitung der Implementierung
 | ||
|     \item Formal: Transformation des Analysemodells in ein Systementwurfsmodell
 | ||
|     \item System(grob)entwurf, Feinentwurf/Objektentwurf
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Teile und herrsche
 | ||
|   \begin{itemize*}
 | ||
|     \item Grobentwurf
 | ||
|           \begin{itemize*}
 | ||
|             \item Entwurfsziele identifizieren
 | ||
|             \item Grobe Systemstruktur festlegen (Architektur)
 | ||
|             \item Zerlegung in Subsysteme, Spezifikation
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Schichten, Pakete, Komponenten
 | ||
|                   \end{itemize*}
 | ||
|             \item Bewerten der Zerlegung anhand der Entwurfsziele
 | ||
|             \item Schnittstellen festlegen
 | ||
|           \end{itemize*}
 | ||
|     \item Feinentwurf
 | ||
|           \begin{itemize*}
 | ||
|             \item Subsysteme im Detail entwerfen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Strukturierung der Komponenten
 | ||
|                     \item Klassen, Objekte, Funktionen, Datenstrukturen
 | ||
|                     \item Verhalten, Algorithmen - Teillösungen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Systemzerlegung}
 | ||
|   Vorgehen
 | ||
|   \begin{itemize*}
 | ||
|     \item Zerlegung eines Systems in Subsysteme
 | ||
|     \item Betrachtung der Lösungsdomäne!
 | ||
|     \item Subsysteme weiter zerlegen bis Komplexität ausreichend klein ist z.B. für Arbeitspakete
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Was macht ein Subsystem aus?
 | ||
|   \begin{itemize*}
 | ||
|     \item Schnittstellen, Funktionen, „Verantwortung“
 | ||
|     \item Was bietet es an?
 | ||
|     \item Was benutzt es?
 | ||
|     \item Was tut es intern?
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Operation
 | ||
|   \begin{itemize*}
 | ||
|     \item Name und Parameter
 | ||
|     \item Funktion, Prozedur, Methode, Eintrittspunkt ...
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Dienst: Satz von Operationen, die bereitgestellt werden
 | ||
| 
 | ||
|   Abhängigkeiten von Subsystemen
 | ||
|   \begin{itemize*}
 | ||
|     \item Subsysteme untereinander: Kopplung (coupling)
 | ||
|     \item Maß für die Abhängigkeit von Subsystemen
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Möglichst lose Kopplung
 | ||
|   \begin{itemize*}
 | ||
|     \item Änderungen in einem beteiligten Subsystem haben geringe Auswirkungen (Stabilität)
 | ||
|     \item Erleichtert Wartbarkeit und Arbeitsteilung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Mittel zur Verringerung der Kopplung
 | ||
|   \begin{itemize*}
 | ||
|     \item Zusätzliche Unterteilung in Subsysteme
 | ||
|     \item Aber: dann größere Komplexität!
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Abhängigkeiten von Subsystemen
 | ||
|   %| Kopplungsart | Bemerkung |
 | ||
|   %| -\item | -\item |
 | ||
|   %| Datenkopplung (gemeinsame Daten) | Möglichst vermeiden! Wenn nicht möglich, Verwaltung zentralisieren und Zugriff über Schnittstelle |
 | ||
|   %| Schnittstellenkopplung (gegenseitiger Aufruf) | Akzeptabel |
 | ||
|   %| Strukturkopplung (gemeinsame Strukturelemente) | Vermeiden! (z.B. keine Vererbung über Paketgrenzen hinweg) |
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Elemente eines Subsystems: Kohäsion (cohesion)
 | ||
|     \item Maß für Zusammengehörigkeit der Elemente
 | ||
|     \item Möglichst hohe Kohäsion
 | ||
|           \begin{itemize*}
 | ||
|             \item Enge Beziehung oder ähnliche Aufgaben der Elemente
 | ||
|             \item Erleichtert Verständnis, Wartung und Anpassung
 | ||
|           \end{itemize*}
 | ||
|     \item Mittel zum Erreichen hoher Kohäsion
 | ||
|           \begin{itemize*}
 | ||
|             \item Datenkapselung, Objektorientierung
 | ||
|             \item Benutzung geeigneter Patterns (Kapitel 5)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Metriken für modulare Entwürfe
 | ||
|   \begin{itemize*}
 | ||
|     \item Fan-in / fan-out-Metrik [S.Henry, D. Kafura 1981]:
 | ||
|           \begin{itemize*}
 | ||
|             \item Fan-in: Anzahl der Stellen, wo Kontrollfluss auf das betrachtete Modul M übergeht (Aufrufe von Funktionen / Prozeduren in M) + Anzahl globaler Variablen, die in M zugänglich sind
 | ||
|             \item Fan-out: Anzahl von Stellen, an denen M andere Module aufruft + Anzahl der globalen Variablen, die von M verändert werden
 | ||
|           \end{itemize*}
 | ||
|     \item Heuristik Kopplung / Kohäsion
 | ||
|           \begin{itemize*}
 | ||
|             \item Hoher Fan-out bedeutet hohe Kopplung, minimieren
 | ||
|             \item Hoher Fan-in kann auf geringe Kohäsion von M hindeuten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Komplexität beherrschen: "Wenn Du es nicht in fünf Minuten erklären kannst, hast Du es entweder selbst nicht verstanden oder es funktioniert nicht." [Rechtin, Maier: The Art of Systems Architecting 2000]
 | ||
| 
 | ||
|   Vorgehen: Heuristiken und Erfahrungen
 | ||
|   \begin{itemize*}
 | ||
|     \item „Erfahrung ist die härteste Lehrerin. Sie gibt Dir zuerst den Test und anschließend den Unterricht.“ [Ruth 1993]
 | ||
|     \item „Ein Architekt der zu Beginn seiner Arbeit vollständige und konsistente Anforderungen benötigt, mag ein brillanter Entwickler sein - aber er ist kein Architekt“ [Rechtin 2000]
 | ||
|     \item „Das Leben von Software-Architekten besteht aus einer langen und schnellen Abfolge suboptimaler Entwurfs-entscheidungen, die teilweise im Dunkeln getroffen werden.“ [Kruchten2001]
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Wie organisiert man Subsysteme?
 | ||
|   \begin{itemize*}
 | ||
|     \item Innerhalb einer Verfeinerungsstufe: fachlich orientierte Zerlegung
 | ||
|     \item Mehrfache Zerlegung: Hierarchie-Graph der Verfeinerung
 | ||
|   \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*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Geschlossene Schichtenarchitektur
 | ||
|           \begin{itemize*}
 | ||
|             \item Beispiel: OSI-Modell für Kommunikationssysteme
 | ||
|           \end{itemize*}
 | ||
|     \item Offene Schichtenarchitektur
 | ||
|           \begin{itemize*}
 | ||
|             \item Beispiel: Java Swing auf X11-Plattform
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Prinzipien des OO-Entwurfs
 | ||
|   \begin{itemize*}
 | ||
|     \item So-einfach-wie-möglich-Prinzip (KISS)
 | ||
|     \item Fehler berücksichtigen (Strukturierung, Kapselung, Modularisierung, Wiederverwendung)
 | ||
|     \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 Schnittstellen (eher viele kleine als eine große)
 | ||
|             \item Umkehr der Abhängigkeiten (dependency inversion-Prinzip)
 | ||
|           \end{itemize*}
 | ||
|     \item Offen / Geschlossen Prinzip
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Zyklische Abhängigkeiten vermeiden
 | ||
|   \begin{itemize*}
 | ||
|     \item Änderungen wirken sich auf beide Komponenten aus
 | ||
|     \item Probleme beim Löschen und Initialisieren
 | ||
|     \item Auflösen durch
 | ||
|           \begin{itemize*}
 | ||
|             \item Gemeinsame Klassen in separates Paket
 | ||
|             \item Gemeinsame Schnittstellen definieren
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Symptome schlechten Designs
 | ||
|   \begin{itemize*}
 | ||
|     \item Starrheit
 | ||
|           \begin{itemize*}
 | ||
|             \item Einfache Änderungen schwierig realisierbar
 | ||
|             \item Einfache Änderungen führen zur Modifikation einer Vielzahl von Komponenten
 | ||
|           \end{itemize*}
 | ||
|     \item Zerbrechlichkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Änderungen an einer Stelle führen zu Fehlern an völlig anderer Stelle
 | ||
|           \end{itemize*}
 | ||
|     \item Schlechte Wiederverwendbarkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Komponenten können Aufgrund spezieller Anhängigkeiten kaum wiederverwendet werden
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Wann ist ein Entwurf „gut“?
 | ||
|   \begin{itemize*}
 | ||
|     \item Korrekt
 | ||
|           \begin{itemize*}
 | ||
|             \item Erfüllung der Anforderungen
 | ||
|             \item Wiedergabe aller Funktionen des Systemmodells
 | ||
|             \item Sicherstellung der nichtfunktionalen Anforderungen
 | ||
|           \end{itemize*}
 | ||
|     \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! (Architektur, Subsysteme, Komponenten)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Architekturmodelle}
 | ||
|   \begin{itemize*}
 | ||
|     \item Modellierung mit UML
 | ||
|           \begin{itemize*}
 | ||
|             \item Bisher: logische Sicht
 | ||
|             \item Technisch: Organisation in Paketen, Namensraum, Import
 | ||
|           \end{itemize*}
 | ||
|     \item Paketdiagramm
 | ||
|           \begin{itemize*}
 | ||
|             \item Gliederung (Strukturierung) des Systems in Teile
 | ||
|             \item Zuordnung von Elementen zu einem Paket
 | ||
|             \item Hierarchien und Abhängigkeiten zwischen den Paketen
 | ||
|             \item Anwendung: Definition von Schichten
 | ||
|           \end{itemize*}
 | ||
|     \item Enthält-Beziehung
 | ||
|           \begin{itemize*}
 | ||
|             \item Definiert, in welchem Paket ein Element enthalten ist
 | ||
|             \item Ermöglicht qualifizierten Zugriff auf enthaltene Elemente
 | ||
|             \item Löschen des Pakets bewirkt Löschen beinhalteter Elemente
 | ||
|             \item Definition von Sichtbarkeit / Zugriffsrechte
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Auswirkung auf weitere Enthält-Beziehung
 | ||
|                     \item '+' - public (default)
 | ||
|                     \item '-' - private
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Paket- / Element-Import
 | ||
|           \begin{itemize*}
 | ||
|             \item Unqualifizierter Zugriff auf Elemente eines anderen Namensraums (Paketes)
 | ||
|           \end{itemize*}
 | ||
|     \item Komponentendiagramm
 | ||
|           \begin{itemize*}
 | ||
|             \item Komponente - modulare, austauschbare Einheit
 | ||
|             \item Strukturierung des Systems durch Komponenten
 | ||
|             \item Modellierung der
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Abhängigkeiten zwischen Komponenten
 | ||
|                     \item inneren Struktur von Komponenten
 | ||
|                   \end{itemize*}
 | ||
|             \item Definition von Schnittstellen
 | ||
|             \item Verwendung von Elementen aus Klassen- und Objektdiagramm
 | ||
|             \item Stärkere dynamische Sicht -> kein Verhalten
 | ||
|             \item Komponente <<component>>
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Kapselt Funktionalitäten (Physisch gruppierte Klassen)
 | ||
|                     \item „Spezialisierte“ Klasse (Vererbung, Exemplare möglich)
 | ||
|                     \item Stellt Funktionalitäten über Schnittstellen bereit
 | ||
|                     \item Definiert benötigte Schnittstellen
 | ||
|                     \item Enthält Klassen oder weitere Komponenten
 | ||
|                     \item Modulares Element: Substitution (Austauschbarkeit) steht im Vordergrund
 | ||
|                   \end{itemize*}
 | ||
|             \item Black-Box-Darstellung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Zur Verfügung gestellte Funktionalität `<<provided interfaces>>`
 | ||
|                     \item Benötigte Funktionalität `<<required interfaces>>`‚
 | ||
|                   \end{itemize*}
 | ||
|             \item White-Box-Darstellung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Interner Aufbau der Komponente `<<realization>>`
 | ||
|                     \item Artefakte `<<artifacts>>`‚ Realisierende physische Einheit (z.B.: .dll)
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Schnittstellen / Interfaces
 | ||
|   \begin{itemize*}
 | ||
|     \item Definition Diagrammunabhängig
 | ||
|           \begin{itemize*}
 | ||
|             \item Meist Klassendiagramm
 | ||
|           \end{itemize*}
 | ||
|     \item Ähnlich Semantik einer Klasse
 | ||
|           \begin{itemize*}
 | ||
|             \item Nur public-Attribute und Operationen
 | ||
|           \end{itemize*}
 | ||
|     \item Definiert Verpflichtung zur Implementierung von
 | ||
|           \begin{itemize*}
 | ||
|             \item Operationen
 | ||
|             \item Merkmale -> Attribute dürfen definiert werden
 | ||
|             \item Verpflichtungen (z.B.: Vor- / Nachbedingungen)
 | ||
|           \end{itemize*}
 | ||
|     \item Meist abstrakte Klassen mit abstrakten Operationen
 | ||
|     \item Abstrakt - muss überschrieben werden
 | ||
|     \item Notation
 | ||
|           \begin{itemize*}
 | ||
|             \item Stereotyp: <<Interface>>
 | ||
|             \item Meist kursiv geschrieben, da abstrakte Klasse
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Schnittstellenrealisierung, Implementierungsbeziehung
 | ||
|   \begin{itemize*}
 | ||
|     \item Schnittstellen werden realisiert, nicht instanziiert
 | ||
|     \item Schnittstellenkonform
 | ||
|           \begin{itemize*}
 | ||
|             \item Klasse realisiert alle Attribute und Operationen
 | ||
|           \end{itemize*}
 | ||
|     \item Schnittstelle kann von anderen Schnittstellen erben
 | ||
|     \item Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen -> Generalisierung verwenden
 | ||
|     \item Darstellung
 | ||
|           \begin{itemize*}
 | ||
|             \item Gestrichelte Linie mit nicht gefülltem Dreieck an der Seite der Superklasse
 | ||
|             \item Alternativ: Lollipop-Darstellung
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Softwarearchitekturmuster}
 | ||
|   \begin{itemize*}
 | ||
|     \item Wiederverwendung auf sehr hoher Abstraktionsstufe
 | ||
|     \item Falls geplante Anwendung passt, anwenden!
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Schichten-Architektur (layers)
 | ||
|   \begin{itemize*}
 | ||
|     \item Problem
 | ||
|           \begin{itemize*}
 | ||
|             \item Komplexität: Strukturierung des Systems, unterschiedliche Abstraktionsebenen
 | ||
|             \item Änderungen sollen möglichst lokal bleiben
 | ||
|             \item Teilsysteme sollen austauschbar, wiederverwendbar und getrennt entwickelbar sein
 | ||
|             \item Schnittstellen sollen stabil sein
 | ||
|           \end{itemize*}
 | ||
|     \item Lösung
 | ||
|           \begin{itemize*}
 | ||
|             \item Zuordnung von Subsystemen zu horizontalen Schichten gleicher Abstraktionsebene
 | ||
|             \item Komponenten einer Schicht bieten Dienste der darüber liegenden Schicht an
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Client-Server (Klient/Anbieter)
 | ||
|   \begin{itemize*}
 | ||
|     \item Client (front-end)
 | ||
|           \begin{itemize*}
 | ||
|             \item Benutzungsschnittstelle
 | ||
|             \item Einbindung in Geschäftsprozesse
 | ||
|             \item Entkoppelt von Netztechnologie und Datenhaltung
 | ||
|           \end{itemize*}
 | ||
|     \item Server (back-end)
 | ||
|           \begin{itemize*}
 | ||
|             \item Datenhaltung, evtl. Fachlogik
 | ||
|           \end{itemize*}
 | ||
|     \item Genauer: Two-tier client/server architecture
 | ||
|     \item Asynchroner Kontrollfluss
 | ||
|     \item Aufteilung Funktionen Client / Server
 | ||
|           \begin{itemize*}
 | ||
|             \item Mehr Funktionen im Server:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item zentrale Verwaltung, Wartungsaufwand geringer, Portabilität, einfache Client-Hardware (Net PC)
 | ||
|                     \item „Thin Client“ - nur GUI
 | ||
|                   \end{itemize*}
 | ||
|             \item Mehr Funktionen im Client: Flaschenhals Server wird entlastet, individuellere Client-Funktionen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item „Fat Client“ - Teil der Anwendung im Client
 | ||
|                   \end{itemize*}
 | ||
|             \item Entscheidet mit über Umsetzung (Java Script, ...)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Three-Tier / Four-Tier Architecture: Client/Server mit weiterer Aufteilung ähnlich Repository
 | ||
| 
 | ||
|   Bewertung Client-Server
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Leicht verständlich
 | ||
|             \item Änderungen bleiben lokal
 | ||
|             \item Geringere Kopplung zwischen den Schichten
 | ||
|             \item Schichten austauschbar und wiederverwendbar
 | ||
|             \item Getrennte Entwicklung der Schichten möglich
 | ||
|             \item Vorhandene / stabilere Schnittstellen
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Geringere Performance
 | ||
|             \item Zusätzlicher Verwaltungs- oder Datenoverhead
 | ||
|             \item Manche Änderungen führen zu Änderungen in allen Schichten (z.B. neues Datenfeld)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Pipes and Filters
 | ||
|   \begin{itemize*}
 | ||
|     \item Datenstrom- oder Kontrollflussorientiertes System
 | ||
|     \item Lose verbundene Berechnungskomponenten
 | ||
|     \item Kombination der Berechnungskomponenten nur vom Typ der Ein- und Ausgabedaten abhängig
 | ||
|     \item Leicht erweiterbar System gewünscht
 | ||
|     \item Parallele Verarbeitung vorteilhaft
 | ||
|     \item Verwendung von globalen Steuerungskontrollstrukturen (Parallelisierung, Verzweigung, Schleifen) gewünscht
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Stark entkoppelte Komponenten
 | ||
|             \item Hohe Flexibilität gegenüber Änderungen \& Erweiterungen
 | ||
|             \item Hoher Wiederverwendungsgrad der Komponenten
 | ||
|             \item Unabhängige Entwicklung der Komponenten
 | ||
|             \item Leichte Parallelisierung der Berechnungen möglich
 | ||
|             \item Überprüfung der Datenkompatibilität dynamisch / statisch
 | ||
|           \end{itemize*}
 | ||
|     \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 Zielstellung
 | ||
|           \begin{itemize*}
 | ||
|             \item Stabile, verbreitete Standard-Anwendung (Kern)
 | ||
|             \item Funktionalität soll durch Komponenten leicht erweiterbar sein
 | ||
|             \item Dritte sollen Komponenten leicht erstellen können
 | ||
|           \end{itemize*}
 | ||
|     \item Lösung
 | ||
|           \begin{itemize*}
 | ||
|             \item Möglichst schlanker zentraler Kern
 | ||
|             \item Plugin-Manager verwaltet Komponenten: Laden, Entladen, Zugriffskontrolle, Konfiguration
 | ||
|           \end{itemize*}
 | ||
|     \item Plugin
 | ||
|           \begin{itemize*}
 | ||
|             \item Komponente mit Standard-Schnittstelle
 | ||
|             \item Erweitert Funktionalität (extension point)
 | ||
|           \end{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Robustes Verhalten
 | ||
|             \item Trennung der Zuständigkeiten
 | ||
|             \item Erweiterbar, Austauschbar, Wiederverwendbar
 | ||
|             \item Geringe Kopplung zu den Komponenten
 | ||
|             \item Anpassung an eigene Bedürfnisse möglich
 | ||
|             \item Leichte Aufteilung der Entwicklung der Arbeitspakete
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Höherer initialer Aufwand
 | ||
|             \item Verwaltungsoverhead zur Laufzeit
 | ||
|             \item Versionsverwaltung der Komponenten nötig
 | ||
|             \item Abhängigkeiten unter den Komponenten schwierig realisierbar
 | ||
|             \item Geschickte Definition der Extension Points nötig
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Repository (Depot, blackboard)
 | ||
|   \begin{itemize*}
 | ||
|     \item Zentrale Datenhaltung
 | ||
|           \begin{itemize*}
 | ||
|             \item Datenbankmanagementsystem, Dateisystem
 | ||
|           \end{itemize*}
 | ||
|     \item Anwendungen tauschen Daten nur über Repository aus
 | ||
|     \item Kontrollfluss z.B. über Signale oder Semaphore
 | ||
|     \item Gut für datenintensive Verarbeitungsaufgaben geeignet
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Peer-to-peer
 | ||
|   \begin{itemize*}
 | ||
|     \item Gleichberechtigte Partner, “Föderation”
 | ||
|     \item Verteilte kommunizierende Subsysteme
 | ||
|     \item Orts- und Umgebungsunabhängigkeit
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Model-View-Controller (MVC)
 | ||
|   \begin{itemize*}
 | ||
|     \item Modell / Sicht / Steuerung
 | ||
|     \item Trennung verschiedener Aufgabengebiete:
 | ||
|           \begin{itemize*}
 | ||
|             \item Model: verwaltet Domänenwissen, Daten und Zustand; häufig Datenbank
 | ||
|             \item View: Darstellung, Anzeige, GUI
 | ||
|             \item Controller: Steuerung der Interaktion, Nutzerbefehle
 | ||
|           \end{itemize*}
 | ||
|     \item Erlauben Austausch von Anzeige- und Speichersystem
 | ||
|     \item Kontrollfluss
 | ||
|           \begin{itemize*}
 | ||
|             \item Controller steuert
 | ||
|             \item View wird über Datenänderungen benachrichtigt (callback)
 | ||
|           \end{itemize*}
 | ||
|     \item Geeignet für interaktive Systeme
 | ||
|     \item Problem
 | ||
|           \begin{itemize*}
 | ||
|             \item Lose Kopplung zwischen verschiedenen Komponenten
 | ||
|             \item Daten werden in verschiedenen Sichten dargestellt
 | ||
|             \item Realisierung von GUI‘s
 | ||
|           \end{itemize*}
 | ||
|     \item Lösung durch drei Komponenten
 | ||
|           \begin{itemize*}
 | ||
|             \item Daten (Model) enthält die Kernfunktionalität / Durchführung der Geschäftsprozesse, kapselt und Speichert die Daten
 | ||
|             \item Sichten bzw. Dialoge (View) stellt die Daten für den Anwender in unterschiedlicher Art dar
 | ||
|             \item Logik bzw. Steuerung (Controller) Realisiert die Interaktion mit dem Benutzer, übernimmt die Eingaben vom View und ändert die Daten im Modell, legt die Darstellungsart der Sichten fest
 | ||
|           \end{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Unabhängige Entwicklung der Komponenten
 | ||
|             \item Änderung der Oberfläche ohne Änderung des Modells
 | ||
|             \item Unterschiedliche Oberflächen für das selbe Modell
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Performance
 | ||
|             \item Erhöhter initialer Entwicklungsaufwand
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Frameworks}
 | ||
|   Was ist ein Framework?
 | ||
|   \begin{itemize*}
 | ||
|     \item A framework is a set of prefabricated software building blocks that programmers can use, extend, or customize for specific computing solutions [Taligent]
 | ||
|     \item Ein framework (Rahmenwerk, Anwendungsgerüst) ist eine Menge von zusammengehörigen Klassen, die einen abstrakten Entwurf für eine Problemfamilie darstellen [nach Pomberger/Blaschek]
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Ziele
 | ||
|   \begin{itemize*}
 | ||
|     \item Wiederverwendung von Code, Architektur, Entwurfsprinzipien und Verhaltensschema
 | ||
|     \item Ähnliche Benutzungsschnittstelle
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Klassifikation I
 | ||
|   \begin{itemize*}
 | ||
|     \item Anwendungs-Framework (application framework)
 | ||
|           \begin{itemize*}
 | ||
|             \item Gibt Systemarchitektur für typische Anwendungsstruktur vor
 | ||
|             \item GUI-Framework: Motif, Qt, Swing, ...
 | ||
|           \end{itemize*}
 | ||
|     \item Bereichsspezifisches Framework (domain framework)
 | ||
|           \begin{itemize*}
 | ||
|             \item Expertenwissen für Anwendungsbereich
 | ||
|             \item für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, ...
 | ||
|             \item Beispiel: AUTOSAR
 | ||
|           \end{itemize*}
 | ||
|     \item Infrastrukturgerüst (support framework)
 | ||
|           \begin{itemize*}
 | ||
|             \item Gerätetreiber, Anpassung an Hardware
 | ||
|             \item Middleware: DCOM, Java RMI, CORBA, WebSphere, ...
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Klassifikation II
 | ||
|   \begin{itemize*}
 | ||
|     \item Offene Programmgerüste (white box)
 | ||
|           \begin{itemize*}
 | ||
|             \item Erweiterbarkeit durch Vererbung und dynamische Bindung
 | ||
|             \item Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden
 | ||
|           \end{itemize*}
 | ||
|     \item Geschlossene Programmgerüste (black box)
 | ||
|           \begin{itemize*}
 | ||
|             \item Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können
 | ||
|             \item Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   Webframeworks - Angular JS
 | ||
|   \begin{itemize*}
 | ||
|     \item Clientseitiges Webframework von Google
 | ||
|     \item Frei verwendbar (Open Source)
 | ||
|     \item Erstellung von Single-Page-Webanwendungen
 | ||
|     \item Model View Prinzip
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Weitergabe von Expertenwissen
 | ||
|             \item Durchdachtes Design: langfristige Aufwandsersparnis
 | ||
|             \item Wartungsaufwand reduziert, systematische Tests möglich
 | ||
|             \item Prinzipiell sehr hohe Produktivität möglich
 | ||
|             \item Erleichtert Integration und Konsistenz verwandter Anforderungen
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Erstellung und Einarbeitung aufwändig
 | ||
|             \item Zusätzlicher Dokumentations- und Wartungsaufwand
 | ||
|             \item Fehlersuche erschwert durch Overhead des Frameworks
 | ||
|             \item Kombination verschiedener Frameworks sehr schwierig
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Systemarchitektur und Verteilung}
 | ||
|   Systemarchitektur
 | ||
|   \begin{itemize*}
 | ||
|     \item Aufbau und Elemente der Ablaufumgebung, Hardware
 | ||
|     \item Häufig enger Zusammenhang mit Softwarearchitektur
 | ||
|           \begin{itemize*}
 | ||
|             \item Architekturmuster
 | ||
|             \item Ablaufmuster
 | ||
|           \end{itemize*}
 | ||
|     \item Besonders bei eingebetteten Systemen
 | ||
|     \item Systemarchitektur hat Einfluss auf Softwarearchitektur
 | ||
|           \begin{itemize*}
 | ||
|             \item Grenzobjekte, Schnittstellen, ...
 | ||
|           \end{itemize*}
 | ||
|     \item Gute Systemarchitektur?
 | ||
|           \begin{itemize*}
 | ||
|             \item Nichtfunktionale Anforderungen
 | ||
|             \item Modellierung und Simulation, Lastmessungen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Typische Strukturen
 | ||
|   \begin{itemize*}
 | ||
|     \item Zentralrechner (mainframe) mit Terminals
 | ||
|     \item Server und einfache Stationen
 | ||
|     \item PCs und Server
 | ||
|     \item Kommunikationsverbindungen, Sensoren, Speicher, ...
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Blockdiagramm
 | ||
|           \begin{itemize*}
 | ||
|             \item Klassisches Beschreibungsmittel für Systemaufbau
 | ||
|             \item Nicht Teil von UML
 | ||
|           \end{itemize*}
 | ||
|     \item Konfigurationsdiagramm
 | ||
|           \begin{itemize*}
 | ||
|             \item meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten
 | ||
|             \item Nicht Teil von UML
 | ||
|           \end{itemize*}
 | ||
|     \item Verteilungsdiagramm (UML deployment diagram)
 | ||
|           \begin{itemize*}
 | ||
|             \item Darstellung der Hardwaretopologie
 | ||
|             \item Zuordnung von Artefakten zu Hardwareeinheiten (Knoten)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Verteilung von Systembestandteilen auf Hardware
 | ||
|                   \end{itemize*}
 | ||
|             \item Kommunikationsverbindung und Abhängigkeiten zwischen Knoten
 | ||
|             \item Relativ spät im Projekt Installation / Wartung des Systems
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Globaler Kontrollfluss}
 | ||
|   Globaler Kontrollfluss
 | ||
|   \begin{itemize*}
 | ||
|     \item Ablaufsicht der Architektur
 | ||
|           \begin{itemize*}
 | ||
|             \item Definition nebenläufiger Systemeinheiten (z.B. Prozesse)
 | ||
|             \item Steuerung der Abfolge von Einzelfunktionen
 | ||
|             \item Synchronisation und Koordination
 | ||
|             \item Reaktion auf externe Ereignisse
 | ||
|             \item Darstellung z.B. durch Sequenzdiagramme
 | ||
|           \end{itemize*}
 | ||
|     \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!
 | ||
|     \item Ablaufmuster
 | ||
|           \begin{itemize*}
 | ||
|             \item Zentral
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Call/Return (prozedural, synchron)
 | ||
|                     \item Master/Slave (nebenläufig mit zentraler Steuerung)
 | ||
|                   \end{itemize*}
 | ||
|             \item Dezentral
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Ereignisgesteuert (event-driven)
 | ||
|                     \item interrupts
 | ||
|                     \item publish-subscribe (ähnlich observer)
 | ||
|                     \item (selective) broadcast
 | ||
|                     \item Datenflussgesteuert (data flow architecture)
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Sonstiges}
 | ||
|   Ablauf des OO-Systementwurfs [B. Oesterreich]
 | ||
|   \begin{itemize*}
 | ||
|     \item Schichtenmodell definieren
 | ||
|     \item Verteilungsmodell definieren
 | ||
|     \item Fachliches Subsystemmodell definieren
 | ||
|     \item Ablaufverantwortlichkeiten definieren
 | ||
|     \item Komponentenspezifisches Klassenmodell entwickeln
 | ||
|     \item Komponentenschnittstelle entwerfen
 | ||
|     \item Zustandsmodelle weiterentwickeln
 | ||
|     \item Objektfluss modellieren
 | ||
|     \item Interaktionsmodelle entwickeln, Attribute definieren
 | ||
|     \item Dialoge spezifizieren
 | ||
|     \item Design-Diskurs
 | ||
|     \item Testgetriebene Entwicklung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Weitere Aufgaben beim Grobentwurf
 | ||
|   \begin{itemize*}
 | ||
|     \item Entwurf einer persistenten Datenverwaltung
 | ||
|           \begin{itemize*}
 | ||
|             \item Dateisystem, Datenbank
 | ||
|           \end{itemize*}
 | ||
|     \item Sicherheit
 | ||
|           \begin{itemize*}
 | ||
|             \item Zugriffskontrolle
 | ||
|             \item Fehlertoleranz (Daten und Hardware)
 | ||
|             \item Protokollfunktionen
 | ||
|           \end{itemize*}
 | ||
|     \item Kontrollfluss
 | ||
|           \begin{itemize*}
 | ||
|             \item Ausnahmen
 | ||
|             \item Starten, Initialisieren und Beenden der Anwendung
 | ||
|             \item „Randanwendungsfälle“
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Notwendigkeit der Architekturdokumentation
 | ||
|   \begin{itemize*}
 | ||
|     \item Quellcode aufgrund niedrigen Abstraktionsniveaus ungünstig für Dokumentation
 | ||
|     \item Überblick und Arbeitsteilung
 | ||
|     \item Lebensdauer von Systemen länger als geplant
 | ||
|     \item Fehler und Probleme leichter finden und beseitigen
 | ||
|     \item Neue Anforderungen mit angemessenem Aufwand erfüllen
 | ||
|     \item Vereinfachung der Wartung, Pflege, Erweiterung, Wiederverwendung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Dokumentation}
 | ||
|   \begin{itemize*}
 | ||
|     \item Grundprinzipien
 | ||
|           \begin{itemize*}
 | ||
|             \item Verständlich aus Sicht des Lesers formulieren (Glossar)
 | ||
|             \item Das Warum beschreiben (Entwurfsentscheidungen)
 | ||
|             \item Annahmen, Voraussetzungen, Randbedingungen dokumentieren
 | ||
|             \item Wiederholungen vermeiden
 | ||
|             \item Notation erklären oder Standards verwenden (UML)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Legende hinzufügen
 | ||
|                   \end{itemize*}
 | ||
|             \item Auf Zweckdienlichkeit prüfen, Reviews durchführen (Inhalt, Qualität)
 | ||
|             \item Verschiedene Sichten für verschiedene Zielgruppen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \section{Feinentwurf}
 | ||
| 
 | ||
|   %| Analyse-Modell | Entwurfs-Modell |
 | ||
|   %| -\item | -\item |
 | ||
|   %| Fachliche Domäne  | Lösungsdomäne |
 | ||
|   %| Teilweise unvollständig in Attributen und Operationen | Vollständige Angabe aller Attribute und Operationen |
 | ||
|   %| Datentypen und Parameter können noch fehlen | Vollständige Angabe von Datentypen und Parametern |
 | ||
|   %| Noch kaum Bezug zur Realisierungssprache | Auf Umsetzung in gewählter Programmiersprache bezogen |
 | ||
|   %| Keine Überlegungen zur Realisierung von Assoziationen | Navigationsangaben, Qualifikation, Ordnung, Verwaltungsklassen |
 | ||
|   %| | Entscheidung über Datenstrukturen, Anbindung GUI |
 | ||
| 
 | ||
|   Schließen der Lücke zwischen Grobentwurf und Implementierung
 | ||
|   \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!
 | ||
|           \begin{itemize*}
 | ||
|             \item Verbesserung des Entwurfs - Refactoring
 | ||
|             \item Optimieren des Entwurfsmodells zur Erfüllung nichtfunktionaler Anforderungen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Objektorientierter Feinentwurf
 | ||
|   \begin{itemize*}
 | ||
|     \item Ausgangspunkt
 | ||
|           \begin{itemize*}
 | ||
|             \item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen)
 | ||
|             \item Verteilungskonzept
 | ||
|             \item Ablaufmodell
 | ||
|           \end{itemize*}
 | ||
|     \item Ergebnis
 | ||
|           \begin{itemize*}
 | ||
|             \item OO-Modell für jedes Subsystem der Architektur
 | ||
|             \item OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien
 | ||
|             \item Spezifikationen der Klassen
 | ||
|             \item Spezifikationen von externen Schnittstellen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Klassen- und Objektentwurf}
 | ||
|   \begin{itemize*}
 | ||
|     \item Klassen der Lösungsdomäne
 | ||
|           \begin{itemize*}
 | ||
|             \item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen
 | ||
|           \end{itemize*}
 | ||
|     \item Entstehungsgründe
 | ||
|           \begin{itemize*}
 | ||
|             \item Architektur von Software und System
 | ||
|             \item nichtfunktionale Anforderungen
 | ||
|             \item Beispiele: Kommunikation, Fehlertoleranz, Adapter, Datenhaltung, Effizienz, Benutzerschnittstellenobjekte, Middleware, ...
 | ||
|             \item Sichtbare (Grenz- und Steuerungsobjekte) werden schon in der Analyse identifiziert
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Klassen identifizieren (responsibility-driven design (Wirfs-Brock, McKean))
 | ||
|   > Verantwortlichkeits-Prinzip: Sichtweise: Objekte und Klassen sind nicht nur Behälter für Verhalten und Daten, sondern erfüllen in Zusammenarbeit mit anderen Objekten bestimmte Aufgaben eigenverantwortlich
 | ||
| 
 | ||
|   Responsibility-Driven Design - Begriffe
 | ||
|   \begin{itemize*}
 | ||
|     \item Sichtweise auf Softwaresystem
 | ||
|     \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{itemize*}
 | ||
| 
 | ||
|   Arten von Rollen
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \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{itemize*}
 | ||
| 
 | ||
|   Hilfsmittel: CRC-Karten
 | ||
|   \begin{itemize*}
 | ||
|     \item Candidate (or class), Responsibility, Collaboration
 | ||
|     \item Informelles Mittel zum
 | ||
|           \begin{itemize*}
 | ||
|             \item Finden,
 | ||
|             \item Beschreiben und
 | ||
|             \item iterativen Verändern von Klassen
 | ||
|           \end{itemize*}
 | ||
|   \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 Probleme: Zugriff auf private oder ebenen-fremde Attribute
 | ||
|             \item Verwenden von get- und set-Operationen
 | ||
|             \item Zusicherungen einhalten
 | ||
|             \item Zugriffe zentralisieren
 | ||
|             \item Verbalisierung
 | ||
|             \item Zugriffsbeschränkung
 | ||
|           \end{itemize*}
 | ||
|     \item Zerlegung
 | ||
|           \begin{itemize*}
 | ||
|             \item Teile und Herrsche
 | ||
|             \item Zerlegen in Komponenten
 | ||
|             \item Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich
 | ||
|             \item Eigenschaften und Schnittstellen im Klassendiagramm
 | ||
|             \item Beziehungen zwischen Klassen: Assoziationen
 | ||
|             \item Aggregation
 | ||
|                   \begin{itemize*}
 | ||
|                     \item „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“
 | ||
|                     \item Schwache Bindung der Teile mit dem Ganzen
 | ||
|                     \item Notation: ungefüllte Raute am Ganzen
 | ||
|                   \end{itemize*}
 | ||
|             \item Komposition
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Wie Aggregation, jedoch stärkere Bindung
 | ||
|                     \item Teil nur einem Ganzen zugeordnet
 | ||
|                     \item Nur Multiplizität von 1 oder 0..1 möglich!
 | ||
|                     \item Gefüllte Raute am Ganzen
 | ||
|                   \end{itemize*}
 | ||
|             \item Polymorphie
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Reaktion auf eine Nachricht abhängig vom Typ des Objektes
 | ||
|                     \item Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte)
 | ||
|                     \item Überladen von Operationen
 | ||
|                     \item gleicher Operationsname, unterschiedliche Signatur
 | ||
|                     \item abstrakte Operationen: Virtuelle Operationen ohne Implementierung
 | ||
|                     \item abstrakte Klasse: Klasse mit abstrakten Operationen
 | ||
|                     \item Folgen:
 | ||
|                     \item von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt)
 | ||
|                     \item Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Vererbung im Entwurf
 | ||
|   \begin{itemize*}
 | ||
|     \item In der Analyse: Klassifikation von Objekten, Taxonomie, Spezialisierung/Verallgemeinerung, Organisation von Klassen in Hierarchien
 | ||
|     \item Verringerung von Redundanz und damit Inkonsistenzen
 | ||
|           \begin{itemize*}
 | ||
|             \item Funktionalität nur einmal implementieren!
 | ||
|             \item Spezifikations-Wiederverwendung
 | ||
|             \item Implementierungs-Wiederverwendung
 | ||
|           \end{itemize*}
 | ||
|     \item Verbesserung der Erweiterbarkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Abstrakte Schnittstellen einsetzen!
 | ||
|           \end{itemize*}
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Problem: Unabhängige Aspekte der Vererbungshierarchie
 | ||
|             \item Vermeidung: abstrakte Klassen oder Komposition
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Abstrakte Klassen
 | ||
|   \begin{itemize*}
 | ||
|     \item Nur Unterklassen, keine Instanzen
 | ||
|     \item Attribute in Unterklassen füllen
 | ||
|     \item Notation: Kursiv oder Stereotyp <<abstract>>
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Offen / Geschlossen-Prinzip [Meyer 1988]
 | ||
|   \begin{itemize*}
 | ||
|     \item Erweiterbarkeit eines Entwurfs
 | ||
|     \item Offen für Erweiterungen,
 | ||
|           \begin{itemize*}
 | ||
|             \item z.B. durch Vererbung / Polymorphie
 | ||
|             \item Virtuelle Operationen verwenden
 | ||
|             \item Verändert vorhandenes Verhalten nicht
 | ||
|             \item Erweiterung um zusätzliche Funktionen oder Daten
 | ||
|           \end{itemize*}
 | ||
|     \item Geschlossen für Änderungen
 | ||
|           \begin{itemize*}
 | ||
|             \item private Attribute
 | ||
|             \item Möglichst protected Operationen
 | ||
|           \end{itemize*}
 | ||
|     \item Beschränkung der Erweiterbarkeit
 | ||
|           \begin{itemize*}
 | ||
|             \item Keine Einschränkungen der Funktionalität der Basisklasse!
 | ||
|           \end{itemize*}
 | ||
|   \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. [Barbara Liskov 1987]
 | ||
|     \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 Gesetz von „schüchternen“ Objekten
 | ||
|     \item Objekte sollen nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren
 | ||
|     \item Aus einer Methode M dürfen (sollten) nur Nachrichten an Objekte gesendet werden, die ...
 | ||
|           \begin{itemize*}
 | ||
|             \item unmittelbarer Bestandteil des Objekts von M sind (super)
 | ||
|             \item M als Argument übergeben wurden
 | ||
|             \item direkt in M erzeugt wurden
 | ||
|             \item (oder sich in globalen Variablen befinden)
 | ||
|           \end{itemize*}
 | ||
|     \item Als Metrik überprüfbar
 | ||
|   \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{Entwurfsmodelle}
 | ||
|   Klassendiagramm
 | ||
|   \begin{itemize*}
 | ||
|     \item Eigenschaften
 | ||
|           \begin{itemize*}
 | ||
|             \item Modellierung der statischen Struktur (Aufbau)
 | ||
|             \item Modellierung der Struktur von Daten
 | ||
|             \item Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander)
 | ||
|             \item Wichtigstes und bekanntestes Diagramm der UML!
 | ||
|           \end{itemize*}
 | ||
|     \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*}
 | ||
| 
 | ||
|   Aktive Klassen
 | ||
|   \begin{itemize*}
 | ||
|     \item Reagieren nicht nur, sondern werden von sich aus aktiv
 | ||
|     \item Z.B. Steuerobjekte
 | ||
|     \item Als Thread oder Prozess realisiert
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Schnittstellen}
 | ||
|   \begin{itemize*}
 | ||
|     \item Vereinbarung über Art des Aufrufs
 | ||
|           \begin{itemize*}
 | ||
|             \item Homogenität gleicher Funktionen
 | ||
|             \item Enthält:
 | ||
|             \item Spezifikation von Operationen
 | ||
|             \item keine Implementierung ( Java, nicht UML!)
 | ||
|             \item keine Attribute
 | ||
|             \item In Java außerdem anstelle von Mehrfachvererbung
 | ||
|           \end{itemize*}
 | ||
|     \item Schnittstellen in UML
 | ||
|           \begin{itemize*}
 | ||
|             \item Funktion ähnlich abstrakter Klasse
 | ||
|             \item Meist für technische Aspekte
 | ||
|             \item Notation: Stereotyp <<interface>> oder grafisch (lollipop notation)
 | ||
|           \end{itemize*}
 | ||
|     \item Verträge („design by contract“)
 | ||
|           \begin{itemize*}
 | ||
|             \item Schnittstelle sagt bisher nichts über Effekt der Klasse aus
 | ||
|             \item Vollständige Beschreibung wäre Programm?
 | ||
|             \item Vereinfachte Beschreibung für Abfolgen:
 | ||
|             \item Vorbedingung: Prädikat, das vor Aufruf gelten muss <<precondition>>
 | ||
|             \item Nachbedingung: Prädikat, das nach Aufruf gelten muss <<postcondition>>
 | ||
|             \item Invariante: Prädikat, das immer gilt <<invariant>>
 | ||
|             \item Jeweils Einschränkungen!
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Protokollrollen - Dynamisches Verhalten von Schnittstellen
 | ||
|   \begin{itemize*}
 | ||
|     \item Ohne Sicht auf innere Implementierung (anders als beim Objektlebenszyklus)
 | ||
|     \item Protokoll = Kollaboration von Protokollrollen (protocol, protocol role)
 | ||
|     \item Modell: Zustandsautomat
 | ||
|           \begin{itemize*}
 | ||
|             \item Genauer: Spezialisierung
 | ||
|             \item Beschreibung der Synchronisation von Objekten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Entwurfsmuster}
 | ||
|   \begin{itemize*}
 | ||
|     \item Warum Wiederverwendung?
 | ||
|           \begin{itemize*}
 | ||
|             \item Geringerer Aufwand
 | ||
|             \item Das Rad nicht noch einmal neu erfinden
 | ||
|             \item Verwenden üblicher, aus Erfahrung gewachsener Strukturen
 | ||
|           \end{itemize*}
 | ||
|     \item ... und warum nicht?
 | ||
|           \begin{itemize*}
 | ||
|             \item Aufwand für Anpassung kann hoch sein!
 | ||
|             \item Einarbeiten in teilweise komplexe Schnittstellen
 | ||
|             \item Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   > Was ist ein Entwurfsmuster? Eine schematische Lösung für eine Klasse verwandter Probleme (Höhere Ebene: Architekturmuster)
 | ||
|   \begin{itemize*}
 | ||
|     \item Wie helfen Muster im Entwurf?
 | ||
|           \begin{itemize*}
 | ||
|             \item Identifizieren von Klassen (Anwendungs- und Lösungsdomäne)
 | ||
|             \item Regeln sind abstrakt oder an realen Objekten orientiert
 | ||
|             \item Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben
 | ||
|             \item Änderbarkeit und Lesbarkeit des Entwurfs verbessern
 | ||
|           \end{itemize*}
 | ||
|     \item Arten von Entwurfsmustern
 | ||
|           \begin{itemize*}
 | ||
|             \item Erzeugungsmuster
 | ||
|             \item Strukturmuster
 | ||
|             \item Verhaltensmuster
 | ||
|           \end{itemize*}
 | ||
|     \item Erzeugungsmuster
 | ||
|           \begin{itemize*}
 | ||
|             \item Factory Method, Fabrikmethode:
 | ||
|             \item Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert
 | ||
|             \item Abstract Factory, Abstrakte Fabrik:
 | ||
|             \item Schnittstelle zur Erzeugung von Familien verwandter Objekte
 | ||
|             \item Prototype, Prototyp:
 | ||
|             \item Objekterzeugung durch Vorlage und Kopie
 | ||
|             \item Builder, Erbauer:
 | ||
|             \item Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen
 | ||
|             \item Singleton:
 | ||
|             \item Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Strukturmuster
 | ||
|   \begin{itemize*}
 | ||
|     \item Adapter
 | ||
|           \begin{itemize*}
 | ||
|             \item Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle
 | ||
|           \end{itemize*}
 | ||
|     \item Bridge, Brücke
 | ||
|           \begin{itemize*}
 | ||
|             \item Abstraktion (Schnittstelle) von Implementierung entkoppeln, um beide unabhängig zu ändern; Impl.-Klasse nur als Verweis
 | ||
|           \end{itemize*}
 | ||
|     \item Decorator, Dekorierer
 | ||
|           \begin{itemize*}
 | ||
|             \item Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen)
 | ||
|           \end{itemize*}
 | ||
|     \item Facade, Fassade
 | ||
|           \begin{itemize*}
 | ||
|             \item Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff
 | ||
|           \end{itemize*}
 | ||
|     \item Flyweight, Fliegengewicht
 | ||
|           \begin{itemize*}
 | ||
|             \item Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand)
 | ||
|           \end{itemize*}
 | ||
|     \item Composite, Verbund, Kompositum
 | ||
|           \begin{itemize*}
 | ||
|             \item Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden, Baumstruktur
 | ||
|           \end{itemize*}
 | ||
|     \item Proxy, Stellvertreter
 | ||
|           \begin{itemize*}
 | ||
|             \item Kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt
 | ||
|             \item Gründe: Schutz, entfernter Zugriff (remote proxy), smart pointer, Erzeugung on demand
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Adapter
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Kommunikation unabhängiger Softwarekomponenten
 | ||
|             \item Einfache Erweiterung um zusätzliche Funktionalität
 | ||
|             \item Austausch der Komponente durch Änderung des Adapters leicht möglich
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Zusätzlicher Adaptierungsschritt benötigt Zeit
 | ||
|             \item Schlechte Wiederverwendbarkeit der Adapter
 | ||
|           \end{itemize*}
 | ||
|     \item Bekannte Verwendung, Spezialfälle
 | ||
|           \begin{itemize*}
 | ||
|             \item Fassade: Adapter eines Teilsystems
 | ||
|             \item Proxy: erweitert die Funktionalität bei gleicher Schnittstelle
 | ||
|             \item Brücke: keine Anpassung, sondern vorherige Strukturierung
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Verhaltensmuster
 | ||
|   \begin{itemize*}
 | ||
|     \item Command, Befehl
 | ||
|           \begin{itemize*}
 | ||
|             \item Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen)
 | ||
|           \end{itemize*}
 | ||
|     \item Observer, Beobachter
 | ||
|           \begin{itemize*}
 | ||
|             \item 1-zu-n-Beziehung zwischen Objekten, so dass die Änderung des zentralen Objekts zu einer Benachrichtigung und Aktualisierung der n (abhängigen) Zustände führt
 | ||
|           \end{itemize*}
 | ||
|     \item Visitor, Besucher
 | ||
|           \begin{itemize*}
 | ||
|             \item Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird
 | ||
|           \end{itemize*}
 | ||
|     \item Interpreter
 | ||
|           \begin{itemize*}
 | ||
|             \item Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache
 | ||
|           \end{itemize*}
 | ||
|     \item Iterator
 | ||
|           \begin{itemize*}
 | ||
|             \item Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung
 | ||
|           \end{itemize*}
 | ||
|     \item Memento
 | ||
|           \begin{itemize*}
 | ||
|             \item Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können
 | ||
|           \end{itemize*}
 | ||
|     \item Template Method, Schablonenmethode
 | ||
|           \begin{itemize*}
 | ||
|             \item Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden
 | ||
|           \end{itemize*}
 | ||
|     \item Strategy, Strategie
 | ||
|           \begin{itemize*}
 | ||
|             \item Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte
 | ||
|           \end{itemize*}
 | ||
|     \item Mediator, Vermittler
 | ||
|           \begin{itemize*}
 | ||
|             \item Objekt, welches das Zusammenspiel einer lose gekoppelten Objektmenge in sich kapselt. Vermeidet direkten Bezug der Objekte untereinander und ermöglicht unabhängige Änderung des Zusammenspiels
 | ||
|           \end{itemize*}
 | ||
|     \item State, Zustand
 | ||
|           \begin{itemize*}
 | ||
|             \item Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt
 | ||
|           \end{itemize*}
 | ||
|     \item Chain of Responsibility, Zuständigkeitskette
 | ||
|           \begin{itemize*}
 | ||
|             \item Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Bewertung Observer
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Entkopplung von Komponenten und Schichten möglich
 | ||
|             \item Broadcast und selective Broadcast möglich
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Bei vielen Beobachtern: Benachrichtigung aufwendig
 | ||
|             \item Unerwartete Änderung, Änderungskaskaden und Rekursion
 | ||
|             \item Abmelden der Beobachter vor dem Löschen
 | ||
|           \end{itemize*}
 | ||
|     \item Bekannte Verwendung, Spezialfälle
 | ||
|           \begin{itemize*}
 | ||
|             \item Verwendung im Model-View-Controller Muster
 | ||
|             \item Qt: Signal / Slot-Prinzip ähnlich
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   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}
 | ||
|   Klassenbibliotheken
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Objekte instanziieren oder Klassen ableiten
 | ||
|           \end{itemize*}
 | ||
|     \item Meist passiv: Kontrollfluss wird von Anwendung gesteuert
 | ||
|     \item Beispiele: stdlib, MFC, GNU scientific library, Java 3D, IPP
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Komponentenbasierte Entwicklung
 | ||
|   \begin{itemize*}
 | ||
|     \item Bausteinorientierte Programmierung (component-ware)
 | ||
|     \item Softwareentwicklung: Konstruktion aus vorgegebenen Bausteinen
 | ||
|     \item Entsprechung für Wiederverwendung: Generische Bausteine (components)
 | ||
|           \begin{itemize*}
 | ||
|             \item Anpassbar, zusammensetzbar
 | ||
|           \end{itemize*}
 | ||
|     \item Werkzeuggestützte bzw. grafische Kompositionsmechanismen
 | ||
|     \item Beispiele: Java Beans, Enterprise Java Beans (EJBs), Microsoft COM+
 | ||
|     \item Komponenten-Entwicklung oft auch projektspezifisch
 | ||
|     \item Warum Komponenten
 | ||
|           \begin{itemize*}
 | ||
|             \item Monolithische, proprietäre Software führt zunehmend zu Problemen
 | ||
|             \item Zunehmend verteilte Anwendungen mit offener Struktur und Internet-Anbindung
 | ||
|             \item Zusammensetzen der Funktionalität aus standardisierten Elementen, die über offene Schnittstellen kommunizieren
 | ||
|             \item Komponenten sollen Flexibilität bei sich ändernden Anforderungen erhöhen
 | ||
|             \item Weg aus der „Software-Krise“?
 | ||
|           \end{itemize*}
 | ||
|     \item Eigenschaften von Komponenten
 | ||
|           \begin{itemize*}
 | ||
|             \item müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein
 | ||
|             \item Kontextabhängigkeiten: benötigte Komponenten-Infrastruktur und Systemressourcen
 | ||
|             \item Kapseln ihre angebotenen Funktionen
 | ||
|             \item Werden immer als ganze Einheit eingesetzt; alle Bestandteile sind enthalten (Archiv-Datei)
 | ||
|             \item Sind nicht von Kopien ihrer selbst unterscheidbar
 | ||
|             \item Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung
 | ||
|             \item Komposition durch Dritte: Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator; meist nur kompilierter Code verfügbar
 | ||
|           \end{itemize*}
 | ||
|   \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}
 | ||
|   Dokumentation des Feinentwurfs
 | ||
|   \begin{itemize*}
 | ||
|     \item Möglichkeiten
 | ||
|           \begin{itemize*}
 | ||
|             \item Eigenständiges Dokument
 | ||
|             \item Erweiterung des Lastenhefts / Grobkonzepts
 | ||
|             \item Eingebettet in den Quellcode (Werkzeug, z.B. Javadoc)
 | ||
|           \end{itemize*}
 | ||
|     \item Inhalt
 | ||
|           \begin{itemize*}
 | ||
|             \item Ähnlich Grobkonzept
 | ||
|             \item Zusätzlich detaillierte Modelle
 | ||
|             \item Abwägungen des Objektentwurfs
 | ||
|             \item Klassenschnittstellen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \section{Implementierung}
 | ||
|   Aufgaben der Implementierung
 | ||
|   \begin{itemize*}
 | ||
|     \item Aus Spezifikationen Programm(code) erzeugen
 | ||
|     \item Aufbauend auf Ergebnissen des Feinentwurfs
 | ||
|           \begin{itemize*}
 | ||
|             \item Algorithmen konzipieren
 | ||
|             \item Datenstrukturen realisieren
 | ||
|             \item Umsetzen in konkreter Programmiersprache
 | ||
|             \item Dokumentation
 | ||
|             \item Untersuchung des Zeit- und Speicherbedarfs
 | ||
|             \item Test und Verifikation
 | ||
|           \end{itemize*}
 | ||
|     \item „Programmieren im Kleinen“
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Konventionen und Werkzeuge}
 | ||
|   Konventionen beim Programmieren
 | ||
|   \begin{itemize*}
 | ||
|     \item (Coding Rules, -conventions, -standards)
 | ||
|     \item Regeln für verständliche Programme
 | ||
|           \begin{itemize*}
 | ||
|             \item „wie“ sollte Quellcode formal und strukturell gestaltet sein
 | ||
|             \item Bezeichner, Einrückungen, Dokumentation, Dateien, ...
 | ||
|             \item Strukturierung: Block, Methode, Klasse, Package
 | ||
|           \end{itemize*}
 | ||
|     \item Firmenspezifische Regeln
 | ||
|           \begin{itemize*}
 | ||
|             \item Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Namenskonventionen
 | ||
|   \begin{itemize*}
 | ||
|     \item Klasse
 | ||
|           \begin{itemize*}
 | ||
|             \item (mit) Substantiv, „UpperCamelCase“
 | ||
|             \item Beispiele: Account, StandardTemplate
 | ||
|           \end{itemize*}
 | ||
|     \item Methode
 | ||
|           \begin{itemize*}
 | ||
|             \item (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“
 | ||
|             \item Beispiele: checkAvailability(), getDate()
 | ||
|           \end{itemize*}
 | ||
|     \item Attribut, Variable
 | ||
|           \begin{itemize*}
 | ||
|             \item (mit) Substantiv, „lowerCamelCase“
 | ||
|             \item Beispiele: anzahlAutos, fensterBreite
 | ||
|           \end{itemize*}
 | ||
|     \item Konstante
 | ||
|           \begin{itemize*}
 | ||
|             \item Nur Großbuchstaben, Worte mit "\_" zusammengesetzt
 | ||
|             \item Standardpräfixe: "MIN\_", "MAX\_", "DEFAULT\_", ...
 | ||
|             \item Beispiele: NORTH, BLUE, MIN\_WIDTH, DEFAULT\_SIZE
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Formatierungs-Richtlinien
 | ||
|   \begin{itemize*}
 | ||
|     \item Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit
 | ||
|     \item Einheitliche Verwendung von Leerzeilen und Leerzeichen
 | ||
|     \item Einheitliche Dateistruktur verwenden
 | ||
|           \begin{itemize*}
 | ||
|             \item Eine .java-Datei pro Klasse
 | ||
|             \item Ein Verzeichnis für jedes package
 | ||
|           \end{itemize*}
 | ||
|     \item Werkzeuge: source beautifier, oft in IDEs enthalten
 | ||
|     \item Editor: syntax highlighting
 | ||
|     \item Navigationswerkzeuge
 | ||
|           \begin{itemize*}
 | ||
|             \item Auf- und Zuklappen, Inhaltsverzeichnis, tagging
 | ||
|             \item doxygen, Eclipse etc.
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Änderungsfreundlicher Code
 | ||
|   \begin{itemize*}
 | ||
|     \item Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung:
 | ||
|           \begin{itemize*}
 | ||
|             \item `typedef char name [NAME\_LENGTH]`
 | ||
|             \item `typedef char firstName [FIRST\_NAME\_LENGTH]`
 | ||
|           \end{itemize*}
 | ||
|     \item Symbolische Konstanten statt literaler Werte verwenden, wenn spätere Änderung denkbar
 | ||
|     \item Algorithmen, Formeln, Standardkonzepte in Methoden/Prozeduren kapseln
 | ||
|     \item Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster (40-60 Zeilen, 70 Zeichen breit)
 | ||
|     \item Strukturierte Programmierung (Regeln je nach Schärfe)
 | ||
|           \begin{itemize*}
 | ||
|             \item Kein goto verwenden (in anderen Sprachen als Java)
 | ||
|             \item switch nur mit break-Anweisung nach jedem Fall
 | ||
|             \item break nur in switch-Anweisungen verwenden
 | ||
|             \item continue nicht verwenden (Effekt ähnlich goto)
 | ||
|             \item return nur am Ende zur Rückgabe des Werts
 | ||
|           \end{itemize*}
 | ||
|     \item Übersichtliche Ausdrücke
 | ||
|           \begin{itemize*}
 | ||
|             \item Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++;
 | ||
|           \end{itemize*}
 | ||
|     \item Variablen möglichst lokal und immer private deklarieren
 | ||
|     \item Wiederverwendung "äußerer" Namen vermeiden
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Werkzeuge
 | ||
|   \begin{itemize*}
 | ||
|     \item Integrated Development Environments (Eclipse, KDevelop)
 | ||
|     \item Compiler, Linker; Build / Make; Versionskontrolle (git, svn)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Code-Qualität}
 | ||
|   Portierbarer Code
 | ||
|   \begin{itemize*}
 | ||
|     \item Code, den man ohne Änderungen in ein anderes System (Compiler, Betriebssystem, Rechner) übertragen kann
 | ||
|           \begin{itemize*}
 | ||
|             \item Kein implementierungsabhängiges Verhalten!
 | ||
|           \end{itemize*}
 | ||
|     \item ANSI C++ Standard ist nicht vollständig definiert
 | ||
|           \begin{itemize*}
 | ||
|             \item Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen:
 | ||
|             \item Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten
 | ||
|             \item Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist
 | ||
|             \item Nicht portabel und somit häufig verboten
 | ||
|             \item Wird unter Umständen ungewollt wegoptimiert
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Implementierungsabhängiges Verhalten
 | ||
|   \begin{itemize*}
 | ||
|     \item Compiler übersetzen bestimmte Sprachkonstrukte unterschiedlich, Ergebnis unterscheidet sich
 | ||
|     \item Voraussetzung:
 | ||
|     \item Verhalten ist konsistent festgelegt und dokumentiert
 | ||
|     \item Kompilierung von standardkonformem Code ist erfolgreich
 | ||
|     \item Beispiel: Speichergröße von Integer-Typen
 | ||
|     \item char kann signed oder unsigned sein: Nicht damit rechnen!
 | ||
|     \item 32 Bit System ist wie erwartet
 | ||
|     \item 16 Bit System: Multiplikation wird mit int durchgeführt -> Überlauf -> undefiniertes Verhalten
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \begin{itemize*}
 | ||
|     \item Unspezifiziertes Verhalten:
 | ||
|     \item Wie implementierungsabhängiges Verhalten
 | ||
|     \item Compiler muss sich für ein bestimmtes Verhalten entscheiden
 | ||
|     \item Muss nicht dokumentiert sein
 | ||
|     \item Beispiel: Evaluierungsreihenfolge von Funktionsargumenten `tuWas(zuerstDas(),oderDochLieberDas());`
 | ||
|     \item Undefiniertes Verhalten:
 | ||
|     \item Keinerlei Vorgaben
 | ||
|     \item Compiler muss mögliches Problem nicht melden
 | ||
|     \item Keine Voraussage welches Resultat eintritt
 | ||
|     \item Bereits die Kompilierung kann fehlschlagen
 | ||
|     \item Oder das laufende Programm kann falsche Resultate liefern.
 | ||
|     \item Effekt: „Bei mir läuft es aber!?“
 | ||
|     \item „undefiniertes Verhalten nutzen grenzt an Sabotage!“
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Sicherer Code mit const
 | ||
|   \begin{itemize*}
 | ||
|     \item Const Variable - Konstante
 | ||
|           \begin{itemize*}
 | ||
|             \item Stellt sicher, dass sich der Wert nicht verändert
 | ||
|           \end{itemize*}
 | ||
|     \item Const Parameter
 | ||
|           \begin{itemize*}
 | ||
|             \item Übergabeparameter ändert sich nicht innerhalb der Operation
 | ||
|             \item Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger `long calcMeanValue(const image \&i){...}`
 | ||
|           \end{itemize*}
 | ||
|     \item Const Operationen
 | ||
|           \begin{itemize*}
 | ||
|             \item Sicherstellen, dass Operation das Exemplar nicht ändert
 | ||
|             \item Aufruf der const Operation bei const Variablen möglich
 | ||
|           \end{itemize*}
 | ||
|     \item Verwende const wenn möglich
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Dokumentation}
 | ||
|   \begin{itemize*}
 | ||
|     \item Selbstdokumentierende Programme?
 | ||
|           \begin{itemize*}
 | ||
|             \item 2001 Int. Obfuscated C Code Contest Winner, Short Program
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   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
 | ||
|           \begin{itemize*}
 | ||
|             \item Autor, Datum, Version, Projekt, ToDo, FixMe, ...
 | ||
|             \item Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert
 | ||
|           \end{itemize*}
 | ||
|     \item Laufende Kommentare im Quellcode
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   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*}
 | ||
|   %  ```js
 | ||
|   %  /** @author name Mustermann */
 | ||
|   %  /** @param name description */
 | ||
|   %  /** @return description */
 | ||
|   %  ```
 | ||
| 
 | ||
|   Benutzerdokumentation
 | ||
|   \begin{itemize*}
 | ||
|     \item Benutzer-Handbuch, Online-Dokumentation
 | ||
|     \item Unterstützung ohne Support?
 | ||
|     \item Vollständige und fehlerfreie Beschreibung der Benutzung
 | ||
|           \begin{itemize*}
 | ||
|             \item Beispiele, screen shots
 | ||
|           \end{itemize*}
 | ||
|     \item Arten: Tutorial, Beschreibung,
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Benutzer-Unterstützungssysteme
 | ||
|   \begin{itemize*}
 | ||
|     \item Integrierte Hilfe (Suchfunktion, balloon help / tool tips)
 | ||
|     \item Assistenz-System (Zustandsabhängige Anleitung)
 | ||
|     \item Tutor-System zum Erlernen
 | ||
|     \item Bug-Listen, Mailinglisten, Diskussionsforen
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Codegenerierung}
 | ||
|   Bezug zwischen Modell und Programmcode
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorwärtsmodellierung: Modell - Code
 | ||
|     \item Rückwärtsmodellierung: Code - Modell
 | ||
|           \begin{itemize*}
 | ||
|             \item Außerdem: Modelltransformation, Refaktorisierung
 | ||
|           \end{itemize*}
 | ||
|     \item Idealfall: Automatische Übersetzung durch SW-Werkzeug (in beiden Richtungen)
 | ||
|           \begin{itemize*}
 | ||
|             \item „Modellbasierte Entwicklung“
 | ||
|           \end{itemize*}
 | ||
|     \item Statisch: Beispiel Klassendiagramm - Quelltext der Klassen mit allen Vererbungsbeziehungen, Attributen und Methodensignaturen (Klassen-Stümpfe mit leeren Methodenrümpfen zum Ausfüllen)
 | ||
|     \item Dynamisch: Beispiel Zustandsdiagramm - Quelltext der Zustandssteuerung einer Klasse
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %
 | ||
| 
 | ||
|   Weitere statische Transformationen
 | ||
|   \begin{itemize*}
 | ||
|     \item Abbildung von Assoziationen auf Sammlungen
 | ||
|     \item Abbildung von Verträgen auf Ausnahmen
 | ||
|     \item Abbildung von Objektmodellen auf Datenbankschemata
 | ||
|     \item Abbildung von Entwurfsmustern auf Codefragmente
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Optimierung des Entwurfsmodells
 | ||
|   \begin{itemize*}
 | ||
|     \item Grund: nichtfunktionale Eigenschaften
 | ||
|     \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Aktueller Zustand: einzelne skalare Variable
 | ||
|           \end{itemize*}
 | ||
|     \item Jedes Ereignis wird durch Methode implementiert
 | ||
|     \item Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt
 | ||
|     \item Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt
 | ||
|     \item Wird in einer Klasse realisiert
 | ||
|     \item Sinnvoll für einfache, “flache” Modelle
 | ||
|           \begin{itemize*}
 | ||
|             \item Sonst Logik für Hierarchie nötig
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Anpassung der Generierung
 | ||
|   \begin{itemize*}
 | ||
|     \item Verschiedene Zielsprachen (Java, C++, ...)
 | ||
|     \item Model2Text-Transformationen
 | ||
|           \begin{itemize*}
 | ||
|             \item Verschiedene Generatoren, z.B. Eclipse Modelling Project
 | ||
|           \end{itemize*}
 | ||
|     \item Generierung aus dem Modellierungswerkzeug
 | ||
|           \begin{itemize*}
 | ||
|             \item Parametrisierung der Codegenerierung
 | ||
|             \item Generierungsvorlagen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Weitere Werkzeuge
 | ||
|   \begin{itemize*}
 | ||
|     \item Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex \& yacc / flex \& bison / antlr)
 | ||
|     \item Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits
 | ||
|     \item XML-Parser
 | ||
|           \begin{itemize*}
 | ||
|             \item XSLT, DOM, SAX, ...
 | ||
|           \end{itemize*}
 | ||
|   \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{itemize*}
 | ||
|     \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
 | ||
|           \begin{itemize*}
 | ||
|             \item concurrent
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   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 Determinismus nicht notwendig für Determiniertheit!
 | ||
|           \begin{itemize*}
 | ||
|             \item Determiniertheit nebenläufiger Programme: Synchronisation
 | ||
|             \item Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Java Threads
 | ||
|   \begin{itemize*}
 | ||
|     \item Verwaltung durch die Java Virtuelle Maschine (JVM)
 | ||
|     \item Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich
 | ||
|           \begin{itemize*}
 | ||
|             \item Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet)
 | ||
|             \item Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern)
 | ||
|             \item Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich
 | ||
|           \end{itemize*}
 | ||
|     \item Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Erzeugung eines Threads
 | ||
|   \begin{itemize*}
 | ||
|     \item Unterklasse der Basisklasse „Thread“ bilden `class MyThread extends Thread`
 | ||
|     \item Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet):
 | ||
|           \begin{itemize*}
 | ||
|             \item Schnittstelle „Runnable“ implementieren
 | ||
|             \item `class MyThread implements Runnable`
 | ||
|           \end{itemize*}
 | ||
|     \item Die vordefinierte Schnittstelle Runnable ist definiert als
 | ||
|           % ```java
 | ||
|           % public interface Runnable
 | ||
|           % { public abstract void run(); }
 | ||
|           % ```
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Starten eines Threads
 | ||
|   \begin{itemize*}
 | ||
|     \item Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren
 | ||
|     \item Seiteneffekt der Runnable-Schnittstelle
 | ||
|           \begin{itemize*}
 | ||
|             \item Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt
 | ||
|             \item Ausführung beginnt mit der Methode run ()
 | ||
|           \end{itemize*}
 | ||
|     \item Ablauf
 | ||
|           \begin{itemize*}
 | ||
|             \item Thread-Objekt erzeugen
 | ||
|             \item Thread starten mit t.start()
 | ||
|             \item start() ruft implizit run() auf
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Synchronisation von Threads
 | ||
|   \begin{itemize*}
 | ||
|     \item Gezielte Einschränkung der Nebenläufigkeit
 | ||
|     \item Gründe
 | ||
|           \begin{itemize*}
 | ||
|             \item Zugriffsbeschränkung, gegenseitiger Ausschluss
 | ||
|             \item Abhängigkeiten, einseitige Synchronisation
 | ||
|           \end{itemize*}
 | ||
|     \item Methoden: Semaphore, Monitore, Schlossvariablen, ...
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Java: Monitore
 | ||
|   \begin{itemize*}
 | ||
|     \item Zugriffsoperationen werden in Klassen zusammengefasst
 | ||
|     \item Gegenseitiger Ausschluss: Spezifikation der betroffenen Zugriffsoperation als synchronized
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item pair programming, code reading etc.
 | ||
|             \item Qualitätsverantwortlicher, automatisiertes Testen
 | ||
|           \end{itemize*}
 | ||
|     \item Technische Unterstützung
 | ||
|           \begin{itemize*}
 | ||
|             \item Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Begriffe
 | ||
|   \begin{itemize*}
 | ||
|     \item Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
 | ||
|     \item Grund für Unzuverlässigkeit:
 | ||
|           \begin{itemize*}
 | ||
|             \item Fehler (bug, fault): fehlerhafter Programmcode o.ä.
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Der Begriff „Bug“:
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Schon vor Computern als Begriff für Fehler benutzt
 | ||
|                             \item Motte im Relais des Computers Mark II Aiken (1947)
 | ||
|                           \end{itemize*}
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Fehlerhafter Zustand (error): Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt
 | ||
|     \item Störfall, Ausfall (failure): Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Vergleich System / Systemmodell
 | ||
|   \begin{itemize*}
 | ||
|     \item Anspruch guter Software: System entspricht Systemmodell (Korrektheit)
 | ||
|     \item Problem: System nicht vollständig automatisch erzeugbar!
 | ||
|     \item Auswege
 | ||
|           \begin{itemize*}
 | ||
|             \item Fehlervermeidung (Inspektion, pair programming, ...)
 | ||
|             \item Nachweis, dass System dem Modell entspricht - Verifikation
 | ||
|             \item Überprüfen, ob System dem Modell entspricht - Testen
 | ||
|             \item Fehlertoleranz (durch Redundanz)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Verifikation
 | ||
|   \begin{itemize*}
 | ||
|     \item Mathematisch formaler Beweis, dass ein Programm einer Spezifikation genügt
 | ||
|     \item Vorteil: wenn anwendbar, dann vollständiger Beweis
 | ||
|     \item Problem: für viele (realistisch große) Fälle nicht anwendbar
 | ||
|           \begin{itemize*}
 | ||
|             \item Zu aufwändig
 | ||
|             \item Umgebung muss ebenfalls verifiziert werden
 | ||
|             \item Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz
 | ||
|           \end{itemize*}
 | ||
|     \item Theoretische Informatik: Berechenbarkeitstheorie, formale Semantik; aktives Forschungsgebiet
 | ||
|           \begin{itemize*}
 | ||
|             \item model checking
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Testen
 | ||
|   \begin{itemize*}
 | ||
|     \item Systematischer Versuch, Defekte in der Software zu finden
 | ||
|     \item Ingenieurtechnik zur Erhöhung des Vertrauens in Softwaresysteme, aber: unvollständig!
 | ||
|           \begin{itemize*}
 | ||
|             \item Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)!
 | ||
|           \end{itemize*}
 | ||
|     \item Aufgabe: Unterschiede zwischen Modell und System finden
 | ||
|     \item Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben
 | ||
|           \begin{itemize*}
 | ||
|             \item Daher sollten nicht (nur) Entwickler selbst testen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Testplanung
 | ||
|   \begin{itemize*}
 | ||
|     \item Testen ist aufwändig, deshalb ist gute Planung nötig!
 | ||
|     \item Testplanung sollte bereits mit der Anforderungsanalyse beginnen und im Entwurf verfeinert werden (V-Modell, Test-First-Ansatz)!
 | ||
|     \item Typische Bestandteile einer Test-Spezifikation (Testdrehbuch)
 | ||
|           \begin{itemize*}
 | ||
|             \item Phasenmodell des Testprozesses
 | ||
|             \item Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele
 | ||
|             \item Zu testende Produkte
 | ||
|             \item Zeitplan für die Tests
 | ||
|             \item Abhängigkeiten der Testphasen
 | ||
|             \item Aufzeichnung der Testergebnisse
 | ||
|             \item Hardware\item und Softwareanforderungen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Arten von Tests
 | ||
|   \begin{itemize*}
 | ||
|     \item Komponententest: Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System
 | ||
|           \begin{itemize*}
 | ||
|             \item Umgebung muss nachgebildet werden
 | ||
|           \end{itemize*}
 | ||
|     \item Integrationstest: Zusammenspiel von Komponenten
 | ||
|           \begin{itemize*}
 | ||
|             \item Vollständiges System: Systemtest; Szenarios
 | ||
|           \end{itemize*}
 | ||
|     \item Strukturtest: innere Zustände, Interaktionen
 | ||
|     \item Funktionstest: Anforderungen aus Lastenheft
 | ||
|     \item Leistungstest: nichtfunktionale Anforderungen
 | ||
|     \item Benutzbarkeitstest: Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern
 | ||
|           \begin{itemize*}
 | ||
|             \item Prototypen
 | ||
|           \end{itemize*}
 | ||
|     \item Akzeptanztest, Installationstest: Kunde, Abnahme
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Komponententests
 | ||
|   \begin{itemize*}
 | ||
|     \item Überprüft Verhalten einer Systemkomponenten im Vergleich zur Spezifikation
 | ||
|     \item Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert
 | ||
|           \begin{itemize*}
 | ||
|             \item Teststumpf (stub, dummy) simuliert aufgerufene Komponenten
 | ||
|             \item Testtreiber simuliert aufrufende Komponenten
 | ||
|           \end{itemize*}
 | ||
|     \item Vorgehensweisen
 | ||
|           \begin{itemize*}
 | ||
|             \item Bottom-up
 | ||
|             \item Top-down
 | ||
|             \item Sandwich
 | ||
|             \item Schichtenweises Testen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Systematisches Testen
 | ||
|   \begin{itemize*}
 | ||
|     \item Testfall
 | ||
|           \begin{itemize*}
 | ||
|             \item Beschreibung, Name
 | ||
|             \item Zu testende Komponente, Testgegenstand (Pfad, Aufrufart)
 | ||
|             \item Eingabedaten (Testdaten)
 | ||
|             \item Erwartete Ergebnisse („Orakel“)
 | ||
|             \item Protokoll (erzeugte Ausgaben)
 | ||
|             \item Bewertung des Ergebnisses
 | ||
|           \end{itemize*}
 | ||
|     \item Weitere Begriffe
 | ||
|           \begin{itemize*}
 | ||
|             \item Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands
 | ||
|             \item Alphatest: Test eines Prototypen durch Benutzer
 | ||
|             \item Betatest: Test der vollständigen Software durch Benutzer
 | ||
|           \end{itemize*}
 | ||
|   \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*}
 | ||
| 
 | ||
|   Äquivalenzklassen im funktionalen Test
 | ||
|   \begin{itemize*}
 | ||
|     \item Problem: alle Kombinationsmöglichkeiten der Eingangsdaten sind zu umfangreich für vollständigen Test
 | ||
|     \item Mögliche Einschränkung: Bildung von Äquivalenzklassen der Eingangsdaten, für die ähnliches Verhalten erwartet wird
 | ||
|     \item Basierend auf Anwendungsdomäne
 | ||
|     \item Äquivalenzklasse = Teilmenge der möglichen Datenwerte der Eingabeparameter
 | ||
|     \item Test je eines Repräsentanten jeder Äquivalenzklasse
 | ||
|     \item Finden von Äquivalenzklassen
 | ||
|           \begin{itemize*}
 | ||
|             \item Zulässige / unzulässige Teilbereiche der Datenwerte
 | ||
|             \item Unterteilung der Bereiche nach erwarteten Ausgabewerten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Grenztests
 | ||
|   \begin{itemize*}
 | ||
|     \item Ergänzung von Äquivalenztests: Spezialfälle
 | ||
|     \item Rand der Äquivalenzklasse
 | ||
|     \item Außerdem: Sonderfälle, erwartete Problemfälle (technisch)
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Anweisungsüberdeckung anhand Quellcode
 | ||
|             \item Zweigüberdeckung und
 | ||
|             \item Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest
 | ||
|           \end{itemize*}
 | ||
|     \item Datenflussorientiert
 | ||
|           \begin{itemize*}
 | ||
|             \item defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen
 | ||
|           \end{itemize*}
 | ||
|     \item Zustandsorientiert
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Testaktivitäten und Werkzeuge}
 | ||
|   Wann wird getestet?
 | ||
|   \begin{itemize*}
 | ||
|     \item Während der Implementierung!
 | ||
|           \begin{itemize*}
 | ||
|             \item Auch wenn Schreiben von Tests scheinbar unproduktiv ist
 | ||
|             \item Tests sind unbeliebt, da Probleme aufgezeigt werden
 | ||
|             \item Aber: spätes Testen erhöht Aufwand!
 | ||
|           \end{itemize*}
 | ||
|     \item Inkrementell, d.h. für jede überschaubare Änderung
 | ||
|     \item Spezielle Vorgehensweise: test first-Ansatz
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Wie wird getestet? Geplant, systematisch, möglichst automatisiert, dokumentiert, wiederholbar
 | ||
| 
 | ||
|   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 in die Testumgebung (Software installieren, konfigurieren, ...)
 | ||
|             \item Bereitstellung von Testdaten bzw. Eingabedaten in die Testumgebung
 | ||
|             \item Benutzer und Benutzerrechte anlegen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Testdurchführung
 | ||
|   \begin{itemize*}
 | ||
|     \item Durchführung der spezifizierten Tests
 | ||
|           \begin{itemize*}
 | ||
|             \item Manuell
 | ||
|             \item Automatisiert
 | ||
|           \end{itemize*}
 | ||
|     \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: Nur ausreichend dokumentierte Fehler sind gültig und können bearbeitet werden!
 | ||
|             \item Fehler im Fehlermanagement eintragen (Bug report)
 | ||
|             \item Testfall bleibt offen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Bugbeschreibung
 | ||
|   \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{itemize*}
 | ||
|             \item defect: Fehler in einer bestehenden Funktionalität
 | ||
|             \item enhancement / feature: Funktionale Anforderung oder Erweiterung der bestehenden Funktionalität
 | ||
|             \item task: Allgemeine Aufgabe
 | ||
|           \end{itemize*}
 | ||
|     \item Priorität festlegen
 | ||
|           \begin{itemize*}
 | ||
|             \item Unterschiedliche Stufen
 | ||
|             \item Festlegung innerhalb eines Unternehmens / Projektes
 | ||
|           \end{itemize*}
 | ||
|     \item Prioritäten von Fehlern (bugs)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %| Stufe | Bedeutung | Verhalten |
 | ||
|   %| -\item | -\item | -\item |
 | ||
|   %| blocker | Schwerwiegender Fehler. Führt zur Arbeitsunfähigkeit anderer (Entwicklung, QA, Produktion,...). | Verdrängt alle anderen Aufgaben! Muss sofort gelöst werden, um Arbeitsfähigkeit wieder herzustellen. |
 | ||
|   %| critical | Schwerer Fehler. Eine grundlegende Funktionalität des Systems ist nicht gegeben. Fehler muss bis zur nächsten Version behoben werden. System kann nicht verwendet werden. | Alle anderen Fehler (außer blocker) werden später gelöst. Bis zum nächsten Release muss dieser Bug gelöst sein. |
 | ||
|   %| major | „normaler“ Fehler. Es tritt ein Fehler innerhalb einer Funktion des Systems auf. Das System kann jedoch weiterhin verwendet werden. | Fehler wird normal eingeplant. |
 | ||
|   %| minor | Kleiner Fehler. Fehler behindert nicht weiter die Funktionsfähigkeit des Systems. Einfacher Work-Around vorhanden? | Je nach Aufwand und Zeitplanung erledigen. |
 | ||
|   %| trivial | Schönheitsfehler. Fehler stört während des Betrieb des Systems nicht. | Je nach Aufwand „zwischendrin“ erledigen. Alle anderen Bugs bevorzugt lösen. |
 | ||
| 
 | ||
|   Testabschluss
 | ||
|   \begin{itemize*}
 | ||
|     \item Zusammenfassen der Tests
 | ||
|     \item Gesamtstatus dokumentieren und kommunizieren
 | ||
|     \item Entscheidungen herbeiführen z.B.: Auslieferung?
 | ||
|           \begin{itemize*}
 | ||
|             \item Ziele erreicht - nächste Schritte (Auslieferung)
 | ||
|             \item Tests vorzeitig beenden oder unterbrechen
 | ||
|             \item Gründe dokumentieren
 | ||
|             \item Vollständiger Nachtest oder Teiltest möglich?
 | ||
|           \end{itemize*}
 | ||
|     \item Unterlagen archivieren
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Testautomatisierung
 | ||
|   \begin{itemize*}
 | ||
|     \item Automatische Code-Validierung
 | ||
|           \begin{itemize*}
 | ||
|             \item Statisch: lint (C), Compiler
 | ||
|             \item Dynamisch: run-time checking, memory leaks etc.
 | ||
|           \end{itemize*}
 | ||
|     \item Beispiel: Test-Framework JUnit
 | ||
|   \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, JProbe
 | ||
|   \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}
 | ||
|   Softwareverteilung (deployment)
 | ||
|   \begin{itemize*}
 | ||
|     \item Prozess zur Installation von Software auf
 | ||
|           \begin{itemize*}
 | ||
|             \item Anwender-PC‘s, Servern, Maschinen in Produktion ...
 | ||
|           \end{itemize*}
 | ||
|     \item Steuerung der Installation der Software
 | ||
|     \item Voraussetzungen für die Software schaffen
 | ||
|           \begin{itemize*}
 | ||
|             \item Schulungen planen und durchführen
 | ||
|           \end{itemize*}
 | ||
|     \item Softwareverteilung ist ein kritischer Prozess!
 | ||
|           \begin{itemize*}
 | ||
|             \item Fehler können zu vielen Störungen und Ausfällen führen
 | ||
|           \end{itemize*}
 | ||
|     \item Ziele
 | ||
|           \begin{itemize*}
 | ||
|             \item Automatische Installation, Konfiguration und Wartung einer großen Anzahl von Systemen mit geringem Aufwand
 | ||
|             \item Erreichen eines störungsarmen und sicheren Betriebs
 | ||
|             \item Möglichst einheitliche Softwareversionen auf allen Systemen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Installationsarten
 | ||
|   \begin{itemize*}
 | ||
|     \item Erstinstallation
 | ||
|     \item Software-Update (Software-Aktualisierung)
 | ||
|           \begin{itemize*}
 | ||
|             \item Aktualisierung der Software, Daten oder Konfiguration
 | ||
|           \end{itemize*}
 | ||
|     \item Hotfixes und Service Packs
 | ||
|           \begin{itemize*}
 | ||
|             \item Nur bestimmte Teile der Software werden aktualisiert
 | ||
|             \item Meist nur Fehlerbehebung, keine neuen Features
 | ||
|           \end{itemize*}
 | ||
|     \item Upgrade
 | ||
|           \begin{itemize*}
 | ||
|             \item Erweitert eine Software deutlich um neue Funktionen
 | ||
|           \end{itemize*}
 | ||
|     \item Unbeaufsichtigte (automatische) Installation
 | ||
|           \begin{itemize*}
 | ||
|             \item Installation erfolgt ohne Benutzereingriff
 | ||
|             \item Periodisch, durch Aufruf des Anwenders, beim Programmstart
 | ||
|             \item Einstellungen in einem Skript festgelegt oder werden als Parameter übergeben
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Installationshilfsmittel
 | ||
|   \begin{itemize*}
 | ||
|     \item Installationsprogramm (Installer)
 | ||
|           \begin{itemize*}
 | ||
|             \item Windows: Windows Installer, InstallShield
 | ||
|             \item Linux: RPM, Port, APT
 | ||
|             \item MAC-OS: Installer, WarpIn
 | ||
|           \end{itemize*}
 | ||
|     \item Installations-Script
 | ||
|     \item Installationsanweisung
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Software-Rollout
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorgang des Veröffentlichens und Verteilens von Softwareprodukten auf entsprechende Clients
 | ||
|     \item Anzahl der Clients kann weit über 10.000 liegen!
 | ||
|     \item Rollout abhängig von verschiedenen Kriterien (Vorherige Installation, Hardwarekonfiguration, Zeit, Kunde)
 | ||
|     \item Rollout-Varianten
 | ||
|           \begin{itemize*}
 | ||
|             \item Zentral / Dezentral
 | ||
|             \item Manuell (Benutzer löst Installation aus)
 | ||
|             \item Automatisiert (ohne Benutzerinteraktion)
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Vollständige Verteilung (big bang)
 | ||
|   \begin{itemize*}
 | ||
|     \item Alle Installationen werden mit einem Mal installiert
 | ||
|     \item Sehr hohes Risiko
 | ||
|     \item Eventuelle Fehler führen zu vielen fehlerhaften Zuständen oder Störfällen - führt zu hohem Druck
 | ||
|     \item Eventuelle Fehler müssen schnell gelöst werden (Provisorium)
 | ||
|     \item Sehr kurze Einführungsphase
 | ||
|     \item Rollback-Mechanismus sehr empfohlen
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Rollback
 | ||
|   \begin{itemize*}
 | ||
|     \item Wiederherstellung des Ursprungszustands
 | ||
|     \item Technische Realisierung muss ermöglicht werden
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Pilotierte Einführung
 | ||
|   \begin{itemize*}
 | ||
|     \item Einführung für wenige ausgewählte Installationen
 | ||
|     \item Sehr hohe Sicherheit
 | ||
|     \item Festlegung der späteren Rollout-Schritte
 | ||
|     \item Benötigt zusätzliche Zeit
 | ||
|     \item Geringere Auftrittswahrscheinlichkeit von Fehlern
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Schrittweise (iterative) Einführung
 | ||
|   \begin{itemize*}
 | ||
|     \item Einführung erfolgt schrittweise mit einer definierten Anzahl
 | ||
|     \item von Installationen (Rampe - ramp-up)
 | ||
|     \item Höhere Fehlerwahrscheinlichkeit -> Bessere Reproduzierbarkeit -> schnelleres Finden von Fehlern -> Erfahrungsgewinn
 | ||
|     \item Begrenztes Risiko, mittlerer Zeitaufwand
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \section{Vorgehensmodelle}
 | ||
|   \subsection{Einführung}
 | ||
|   Wie läuft Softwareerstellung ab?
 | ||
|   \begin{itemize*}
 | ||
|     \item (oder besser, wie sollte sie ablaufen?)
 | ||
|     \item Aufgaben und Phasen siehe vorangegangene Kapitel
 | ||
|     \item Wann wird was getan? Abhängigkeiten?
 | ||
|           \begin{itemize*}
 | ||
|             \item Sequentiell / nebenläufig,
 | ||
|           \end{itemize*}
 | ||
|     \item Prozessmodelle der Softwareentwicklung
 | ||
|           \begin{itemize*}
 | ||
|             \item Regelwerke, Erfahrungen, best practices für große Projekte
 | ||
|             \item Aktives Entwicklungsgebiet
 | ||
|           \end{itemize*}
 | ||
|     \item Erweiterbar zum Software-Lebenszyklus mit Inbetriebnahme, Wartung, Außerdienststellung usw.
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Softwareentwicklungsprozess/Vorgehensmodell
 | ||
|   \begin{itemize*}
 | ||
|     \item Methode zur Erstellung von Softwaresystemen
 | ||
|     \item Systematisch, rational und schrittweise erfolgender Weg vom Problem zur Lösung
 | ||
|     \item Ziel: Softwareentwicklungsprozess übersichtlich, plan- und strukturierbar
 | ||
|     \item Zerlegung des Softwareentwicklungsprozesses in überschaubare Einheiten
 | ||
|     \item Unternehmensspezifisch, anpassbar, erweiterbar
 | ||
|           \begin{itemize*}
 | ||
|             \item Eigene Varianten, evtl. projektabhängig
 | ||
|             \item An spezielle Bedürfnisse des Informationsbereichs angepasst
 | ||
|             \item Kein allgemeingültiges Vorgehen
 | ||
|             \item Einsetzbar in verschiedenartigen Projekten
 | ||
|           \end{itemize*}
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Inhaltliche Zerlegung
 | ||
|             \item Satz von Aufgaben
 | ||
|             \item Verteilung der Teilprozesse / Aktivitäten auf verschiedene Phasen
 | ||
|             \item Begleitet von unterstützenden, übergreifenden Aktivitäten
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Aufgabe
 | ||
|   \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, Spezifikation, Glossar, Handbuch usw.
 | ||
|     \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{itemize*}
 | ||
|     \item Projektmanagement
 | ||
|           \begin{itemize*}
 | ||
|             \item Projektplanung, -verfolgung und -steuerung
 | ||
|             \item Risikomanagement
 | ||
|           \end{itemize*}
 | ||
|     \item Anforderungsmanagement
 | ||
|           \begin{itemize*}
 | ||
|             \item Im Gegensatz zur Anforderungsaufnahme und -analyse
 | ||
|           \end{itemize*}
 | ||
|     \item Qualitätsmanagement
 | ||
|           \begin{itemize*}
 | ||
|             \item Problem Management
 | ||
|             \item Softwaremetriken (Messung von Softwareeigenschaften)
 | ||
|             \item Statische + dynamische Analyse (Bestimmung von Schwachstellen)
 | ||
|           \end{itemize*}
 | ||
|     \item Konfigurationsmanagement
 | ||
|           \begin{itemize*}
 | ||
|             \item Versionsverwaltung, Änderungsmanagement
 | ||
|           \end{itemize*}
 | ||
|     \item Dokumentation
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Sequenzielle Modelle}
 | ||
|   \begin{itemize*}
 | ||
|     \item Wasserfallmodell
 | ||
|           \begin{itemize*}
 | ||
|             \item Abhängigkeiten zwischen Teilergebnissen
 | ||
|             \item Ursprung in System- Hardwareentwicklung
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Wurde für die SW-Entwicklung übernommen
 | ||
|                     \item Auch heute verbreitetes Vorgehen bei HW-Entwicklung
 | ||
|                   \end{itemize*}
 | ||
|             \item Sequenzielles Phasenmodell (Abschluss der Phasen)
 | ||
|             \item Stark Dokumentengetrieben (Ergebnisse der Phasen)
 | ||
|             \item Unterteilung in abgeschlossene Phasen:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Analyse
 | ||
|                     \item Design/Entwurf
 | ||
|                     \item Implementierung
 | ||
|                     \item Test \& Integration
 | ||
|                     \item Einführung, Betrieb \& Wartung
 | ||
|                   \end{itemize*}
 | ||
|             \item Alternativ:
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Planung
 | ||
|                     \item Definition
 | ||
|                     \item Entwurf
 | ||
|                     \item Implementierung
 | ||
|                     \item Test \& Integration
 | ||
|                     \item Einsatz und Wartung
 | ||
|                   \end{itemize*}
 | ||
|             \item Vorteile
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Einfach und verständlich, bekannt und verbreitet
 | ||
|                     \item Erleichterte Planung und Steuerung
 | ||
|                   \end{itemize*}
 | ||
|             \item Nachteile
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Idealisierte Annahme rein sequentiellen Ablaufs
 | ||
|                     \item Starke Abhängigkeiten zwischen Teilergebnissen
 | ||
|                     \item Ungeeignet, falls Anforderungen zu Beginn unklar
 | ||
|                     \item Unflexibel gegenüber Änderungen
 | ||
|                     \item Erst sehr spät greifbare Ergebnisse
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Erweitertes Wasserfallmodell
 | ||
|           \begin{itemize*}
 | ||
|             \item Verbesserung für Änderungen und Fehler - Rückschritte
 | ||
|           \end{itemize*}
 | ||
|     \item Alternative Arten von Phasenmodellen
 | ||
|           \begin{itemize*}
 | ||
|             \item Sequenziell
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Phasen strikt nacheinander, Dokumenten-orientiert
 | ||
|                     \item Keine Änderungen abgeschlossener Artefakte
 | ||
|                   \end{itemize*}
 | ||
|             \item Nebenläufig
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Phasen laufen teilweise parallel für bessere Zeitnutzung
 | ||
|                     \item Weiterhin keine Änderungen fertiger Dokumente
 | ||
|                   \end{itemize*}
 | ||
|             \item Inkrementell
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Unterteilung des Produkts in Teile
 | ||
|                     \item Schnellere Auslieferung von Teilfunktionalität nach vollständiger Aufnahme der Anforderungen
 | ||
|                   \end{itemize*}
 | ||
|             \item Alternative: Evolutionär
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Anforderungen entwickeln sich im Projekt
 | ||
|                     \item Ausgelieferte Versionen ergeben neue Anforderungen
 | ||
|                   \end{itemize*}
 | ||
|             \item V-Modell [Boehm]
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Explizite Adressierung der Qualitätssicherung
 | ||
|                           %\item %
 | ||
|                     \item Entwicklung des V-Modells in Deutschland
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Leitfaden, in Bundesbehörden ab 1990er verbindlich
 | ||
|                             \item Version V-Modell 97 erweitert um Werkzeuganforderungen, Rollen und Submodelle der Beteiligten
 | ||
|                             \item Kritik: schlecht skalier\item und anpassbar, zu unflexibel,
 | ||
|                             \item bürokratisch, nicht an moderner OO-SWEntw. orientiert
 | ||
|                           \end{itemize*}
 | ||
|                     \item V-Modell XT (extreme tailoring)
 | ||
|                           \begin{itemize*}
 | ||
|                             \item Aktuelle Version ab 2004/05
 | ||
|                             \item Einfache projektspezifische Anpassbarkeit
 | ||
|                             \item Assistent www.v-modell-xt.de (kleines Projekt ~40 Dok.!)
 | ||
|                             \item Überprüfbarer Projektfortschritt
 | ||
|                             \item AG/AN-Sichten und Schnittstellen, Ausschreibungen
 | ||
|                             \item Gesamter SW-Lebenszyklus
 | ||
|                           \end{itemize*}
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| 
 | ||
|   \subsection{Iterative Modelle}
 | ||
|   Iterativer Entwicklungsprozess
 | ||
|   \begin{itemize*}
 | ||
|     \item Spezifikation, Entwurf und Implementierung müssen immer wieder verändert und angepasst werden
 | ||
|     \item Häufiges Integrieren, Validieren und Testen
 | ||
|     \item "You should use iterative development only on projects that you want to succeed." [Fowler]
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Inkrementelle Entwicklung
 | ||
|   \begin{itemize*}
 | ||
|     \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 (Prototyp?)
 | ||
|     \item Spirale = iterativer Zyklus durch dieselben Schritte
 | ||
|     \item Ziele jedes Durchlaufs aus alten Ergebnissen ableiten
 | ||
|     \item Kosten/Nutzen abwägen
 | ||
|     \item Regelmäßige Überprüfung des Prozessmodells
 | ||
|     \item Anpassbar
 | ||
|     \item Hoher Management-Overhead, große Projekte
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Unified Process
 | ||
|   \begin{itemize*}
 | ||
|     \item Vorgehensmodelle zur objektorientierten Softwareentwicklung
 | ||
|           \begin{itemize*}
 | ||
|             \item Ivar Jacobson, Grady Booch and James Rumbaugh: The Unified Software Development Process, (Rational/IBM), 1999
 | ||
|           \end{itemize*}
 | ||
|     \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*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Prinzipieller Ablauf des Unified Process
 | ||
|   %
 | ||
|   \begin{itemize*}
 | ||
|     \item Haupteigenschaften des UP
 | ||
|           \begin{itemize*}
 | ||
|             \item Inkrementell, iterativ, evolutionär
 | ||
|             \item Anwendungsgetrieben
 | ||
|             \item Architekturzentriert
 | ||
|             \item Risikoorientiert
 | ||
|             \item Ereignisorientiert
 | ||
|             \item Nutzt die UML als Notationssprache
 | ||
|             \item Erweiterbar / Anpassbar
 | ||
|           \end{itemize*}
 | ||
|     \item Verbreitete Vertreter
 | ||
|           \begin{itemize*}
 | ||
|             \item Rational Unified Process - RUP (Rational / IBM)
 | ||
|             \item Open Unified Process - OpenUP (Eclipse Foundation)
 | ||
|             \item Object Engineering Process - OEP (oose GmbH)
 | ||
|           \end{itemize*}
 | ||
|     \item Vorteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Vorteile der Eigenschaften (iterativ, inkrementell, anpassbar, ...)
 | ||
|             \item Berücksichtigung des Risikos
 | ||
|             \item Passend für objektorientiertes Paradigmas und UML
 | ||
|             \item Tool-Unterstützung
 | ||
|             \item Reaktion auf Änderungen möglich
 | ||
|             \item Industriestandard
 | ||
|           \end{itemize*}
 | ||
|     \item Nachteile
 | ||
|           \begin{itemize*}
 | ||
|             \item Hoher Bürokratischer Aufwand -> Tailoring notwendig!
 | ||
|             \item Relativ hohe „Lernkurve“ aller Beteiligten
 | ||
|             \item Keine schnelle Reaktion auf Änderungen
 | ||
|             \item Keine integrierte Qualitätssicherung
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Agile Methoden}
 | ||
|   \begin{itemize*}
 | ||
|     \item Ausgangspunkt
 | ||
|           \begin{itemize*}
 | ||
|             \item Ziv's Unsicherheitsprinzip des Software Engineering:  "Unsicherheit ist im Software-Entwicklungsprozess und den Produkten inhärent und unvermeidlich." (Ziv, 1996)
 | ||
|             \item Humphrey's Prinzip der Anforderungsunsicherheit: "In einem neuen Software System werden die Anforderungen solange nicht komplett bekannt sein, bis die Anwender damit arbeiten." (Humphrey, 1995)
 | ||
|             \item Wegner's Lemma: "Es ist unmöglich, ein interaktives System komplett zu spezifizieren." (Wegner, 1995)
 | ||
|           \end{itemize*}
 | ||
|     \item Ziele
 | ||
|           \begin{itemize*}
 | ||
|             \item geringer bürokratischer Aufwand
 | ||
|             \item Hauptziel ist die Softwareentwicklung
 | ||
|             \item nur wenige Regeln bzw. Verhalten definiert
 | ||
|             \item sehr flexibel gehaltenes Vorgehen
 | ||
|             \item stark Anwendungs- und Ereignisorientiert
 | ||
|             \item iterativ / inkrementell / evolutionär
 | ||
|             \item sehr schnelle Entwicklungsiterationen
 | ||
|             \item meist Architekturzentriert
 | ||
|             \item auch testgetriebenes Vorgehen möglich
 | ||
|             \item Berücksichtigung sozialer Aspekte
 | ||
|             \item Softwareentwicklung: Kreative Arbeit von Kreativen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Das Agile Manifest (2001)
 | ||
|   \begin{itemize*}
 | ||
|     \item Individuen und Interaktionen bedeutender als Prozesse und Tools
 | ||
|     \item Funktionierende Software bedeutender als übermäßige Dokumentation
 | ||
|     \item Stetige Zusammenarbeit mit dem Kunden bedeutender als Vertragsverhandlung
 | ||
|     \item Mut und Offenheit für Änderungen bedeutender 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 Beispiele für Werte
 | ||
|           \begin{itemize*}
 | ||
|             \item Kommunikation (Kommunikation statt Dokumentation)
 | ||
|             \item Einfachheit (KISS „Keep it small and simple“)
 | ||
|             \item Feedback
 | ||
|             \item Mut
 | ||
|             \item Respekt
 | ||
|           \end{itemize*}
 | ||
|     \item Beispiele für Prinzipien
 | ||
|           \begin{itemize*}
 | ||
|             \item Beidseitiger Vorteil
 | ||
|             \item Fehlschläge hinnehmen
 | ||
|             \item Ständige Verbesserungen
 | ||
|             \item Ständige Lauffähigkeit des Codes
 | ||
|             \item Kleine Schritte
 | ||
|             \item Wiederverwendung bestehender / bewährter Lösungen
 | ||
|           \end{itemize*}
 | ||
|     \item Beispiele für Praktiken
 | ||
|           \begin{itemize*}
 | ||
|             \item Pair-Programing, Coding Rules
 | ||
|             \item Kollektives Eigentum / Gemeinsamer Codebesitz
 | ||
|             \item Testgetriebene Entwicklung
 | ||
|             \item Ständiges Refactoring
 | ||
|             \item Keine Überstunden
 | ||
|           \end{itemize*}
 | ||
|     \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
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Chaotische Vorgehen
 | ||
|                     \item Schwere Planbarkeit des Ergebnisses
 | ||
|                   \end{itemize*}
 | ||
|             \item Notwendige Beteiligung des Kunden
 | ||
|             \item Ergebnis ist schwer vorherzusagen
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{eXtreme Programming (XP)}
 | ||
|   \begin{itemize*}
 | ||
|     \item Beck 1999, aus Kritik an „monumentalen Modellen“
 | ||
|     \item Evolutionäre Entwicklung in kleinen Schritten
 | ||
|           \begin{itemize*}
 | ||
|             \item Möglichst einfaches Design
 | ||
|           \end{itemize*}
 | ||
|     \item Konzentration auf Programmcode als Analyseergebnis, Entwurfsdokument und Dokumentation
 | ||
|     \item Weglassen von explizitem Design, ausführlicher Dokumentation und Reviews
 | ||
|     \item Code wird permanent lauffähig gehalten (täglich)
 | ||
|     \item Schnell und flexibel
 | ||
|     \item Erfordert Disziplin der Teilnehmer
 | ||
|     \item Rollen: Projektleiter, Kunde (verfügbar), Entwickler
 | ||
|           \begin{itemize*}
 | ||
|             \item Max. 5-10 Entwickler
 | ||
|           \end{itemize*}
 | ||
|     \item Kunde bestimmt Anforderung und Prioritäten
 | ||
|           \begin{itemize*}
 | ||
|             \item planning game; story cards (use cases)
 | ||
|           \end{itemize*}
 | ||
|     \item Implementierung in kleinen Schritten
 | ||
|           \begin{itemize*}
 | ||
|             \item pair programming, collective code ownership
 | ||
|             \item Häufige Releases inkl. Integration
 | ||
|             \item Refactoring bei Designänderungen
 | ||
|             \item Programmier-Konventionen
 | ||
|           \end{itemize*}
 | ||
|     \item Regelmäßiges automatisiertes Testen
 | ||
|           \begin{itemize*}
 | ||
|             \item test-first Ansatz
 | ||
|           \end{itemize*}
 | ||
|     \item Morgendliches Meeting im Stehen ohne Diskussionen
 | ||
|     \item 40h-Woche
 | ||
|     \item XP
 | ||
|           \begin{itemize*}
 | ||
|             \item Sammlung von 12 "best practices"
 | ||
|             \item Test-getrieben
 | ||
|             \item Flexibel, effizient
 | ||
|             \item Kleine Teams
 | ||
|             \item Erfordert Disziplin der Teilnehmer
 | ||
|                   %\item %
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Scrum}
 | ||
|   \begin{itemize*}
 | ||
|     \item [Ken Schwaber, Jeff Sutherland und Mike Beedle]
 | ||
|     \item Haupteigenschaften
 | ||
|           \begin{itemize*}
 | ||
|             \item Iterativ / Inkrementell, Evolutionär
 | ||
|             \item stark Anwendungs- und Ereignisorientiert
 | ||
|             \item schnelle Entwicklungsiterationen
 | ||
|           \end{itemize*}
 | ||
|     \item Sprint
 | ||
|           \begin{itemize*}
 | ||
|             \item eine schnelle Iteration: Dauer ca. 30 Tage
 | ||
|             \item Festlegung welche Features umgesetzt werden
 | ||
|           \end{itemize*}
 | ||
|     \item Product Backlog
 | ||
|           \begin{itemize*}
 | ||
|             \item Liste der gewünschten Features des Produkts
 | ||
|             \item Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt
 | ||
|             \item Jeder kann Einträge beisteuern
 | ||
|           \end{itemize*}
 | ||
|     \item Rollen
 | ||
|           \begin{itemize*}
 | ||
|             \item Product Owner
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Erfasst Bedürfnisse der Kunden und Stakeholder
 | ||
|                     \item Pflegt Backlog, definiert, priorisiert Features pro Sprint
 | ||
|                   \end{itemize*}
 | ||
|             \item Scrum Master
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings
 | ||
|                     \item Schützt das Team vor äußeren Störungen
 | ||
|                     \item Repräsentiert Team gegenüber Management
 | ||
|                   \end{itemize*}
 | ||
|             \item Scrum Team (ca. 5-9 Personen)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Team organisiert sich und die Aufgaben selbst
 | ||
|                     \item Team bedeutet: Zielgerichtet und funktionsübergreifend arbeiten, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Sprint Backlog
 | ||
|   \begin{itemize*}
 | ||
|     \item Für die aktuelle Iteration ausgewählte Aufgaben
 | ||
|           \begin{itemize*}
 | ||
|             \item Aufgabe nicht länger als 2 Tage Aufwand
 | ||
|           \end{itemize*}
 | ||
|     \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
 | ||
|     \item Darstellung an prominenter Stelle
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Daily Meeting
 | ||
|   \begin{itemize*}
 | ||
|     \item ca. 15 Minuten
 | ||
|     \item Kurze Statusmeldung, Was wurde geschafft? Was ist zu tun? Was behindert den Fortschritt?
 | ||
|     \item Weiterführende Diskussionen erst im Anschluss
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   %
 | ||
| 
 | ||
|   Sprint Review-Meeting
 | ||
|   \begin{itemize*}
 | ||
|     \item Präsentation des Erreichten (Feature Demo)
 | ||
|     \item Product Owner, Kunde usw. geben Feedback
 | ||
|           \begin{itemize*}
 | ||
|             \item Neue Anforderungen hinzufügen / Neu priorisieren
 | ||
|             \item Qualitätsansprüche ändern
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Sprint-Retrospektive
 | ||
|   \begin{itemize*}
 | ||
|     \item Rückkopplungsschleife
 | ||
|           \begin{itemize*}
 | ||
|             \item Was war gut und was hat nicht funktioniert?
 | ||
|             \item Was kann verbessert werden?
 | ||
|           \end{itemize*}
 | ||
|     \item Nach jedem Sprint
 | ||
|     \item Diskussion der identifizierten Probleme
 | ||
|     \item Identifikation von wenigen „Action Items“
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Burndown Chart
 | ||
|   \begin{itemize*}
 | ||
|     \item Darstellung der offenen und erledigten Aufwände / Tasks
 | ||
|           %\item %
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Zusammenfassung}
 | ||
|   \begin{itemize*}
 | ||
|     \item Software-Entwicklungsmethode
 | ||
|           \begin{itemize*}
 | ||
|             \item Elemente
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Darstellung - Notation und Semantik für Modelle, Diagrammtypen, Dokumentvorlagen (Artefakte)
 | ||
|                     \item Vorgehensmodell - Phasen, Arbeitsschritte
 | ||
|                     \item Verfahren - Regeln, Anweisungen, Aktivitäten (+Rollen)
 | ||
|                     \item Werkzeuge
 | ||
|                   \end{itemize*}
 | ||
|             \item Industriestandards: RUP + UML
 | ||
|             \item Öffentliche Auftraggeber: V-Modell
 | ||
|             \item Firmenintern: eigene Varianten, evtl. projektabhängig
 | ||
|             \item Weitere Themen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Reifegradbeurteilung CMMI, SPICE, ISO 9000
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Charakterisierung von Vorgehensmodellen
 | ||
|           \begin{itemize*}
 | ||
|             \item Sequenziell
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Teilprozesse strikt nacheinander
 | ||
|                     \item Keine Änderungen abgeschlossener Artefakte
 | ||
|                   \end{itemize*}
 | ||
|             \item Nebenläufig
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Teilprozesse laufen teilweise parallel für bessere Zeitnutzung
 | ||
|                   \end{itemize*}
 | ||
|             \item Dokumentgetrieben
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Erstellung von Dokumenten (Artefakte) im Vordergrund
 | ||
|                     \item Festlegung der Dokumente pro Phase
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Charakterisierung von Vorgehensmodellen
 | ||
|           \begin{itemize*}
 | ||
|             \item Iterativ
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Definition einer sich wiederholenden Abfolge von Teil-Prozessen bzw. Aktivitäten
 | ||
|                     \item Schnelles Wiederholen dieser Abfolgen
 | ||
|                   \end{itemize*}
 | ||
|             \item Inkrementell
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Definition und Kontrolle des Fortschritts pro Iteration
 | ||
|                     \item Kleine Erweiterungen
 | ||
|                   \end{itemize*}
 | ||
|             \item Evolutionäres Vorgehen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Schnelle Prototypen
 | ||
|                     \item Lauffähiger Prototyp jederzeit vorhanden
 | ||
|                     \item Toolunterstützung (Versionierung)
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Charakterisierung von Vorgehensmodellen
 | ||
|           \begin{itemize*}
 | ||
|             \item Ereignisorientiert
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Schnelle Reaktion auf Anforderungsänderungen
 | ||
|                     \item Keine starre Abfolge von Tätigkeiten / Prozessen
 | ||
|                     \item Voraussetzung: Prozesse laufen parallel ab
 | ||
|                   \end{itemize*}
 | ||
|             \item Architekturzentriert
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Starke Gewichtung der Architektur
 | ||
|                     \item Verwendung von Modellen, Mustern und vorhandenem Wissen
 | ||
|                   \end{itemize*}
 | ||
|             \item Anwendungsgetrieben
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Orientierung an den Anwendungsfällen
 | ||
|                     \item Umsetzen, was einem Anwendungsfall zugeordnet werden kann
 | ||
|                     \item Anwender steht im Mittelpunkt (User Stories)
 | ||
|                   \end{itemize*}
 | ||
|             \item Risikoorientiert
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Risiko der Entwicklung wird in Planung berücksichtigt
 | ||
|                     \item Risiko- / Nutzen-Analyse
 | ||
|                   \end{itemize*}
 | ||
|             \item Test- / Qualitätsgetrieben
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Qualität steht im Vordergrund
 | ||
|                     \item Test wird während oder sogar vor der Implementierungs-phase erstellt
 | ||
|                   \end{itemize*}
 | ||
|             \item Erweiterbar / Anpassbar (tailoring)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Nur Rahmen des Vorgehens festgelegt
 | ||
|                     \item Konkretes Vorgehen wird an die Bedürfnisse angepasst
 | ||
|                     \item Grundlegende Eigenschaft von Vorgehensmodellen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Softwareprojekt im Sommersemester
 | ||
|           \begin{itemize*}
 | ||
|             \item Auswahl aus 3 Vorgehensmodellen
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Klassisches Vorgehen
 | ||
|                     \item Unified Process
 | ||
|                     \item Agiles Vorgehen
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \section{Projektmanagement}
 | ||
| 
 | ||
|   Was ist ein Projekt?
 | ||
|   \begin{itemize*}
 | ||
|     \item Merkmale von Projekten
 | ||
|           \begin{itemize*}
 | ||
|             \item Zielgerichtetes Vorhaben
 | ||
|             \item Einmaligkeit
 | ||
|             \item Zeitliche, finanzielle und personelle Rahmenbedingungen
 | ||
|             \item Abgrenzung zu anderen Vorhaben
 | ||
|             \item Projektspezifische Organisation
 | ||
|             \item Komplexität (Unterteilung in abhängige Teilaufgaben nötig)
 | ||
|           \end{itemize*}
 | ||
|     \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Nicht die Lösung selbst, eigene Disziplin
 | ||
|           \end{itemize*}
 | ||
|     \item Aufgaben
 | ||
|           \begin{itemize*}
 | ||
|             \item Problemabgrenzung
 | ||
|             \item Zielfestlegung, Ablaufplanung
 | ||
|             \item Planung und Bereitstellung personeller, finanzieller und sachlicher Ressourcen
 | ||
|             \item Führen der Projektgruppe und Koordination der Aktivitäten
 | ||
|             \item Steuerung und Überwachung des Projektablaufes
 | ||
|             \item Zum großen Teil Planungs- und Kommunikationsleistung!
 | ||
|           \end{itemize*}
 | ||
|   \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 möglich anhand Produktstruktur, fachlicher Struktur oder Phasenmodell des Entwicklungsprozesses
 | ||
|           \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*}
 | ||
|   %
 | ||
| 
 | ||
|   Ablaufplanung
 | ||
|   \begin{itemize*}
 | ||
|     \item Abhängigkeiten (Anordnungsbeziehungen) zwischen Vorgängen A und B: 4 Möglichkeiten
 | ||
|           \begin{itemize*}
 | ||
|             \item Ende-Anfang (Normalfolge)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item B kann begonnen werden, sobald A beendet worden ist
 | ||
|                   \end{itemize*}
 | ||
|             \item Anfang-Anfang (Anfangsfolge)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item B kann begonnen werden, sobald A begonnen worden ist
 | ||
|                   \end{itemize*}
 | ||
|             \item Anfang-Ende (Sprungfolge)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item B kann beendet werden, sobald A begonnen worden ist
 | ||
|                   \end{itemize*}
 | ||
|             \item Ende-Ende (Endfolge)
 | ||
|                   \begin{itemize*}
 | ||
|                     \item B kann beendet werden, sobald A beendet worden ist
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|     \item Netzplantechnik
 | ||
|           \begin{itemize*}
 | ||
|             \item Planungsarten
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Vorwärtsplanung (ab Startzeitpunkt)
 | ||
|                     \item Rückwärtsplanung (ab gewünschtem Projektende)
 | ||
|                   \end{itemize*}
 | ||
|             \item Berechnete Daten für Vorgänge
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Frühester und spätester Anfangszeitpunkt (FAZ / SAZ)
 | ||
|                     \item Frühester und spätester Endzeitpunkt (FEZ / SEZ)
 | ||
|                     \item Pufferzeiten, z.B. freier Puffer (Verzögerung ohne Verschiebung des Nachfolgers), Gesamtpuffer (Verzögerung ohne Gefährdung des Projektendes)
 | ||
|                     \item Notation unterschiedlich
 | ||
|                   \end{itemize*}
 | ||
|             \item Allgemein
 | ||
|                   \begin{itemize*}
 | ||
|                     \item Kritischer Pfad (Verzögerung vergrößert Projektdauer)
 | ||
|                     \item Kritische Vorgänge: Teil des kritischen Pfades
 | ||
|                   \end{itemize*}
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Beispiel:
 | ||
|   \begin{itemize*}
 | ||
|     \item Arbeitspakete laut Pflichtenheft (z.B.: Use Case)
 | ||
|     \item Aufgaben festlegen
 | ||
|     \item Abhängigkeiten festlegen
 | ||
|     \item Vorwärtsrechnung durchführen
 | ||
|     \item Rückwärtsrechnung durchführen
 | ||
|     \item Kritischer Pfad und Puffer finden
 | ||
|           %\item %
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Aufwandsschätzung
 | ||
|   \begin{itemize*}
 | ||
|     \item Aus Erfahrungswerten systematisiert
 | ||
|     \item Versuch, wichtige Einflussfaktoren zu erfassen
 | ||
|           \begin{itemize*}
 | ||
|             \item Metriken für Spezifikationen
 | ||
|             \item Komplexität von Teilfunktionen
 | ||
|             \item Menge der Funktionen
 | ||
|             \item Anpassung durch individuelle Faktoren, z.B. abhängig von Erfahrung in der Projektorganisation
 | ||
|           \end{itemize*}
 | ||
|     \item Methoden
 | ||
|           \begin{itemize*}
 | ||
|             \item Function Point Analyse
 | ||
|             \item CoCoMo
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \paragraph{Function Point Analyse}
 | ||
|   \begin{itemize*}
 | ||
|     \item Ursprung IBM Ende 1970er Jahre
 | ||
|     \item Funktionsumfang und Schwierigkeitsgrad von Software
 | ||
|     \item Verschiedene Verfahren
 | ||
|           \begin{itemize*}
 | ||
|             \item für Echtzeit- (Full Function Point Method) und „normale“ Software (Int. Function Point User Group, ISO14143)
 | ||
|           \end{itemize*}
 | ||
|           %\item %
 | ||
|     \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 %
 | ||
|     \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 %
 | ||
|   \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Beispiele: Komplexität, Wiederverwendbarkeit, ...
 | ||
|             \item Werte $0,7 .. 3,0$
 | ||
|           \end{itemize*}
 | ||
|     \item Scale factor SF: Fünf Einflüsse auf Rentabilität der Softwareentwicklung
 | ||
|     \item Notwendige Entwicklungszeit (time to develop) $TDEV = C * PM^F$ mit $F = D + 0,2 * ( E - B )$
 | ||
|     \item Faktoren $C=3,67$ und $D=0,28$, anpassbar
 | ||
|     \item Ressourcenplanung %
 | ||
|     \item Zeitplanung
 | ||
|           \begin{itemize*}
 | ||
|             \item Zeitplan aus Abhängigkeiten, Aufwänden und Ressourcen sowie festen Terminen
 | ||
|             \item Darstellung als Gantt-Chart / Balkendiagramm
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   \subsection{Projektdurchführung}
 | ||
|   Projektorganisation
 | ||
|   \begin{itemize*}
 | ||
|     \item Teilnehmer: Personen, Rollen, Verantwortung, Teams
 | ||
|     \item Linienorganisation:
 | ||
|           \begin{itemize*}
 | ||
|             \item hierarchisch %
 | ||
|             \item Matrixorganisation %
 | ||
|             \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
 | ||
|     \item Wichtiger Dienstleister für den Projekterfolg
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Projektstart
 | ||
|   \begin{itemize*}
 | ||
|     \item Nach Abschluss der Planungsphase
 | ||
|     \item Festlegung von ...
 | ||
|           \begin{itemize*}
 | ||
|             \item Arbeitsstil und interne Organisation
 | ||
|             \item Aufgabenverteilung und Themen-Verantwortung
 | ||
|             \item Erste Aufgaben, Verantwortliche und Termine
 | ||
|             \item Einigung über Meilensteine und Termine
 | ||
|             \item Art und Termine der Projekttreffen
 | ||
|             \item Informationen und Kommunikationswege
 | ||
|             \item Technische Infrastruktur (Versionskontrollsystem, Entwicklungsumgebung, Dokumentverwaltung, Rechnerzugang, verwendete PM-Software usw.)
 | ||
|           \end{itemize*}
 | ||
|     \item Starttreffen des Projekts (kick-off meeting)
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
|   Meetings / Projekttreffen
 | ||
|   \begin{itemize*}
 | ||
|     \item Regelmäßige Abstimmung der Projektteilnehmer
 | ||
|           \begin{itemize*}
 | ||
|             \item Außerdem zu wichtigen Meilensteinen
 | ||
|           \end{itemize*}
 | ||
|     \item Inhalt und Ablauf: geplant (Tagesordnung), Moderator
 | ||
|           \begin{itemize*}
 | ||
|             \item Protokoll des letzten Treffens korrekt?
 | ||
|             \item Aktueller Stand
 | ||
|             \item Bericht über individuelle Aufgaben
 | ||
|             \item Planung des nächsten Termins
 | ||
|           \end{itemize*}
 | ||
|     \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
 | ||
|           \begin{itemize*}
 | ||
|             \item Klar definiertes Zwischenresultat zur Beurteilung des Projektfortschritts
 | ||
|             \item Beispiele: Feinentwurfsdokument fertiggestellt und an Auftraggeber übergeben oder Paket XYZ implementiert und fertig getestet
 | ||
|           \end{itemize*}
 | ||
|     \item Besprechung in Projekttreffen
 | ||
|           \begin{itemize*}
 | ||
|             \item Besprechung des Status jedes Meilensteins / jeder Aufgabe
 | ||
|             \item Welche Aufgaben sind bereits erledigt?
 | ||
|             \item Welche Probleme sind aufgetreten / gelöst?
 | ||
|             \item Verbleibender Aufwand - Terminverschiebung nötig?
 | ||
|             \item Planung der nächsten Schritte (Aufgabe, Verantwortlicher, Termin)
 | ||
|           \end{itemize*}
 | ||
|   \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 Planung ist wichtig, aber nicht übertreiben!
 | ||
|     \item Aufwand und Detaillierungsgrad der Planung an Projektgröße und „echten“ Aufwand anpassen
 | ||
|     \item Pläne müssen sich ändern können!
 | ||
|           \begin{itemize*}
 | ||
|             \item Projekte sind einmalig und daher unvorhersehbar
 | ||
|           \end{itemize*}
 | ||
|     \item Adaptiv planen: nächste Aufgaben genau, spätere grob
 | ||
|     \item Einsatz von Projektmanagement-Software
 | ||
|     \item Projektende
 | ||
|           \begin{itemize*}
 | ||
|             \item Abschlusstreffen
 | ||
|             \item Bewertung von Ergebnis und Organisation - was kann in Zukunft besser gemacht werden?
 | ||
|           \end{itemize*}
 | ||
|   \end{itemize*}
 | ||
| 
 | ||
| \end{multicols}
 | ||
| 
 | ||
| \end{document} |