Softwarezuverlä... Gesamtes Lehrangebot Software Design (Gru...

Softwareentwicklung in Großprojekten (Softwaresysteme 3)

Vorlesung

 

"The architect should be equipped with knowledge
of many branches of study and varied kinds of learning,
for it is by his judgement that all work done by the other arts is put to test"
Marcus Vitruvius, De architectura libri decem, around 27 - 13 B.C.

Im Unterschied zu den Hauptstudiumsveranstaltungen zum Fachgebiet Software Engineering, die die Eignung unterschiedlicher ingenieurwissenschaftlicher Ansätze zur Konstruktion und zur Analyse komplexer Software vergleichend bewerten, befaßt sich die Einführungsvorlesung "Softwaresysteme 3" mit den einzelnen Phasen der Softwareentwicklung und dem beispielhaften Einsatz ausgewählter repräsentativer Verfahren zu ihrer Unterstützung.

Dabei wird der durch die bereits erworbenen Codierkenntnisse mit dem "Programmieren-im-Kleinen" bereits vertraute Student schrittweise den Bedarf an weitergehende, strukturierte Vorgehensweisen zur systematischen Bewältigung der Komplexität beim "Programmieren-im-Großen" erkennen.

Nach einer Einleitung zur Ermittlung der Anforderungen an große, komplexe Softwaresysteme, wird ihre Formulierbarkeit anhand ausgewählter Spezifikationssprachen untersucht.

Hauptschwerpunkt der Vorlesung bilden Entwurfsverfahren, die aus einer Problembeschreibung eine angemessene Lösung transparent umzusetzen erlauben. Im besonderen Fall objektorientierter Entwicklung werden Spezifikations- und Entwurfsebenen durch Analyse- und Designdiagramme in UML beschrieben.

Bereits an der Gestaltung der graphischen Benutzerschnittstelle (graphical user interface, GUI) lassen sich einige wesentliche Gütemerkmale eines Entwurfs erkennen, die klassifiziert und an Bespielen illustriert werden. Zur Unterstützung einer möglichst fundierten Vorgehensweise ist man bestrebt, besonders gelungene Konzepte zur Lösung eines speziellen Problems bei der Lösung ähnlicher Probleme wiederzuverwenden. Dieses Bestreben führte zur Idee der sogenannten Entwurfsmuster (design patterns), die für ganze Problemklassen verallgemeinerte konstruktive Lösungsansätze bieten, welche an die jeweils aktuellen Gegebenheiten anzupassen sind.

Als besonders kostspielig und fehleranfällig erweist sich meist die Wartungsphase, in welcher infolge neuer funktionaler Anforderungen bzw. veränderter Systemumgebungen Änderungen an der Software vorzunehmen sind. Zu einer kontrollierten Evolution großer Softwaresysteme die die Vermeidung unerwünschter Seiteneffekte sicherstellen soll, bieten sich äquivalenzerhaltende Transformationen des ursprünglichen Entwurfs bzw. Codes durch Umstrukturierungen, die die zu erwartenden Anpassungen bzw. Erweiterungen transparent vorzunehmen erlauben. Typische Muster der Umstrukturierung (sog. Refactoring) werden besprochen und beispielhaft eingesetzt.

Abschließend behandelt die Vorlesung einige Strategien zum effektiven Testen großer Softwaresysteme.

"Those who cannot remember the past are condemned to repeat it."
George Santayana

Inhaltsübersicht
1. Einführung
2. Anforderungsspezifikation
3. Software-Entwurf
4. Objektorientierte Analyse und Design
5. Entwurfsmuster
6. Implementierung
7. Testen
8. Wartung
Literatur

Ausführliche Inhaltsübersicht


1. Einführung
Motivation für Software Engineering
Historischer Hintergrund, Software-Krise
Beispiele softwarebedingter Unfälle
Ariane 5 Mission
Berliner Feuerwehr
Beherrschung von Software-Fehlern
Arten von Software-Inkorrektheiten
Phasen des Software-Entwicklungsprozesses
Modelle des Software-Lebenszyklus
Build-and-Fix Modell
Wasserfall-Modell
V-Modell
Agile Vorgehensmodelle

2. Anforderungsspezifikation
Einführung, Aufgabe der Spezifikation
Eigenschaften von Anforderungen
Allgemeine Anforderungsermittlung
Problemdefinition
Fragebogen, Interview, Anforderungsreview, Workshop
Konkrete Vorgehensweise
Use-Case Modellierung, Volere Modell
Zufriedenheit und Erwartungshaltung
Anforderungsverwaltung
Änderungsprozess, Tools zur Verwaltung
Spezifikationssprachen
Informale Spezifikationssprachen
     Gefahren: Tilgung, Generalisierung, Verzerrung, Nominalisierung
     Regeln zur Überprüfung von Anforderungen
Semi-formale Spezifikationssprachen
     ER-Diagramm, Tabelle, Ablaufdiagramm
Formale Spezifikationssprachen
     Endlicher Zustandsautomat, Petri-Netze, OCL
Graphische Benutzeroberflächen
Grundsätze der Software-Ergonomie

3. Software-Entwurf
Einführung, Aufgaben der Entwurfsphase
Software-Grobentwurf
Prinzip der Zerlegung, Abstraktion
Schnittstellen von Komponenten
Klassische Architekturmodelle
Blockdiagramm, Datenspeichermodell, Schichtenmodell,
Client/Server-Modell, Verteiltes System, CORBA
Kohäsion und Kopplung
Kopplungsarten
Kohäsionsarten
Software-Feinentwurf
Programmiersprachenneutrale Notationen
Struktogramm, Pseudocode

4. Objektorientierte Analyse und Design
Einführung
Klasse, Objekt, Vererbung, Polymorphie
Delegation und Propagation
UML, Geschichte
OOA: Statische Modellierung
Objektorientierte Analyse, Statisches Modell
Substantivmethode
Klassendiagramme
Beispiel: Bibliothek
OOA: Dynamische Modellierung
Sequenzdiagramme
Kollaborationsdiagramme
Beispiel: Geldautomat
OOD: Architekturmodellierung
Paketdiagramme
Komponentendiagramme
Einsatzdiagramme
Beispiel: Bibliotheksverwaltung
OOD: Statische Modellierung
Klassendiagramme
Assoziationen, Rollennamen, Multiplizitäten
Aggregation, Komposition, Interface
Zusicherungen, OCL
Detaillierte Klassendiagramme
OOD: Dynamische Modellierung
Beispiel für Verfeinerung: Geldautomat
Synchrone und asynchrone Nachrichten
Modellierung durch Zustandsdiagramme
Nebenläufige Zustandsautomaten

5. Entwurfsmuster
Wiederverwendung
Klassifikation nach Aufgabe und Gültigkeitsbereich
Überblick Entwurfsmuster
Singleton
Abstrakte Fabrik
Adapter
Brücke
Proxy
Dekorierer
Kompositum
Schablonenmethode
Befehl
Beobachter
Strategie
Zuständigkeitskette

6. Implementierung
Überblick über Programmiersprachen
Historische Entwicklung, Programmiersprachengenerationen
Fehleranfällige Konstrukte
Codierungsregeln
Codegenerierung aus UML-Konstrukten
Vom OOD zur Implementierung
Beispiel: Point-Of-Sale System (POS)
     POS: Klassendiagramm
     POS: Sequenzdiagramm
     Allgemeine Vorgehensweise
     Erzeugung der Klassen
     Typanpassung von Attributen, Methoden
     Umsetzung der Assoziationen
Round-Trip-Engineering

7. Testen
Einführung
Testen nach Phasen der SW-Entwicklung
Systematische Vorgehensweise
Testphasen, Teststrategien
Funktionales Testen
Strukturelles Testen
     Anweisungsüberdeckung
     Pfadüberdeckung
Regressionstest
UML-unterstützte Testfalldefinition

8. Wartung
Einführung
Bedeutung der Wartungsphase
Aktivitäten in der Wartungsphase
Wartungsaufgaben
Wartungsmanagement
Refactoring
Motivation und Ziel
Refactoring auf Code-Ebene, Design-Ebene
Refactoring-Technik
Indirektion




top