Softwareproduktlinien Teil 3: Laufzeit-Variabilität

Ähnliche Dokumente
Softwareproduktlinien - Laufzeitvariabilität

Teil 5 Objektorientierung und ihre Grenzen

Implementierung v. Software-Produktlinien - Einführung und Überblick

Implementierung v. Software-Produktlinien - Einführung und Überblick

Softwareproduktlinien Teil 5: Präprozessoren (Variabilitätsannotationen)

Erweiterte Programmierkonzepte für maßgeschneiderte Datenhaltung Teil 3: Software-Produktlinien

Softwareproduktlinien - Versionsverwaltungs- und Buildsysteme

Strategy & Decorator Pattern

Design Patterns. 3. Juni 2015

Algorithmen und Datenstrukturen

Softwareproduktlinien Teil 4: Versionsverwaltungs- und Buildsysteme

Inhalt. Design patterns Kernbereiche Creational patterns Factory method Abstract Factory Builder Structural patterns Adapter Facade Decorator

Moderne Programmierparadigmen Objekt-Orientierung

Überblick FBC SNW Zusammenfassung. Entwurfsmuster. Eine Einführung. Botond Draskoczy. Marcus Vitruvius Pollio

Entwurfsmuster. Tao Zhang Technische Universität München Lehrstuhl für Angewandete Softwaretechnik

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Programmieren in Java -Eingangstest-

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Design Patterns. 5. Juni 2013

Creational Patterns. Seminar Software-Entwurf. Thomas Liro WS 2004/05.

Anwendung der Aspektorientierung: Design Patterns

Programmiermethodik 3. Klausur Lösung

Softwareproduktlinien Teil 12: Analyse von Produktlinien

Software-Entwurfsmuster (weitere) A01 OOP. Software-Entwurfsmuster (weitere)

Softwaretechnik. Überblick I. Prof. Dr. Rainer Koschke. Sommersemester 2009

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Softwaretechnik. Prof. Dr. Rainer Koschke. Fachbereich Mathematik und Informatik Arbeitsgruppe Softwaretechnik Universität Bremen

Einführung in die Programmierung

Decorator Pattern. Analyse- und Design-Pattern CAS SWE FS14. Roland Müller Samuel Schärer

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Schnittstellen, Stack und Queue

ALP II Dynamische Datenmengen Datenabstraktion

Analyse und Modellierung von Informationssystemen

Analyse und Modellierung von Informationssystemen

3. Übungsbesprechung Programmkonstruktion

II.4.5 Generische Datentypen - 1 -

Softwareproduktlinien - Features vs. Aspekte

Entwurfsmuster. Marc Monecke

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

Software Engineering. 10. Entwurfsmuster II. Franz-Josef Elmer, Universität Basel, HS 2015

Ersetzbarkeit und Verhalten

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Einstieg in die Informatik mit Java

Client-Server-Beziehungen

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Programmieren 2 Java Überblick

Objekt-orientierte Programmierung

Software-Architektur Design Patterns

Grundlagen der Programmierung Prof. H. Mössenböck. 15. Pakete

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

2.4 Datenabstraktion und Objektorientierung Datenabstraktion in Programmiersprachen

Einstieg in die Informatik mit Java

Richard Bubel & Martin Hentschel

Prof. Dr. Uwe Schmidt. 30. Januar 2017

Handbuch für die Erweiterbarkeit

JUnit a Cook s Tour. Framework in Java Automatisierter Ablauf von Testfällen Testläufe kombinieren. Unterlagen als PDF auf der Übungsseite!

Paket Kommando. Command Command Processor Visitor

Programmieren in Java

Übung: Algorithmen und Datenstrukturen SS 2007

Entwurfsmuster - Iterator & Composite

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Familienpolymorphismus

Martin Unold INFORMATIK. Geoinformatik und Vermessung

So#wareproduktlinien - Feature-Orien4erung. Sven Apel (Universität Passau) Chris4an Kästner (CMU) Gunter Saake, Thomas Thüm (Universität Magdeburg)

Programmieren in Java

Software Engineering II (IB) Design Patterns

Kapitel 5: Interfaces

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Praktikum 4: Delegation

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren I. Kapitel 13. Listen

Funktionales Programmieren mit objektorientierten Sprachen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

12 Abstrakte Klassen, finale Klassen und Interfaces

II.3.1 Rekursive Algorithmen - 1 -

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Informatik II (D-ITET) Übungsstunde 6

Einführung in die Programmierung

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Objektorientierte Programmierung. Kapitel 14: Interfaces

Software Product Lines

Softwaretechnik 1 Übung 4

Interface. So werden Interfaces gemacht

Einstieg in die Informatik mit Java

Einführung in die Informatik 2

Ein Entwurfsmuster der GoF. vorgestellt von. Sigrid Weil 16. Januar 2008

Einführung in die Programmierung

Datenstrukturen / Container in Java

Entwurfsprinzip. Entwurfsprinzip

Programmierkurs Java

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Programmiermethodik 1. Klausur

Algorithmen und Datenstrukturen II

Software Engineering II (IB) Design Patterns

Vererbung, Polymorphie

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Transkript:

Softwareproduktlinien Teil 3: Laufzeit-Variabilität Christian Kästner (Universität Marburg) Sven Apel (Universität Passau) Gunter Saake (Universität Magdeburg) 1

Application Eng. Domain Eng. Wie Variabilität implementieren? Feature-Modell Wiederverwendbare Implementierungsartefakte 2 Feature-Auswahl Generator Fertiges Program

Agenda Graph-Beispiel Variabilität mit Parametern Wiederholung: Modularität Design Patterns für Variabilität Unflexible Vererbungshierarchien 3

4 Ein Beispiel

Beispiel: Graph-Bibliothek Durchgängiges Beispiel in Vorlesung (Chat-Client in Übung) Bibliothek von Graph-Datenstrukturen und Algorithmen Gewichtete/ungewichtete Kanten Gerichtete/ungerichtete Kanten Gefärbte Knoten Algorithmen: kürzester Pfad, minimale Spannbäume, Transitive Hülle,

Graph-Feature-Modell

Graph-Implementierungsbeispiel class Graph { class Node { Vector nv = new Vector(); Vector ev = new Vector(); int id = 0; Edge add(node n, Node m) { Color color = new Color(); Edge e = new Edge(n, m); void print() { nv.add(n); nv.add(m); ev.add(e); Color.setDisplayColor(color); e.weight = new Weight(); System.out.print(id); return e; Edge add(node n, Node m, Weight w) Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); class Edge { e.weight = w; return e; Node a, b; Color color = new Color(); void print() { Weight weight; = new Weight(); for(int i = 0; i < ev.size(); i++) { Edge(Node _a, Node _b) { a = _a; b = _b; ((Edge)ev.get(i)).print(); void print() { Color.setDisplayColor(color); a.print(); b.print(); weight.print(); class Color { static void setdisplaycolor(color c) {... class Weight { void print() {...

8 Laufzeit-Parameter

Parameter 9

Parameter i in grep 10

Globale Konfigurationsoptionen 11 class Config { public static boolean islogging = false; public static boolean iswindows = false; public static boolean islinux = true; class Main { public void foo() { if (islogging) log( running foo() ); if (iswindows) callwindowsmethod(); else if (islinux) calllinuxmethod(); else throw RuntimeException();

Graph-Implementierung class Conf { public static boolean COLORED = true; public static boolean WEIGHTED = false; class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); if (Conf.WEIGHTED) e.weight = new Weight(); return e; Edge add(node n, Node m, Weight w) if (!Conf.WEIGHTED) throw RuntimeException(); Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; void print() { for(int i = 0; i < ev.size(); i++) { ((Edge)ev.get(i)).print(); class Node { int id = 0; Color color = new Color(); void print() { if (Conf.COLORED) Color.setDisplayColor(color); System.out.print(id); class Edge { Node a, b; Color color = new Color(); Weight weight; Edge(Node _a, Node _b) { a = _a; b = _b; void print() { if (Conf. COLORED) Color.setDisplayColor(color); a.print(); b.print(); if (!Conf.WEIGHTED) weight.print(); class Color { static void setdisplaycolor(color c) {... class Weight { void print() {...

Propagierte Parameter durch viele Aufrufe propagiert statt globaler Variable 13

Konfiguration Kommandozeilenparameter Config-Datei Dialog Quelltext 14

Diskussion Variabilität im gesamten Program verteilt Globale Variablen oder lange Parameterlisten Konfiguration geprüft? Änderungen zur Laufzeit möglich? Geschützt vor Aufruf deaktivierter Funktionalität? Kein Generator; immer alle Variabilität ausgeliefert Codegröße, Speicherverbrauch, Performance Ungenutzte Funktionalität als Risiko 15

Application Eng. Domain Eng. Parameterliste (Feature-Modell) Program mit Laufzeitparametern Parameterauswahl (Feature-Auswahl) Setzen der Startparameter Programmausführung mit gewünschtem Verhalten 16

17 Wiederholung: Modularität

Was ist Modularität Modularität ist Kohäsion plus Kapselung Kapselung: Verstecken von Implementierungsdetails hinter einer Schnittstelle Kohäsion: Gruppieren verwandter Programmkonstrukte in einer adressierbaren Einheit (z.b. Paket, Klasse, ) Kohäsive Module können isoliert verstanden werden Reduziert die Komplexität des Softwareentwicklungsprozesses

Kapselung public class ArrayList<E> { public void add(int index, E element) { if (index > size index < 0) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); ensurecapacity(size+1); System.arraycopy(elementData, index, elementdata, index + 1, size - index); elementdata[index] = element; size++; public int indexof(object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementdata[i]==null) return i; else { for (int i = 0; i < size; i++) if (o.equals(elementdata[i])) return i; return -1;. public interface List<E> { void add(int index, E element); int indexof(object o);. Implementierungsdetails werden versteckt Schnittstelle beschreibt Verhalten Implementierung wird austauschbar

Kohäsion Beispiel Gruppierung von Methoden/Aufgaben Viele Aufrufe über Grenzen der Gruppe Gruppe implementiert verschiedene Belange

Warum Modularität? Software leicht verständlich (divide and conquer) Versteckt Komplexität von Teilstücken hinter Schnittstellen (information hiding) Einfacher zu warten, da Änderungen lokal erfolgen können (maintainability) Teile der Software können wiederverwendet werden (reusability) Module können auch in neuem Kontext in anderen Projekte neu zusammengestellt werden (variability)

Zerlegung und Wiederverwendung

Probleme? Verstreuter Code class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); if (Conf.WEIGHTED) e.weight = new Weight(); return e; Edge add(node n, Node m, Weight w) if (!Conf.WEIGHTED) throw RuntimeException(); Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; void print() { for(int i = 0; i < ev.size(); i++) { ((Edge)ev.get(i)).print(); Code Scattering class Node { int id = 0; Color color = new Color(); void print() { if (Conf.COLORED) Color.setDisplayColor(color); System.out.print(id); class Edge { Node a, b; Color color = new Color(); Weight weight; Edge(Node _a, Node _b) { a = _a; b = _b; void print() { if (Conf. COLORED) Color.setDisplayColor(color); a.print(); b.print(); if (!Conf.WEIGHTED) weight.print(); class Color { static void setdisplaycolor(color c) {... class Weight { void print() {...

Probleme? Vermischter Code class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); if (Conf.WEIGHTED) e.weight = new Weight(); return e; Edge add(node n, Node m, Weight w) if (!Conf.WEIGHTED) throw RuntimeException(); Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; void print() { for(int i = 0; i < ev.size(); i++) { Code Tangling ((Edge)ev.get(i)).print(); class Node { int id = 0; Color color = new Color(); void print() { if (Conf.COLORED) Color.setDisplayColor(color); System.out.print(id); class Edge { Node a, b; Color color = new Color(); Weight weight; Edge(Node _a, Node _b) { a = _a; b = _b; void print() { if (Conf. COLORED) Color.setDisplayColor(color); a.print(); b.print(); if (!Conf.WEIGHTED) weight.print(); class Color { static void setdisplaycolor(color c) {... class Weight { void print() {...

Probleme? Replizierter Code class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); if (Conf.WEIGHTED) e.weight = new Weight(); return e; Edge add(node n, Node m, Weight w) if (!Conf.WEIGHTED) throw RuntimeException(); Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; void print() { for(int i = 0; i < ev.size(); i++) { ((Edge)ev.get(i)).print(); Code Replication class Edge { class Node { int id = 0; Color color = new Color(); void print() { if (Conf.COLORED) Color.setDisplayColor(color); System.out.print(id); Node a, b; Color color = new Color(); Weight weight; Edge(Node _a, Node _b) { a = _a; b = _b; void print() { if (Conf. COLORED) Color.setDisplayColor(color); a.print(); b.print(); if (!Conf.WEIGHTED) weight.print(); class Color { static void setdisplaycolor(color c) {... class Weight { void print() {...

26 Design Patterns für Variabilität

Design Patterns Muster für den Entwurf von Lösungen für wiederkehrende Probleme Viele Design Patterns für Variabilität, Entkoppelung und Erweiterbarkeit Hier Auswahl: Observer Template Method Strategy Decorator 27

Subject Observers Observer Pattern VIEW A = 50% B = 30% C = 20% [Quelle: Meyer/Bay] 28

Observer Pattern Define[s] a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. [GoF, p 293] * OBSERVER observers * SUBJECT add_observer* update* remove_observer* notify_observers* update+ + MY_OBSERVER subject + MY_SUBJECT add_observer+ remove_observer+ notify_observers+ 29

Template Method Pattern public abstract class BubbleSorter{ protected int length = 0; protected void sort() { if(length <= 1) return; for(int nexttolast= length-2; nexttolast>= 0; nexttolast--) for(int index = 0; index <= nexttolast; index++) if(outoforder(index)) swap(index); protected abstract void swap(int index); protected abstract boolean outoforder(int index); 30

IntBubbleSorter public class IntBubbleSorter extends BubbleSorter{ private int[] array = null; public void sort(int[] thearray) { array = thearray; length = array.length; super.sort(); protected void swap(int index) { int temp = array[index]; array[index] = array[index+ 1]; array[index+1] = temp; protected boolean outoforder(int index) { return(array[index] > array[index+ 1]); 31

Strategy Pattern 33 Einführung in die Softwaretechnik

Strategy Pattern: Beispiel 34 Einführung in die Softwaretechnik

39 Grenzen von Vererbung und Decorator Patt. (Problem: Unflexible Klassenhierarchien)

Unflexible Erweiterungsmechanismen Subklassen für Erweiterungen: modular, aber unflexibel Kein mix & match Stack Stack SecureStack UndoStack SecureStack SynchronizedStack SynchronizedStack UndoStack z. B. White-Box-Framework

Lösung I Kombinierte Klassenhierarchien Kombinatorische Explosion der Varianten Massive Code-Replikation Stack SynchronizedStack UndoStack SecureStack SynchronizedUndoStack UndoSecureStack Mehrfachvererbung Kombinatorische Explosion SynchronizedUndoSecureStack Aufgrund diverser Probleme (u. a. Diamant-Problem) in nur wenigen Sprachen verfügbar

Diamant-Problem Stack -values +push() +pop() +size() Was passiert? new LockedUndoStack().pop() UndoStack -log +push() +pop() +undo() LockedStack +push() +pop() +size() +lock() +unlock() Multiple inheritance is good, but there is no good way to do it. A. SYNDER LockedUndoStack

Delegation statt Vererbung class LockedStack implements IStack { final IStack _delegate; public LockedStack(IStack delegate) { this._delegate = delegate; private void lock() { /*... /* private void unlock() { /*... /* public void push(object o) { lock(); _delegate.push(o); unlock(); public Object pop() { lock(); Object result = _delegate.pop(); unlock(); return result; public int size() { return _delegate.size(); class UndoStack implements IStack { final IStack _delegate; public UndoStack(IStack delegate) { this._delegate = delegate; public void undo() { /*... /* public void push(object o) { remember(); _delegate.push(o); public Object pop() { remember(); return _delegate.pop(); public int size() { return _delegate.size(); Main: IStack stack = new UndoStack( new LockedStack(new Stack()));

Decorator Pattern «interface» IStack +push() +pop() +size() 1 1 Stack -values +push() +pop() +size() StackDecorator -delegate +push() +pop() +size() LockedStack +push() +pop() +size() +lock() +unlock() UndoStack -log +push() +pop() +undo() SecureStack -keyphrase +push() +pop() +encrypt() +decrypt()

Beispiel: Decorator in java.io java.io enthält verschiedene Funktionen zur Ein- und Ausgabe: Programme operieren auf Stream-Objekten... Unabhängig von der Datenquelle/-ziel und der Art der Daten 46 Einführung in die Softwaretechnik

Delegation statt Vererbung Diskussion Dynamische Kombination möglich Erweiterungen müssen alle unabhängig sein Kann keine Methoden hinzufügen, nur bestehende erweitern Kein spätes Binden (keine virtuellen Methoden) Viele Indirektionen in der Ausführung (Performance) Mehrere Objektinstanzen bilden ein Objekt (Objektschizophrenie)

Flexible Erweiterungsmechanismen????

Ausblick Konfiguration mit Generator zur Übersetzungszeit Modularisierung von Features 56

Literatur Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201- 63361-2. [Standardwerk Design Patterns] Bertrand Meyer, Object-Oriented Software Construction, Prentice Hall, 1997 Chapters 3, 4 [Zu Modularität]