Softwareproduktlinien - Laufzeitvariabilität

Ähnliche Dokumente
Softwareproduktlinien Teil 3: Laufzeit-Variabilitä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

Moderne Programmierparadigmen Objekt-Orientierung

Softwareproduktlinien Teil 4: Versionsverwaltungs- und Buildsysteme

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

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

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

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

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

Programmieren in Java -Eingangstest-

Softwareproduktlinien Teil 12: Analyse von Produktlinien

Design Patterns. 5. Juni 2013

Programmiermethodik 3. Klausur Lösung

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

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

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Einführung in die Programmierung

Anwendung der Aspektorientierung: Design Patterns

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

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

Informatik II Übung 06. Benjamin Hepp 5 April 2017

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

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

ALP II Dynamische Datenmengen Datenabstraktion

Softwareproduktlinien - Features vs. Aspekte

Schnittstellen, Stack und Queue

Ersetzbarkeit und Verhalten

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

Analyse und Modellierung von Informationssystemen

3. Übungsbesprechung Programmkonstruktion

Client-Server-Beziehungen

Analyse und Modellierung von Informationssystemen

II.4.5 Generische Datentypen - 1 -

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

Objekt-orientierte Programmierung

Paket Kommando. Command Command Processor Visitor

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

Programmieren 2 Java Überblick

Handbuch für die Erweiterbarkeit

Entwurfsprinzip. Entwurfsprinzip

Familienpolymorphismus

Praktikum 4: Delegation

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

Einführung in die Informatik 1

Software-Architektur Design Patterns

Übung: Algorithmen und Datenstrukturen SS 2007

Entwurfsmuster - Iterator & Composite

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

Prof. Dr. Uwe Schmidt. 30. Januar 2017

Einstieg in die Informatik mit Java

Programmieren in Java

Programmieren in Java

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

Einführung in die Programmierung

Informatik II (D-ITET) Übungsstunde 6

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

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

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

Kapitel 5: Interfaces

Software Engineering II (IB) Design Patterns

Funktionales Programmieren mit objektorientierten Sprachen

Einstieg in die Informatik mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces

Entwurfsmuster. Marc Monecke

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

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

Factory Patterns und deren Auswirkung auf die Softwarearchitektur in der Praxis

Einführung in die Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

II.3.1 Rekursive Algorithmen - 1 -

Softwaretechnik 1 Übung 4

Richard Bubel & Martin Hentschel

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

Vererbung, Polymorphie

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

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

Javakurs für Anfänger

Softwareproduktlinien - Analyse von Produktlinien

Schnittstellen und. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Interface. So werden Interfaces gemacht

Programmiermethodik 2. Klausur Lösung

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

Software-Entwurfsmuster

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

Einstieg in die Informatik mit Java

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

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

Transkript:

Softwareproduktlinien - Laufzeitvariabilität Christian Kästner (Universität Marburg) Sven Apel (Universität Passau) Gunter Saake, Thomas Thüm (Universität Magdeburg) 1

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

Agenda Graph-Beispiel Variabilität mit Laufzeitparametern Wiederholung: Modularität Design Patterns für Variabilität Grenzen herkömmlicher Techniken 3

4 Ein Beispiel

Beispiel: Graph-Bibliothek Durchgängiges Beispiel in Vorlesung (Chat-Client in der Ü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, 5

Graph-Feature-Modell 6

Beispiel: Graph-Implementierung 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() {... 7

8 Laufzeitparameter

Parameter 9

Parameter i in grep 10

Globale Konfigurationsoptionen 11 class Conf { public static boolean Logging = false; public static boolean Windows = false; public static boolean Linux = true; class Main { public void foo() { if (Conf.Logging) log( running foo() ); if (Conf.Windows) callwindowsmethod(); else if (Conf.Linux) 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 = new 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() {... 12

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

Domain Eng. Parameterliste (Feature-Modell) Program mit Laufzeitparametern Application Eng. 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 und schwach gekoppelte Module können isoliert verstanden werden Reduziert die Komplexität des Softwareentwicklungsprozesses 18

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;. 19 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/Kopplung Beispiel Gruppierung von Methoden/Aufgaben Viele Aufrufe über Grenzen der Gruppe Gruppe implementiert verschiedene Belange 20

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) 21

Zerlegung und Wiederverwendung 22

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() {... 23

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++) { ((Edge)ev.get(i)).print(); Code Tangling 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() {... 24

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() {... 25

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

Observer Pattern Observer s VIEW Subject 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 1) Bekundet Interesse Subject 3) Informiert über Event Interfaces fügen zusätzliche Flexibilität hinzu 2) Merke Interessenten In Implementierung Klasse für Observer Klasse für Subject Liste in Subject für Observer Subject.addToObservers(Observer) (wird vom Observer aufgerufen) Observer.notify() (wird von Subject aufgerufen) 29 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 32

Strategy Pattern: Beispiel 33

34 Problem: Unflexible Erweiterungsmechanismen

Unflexible Erweiterungsmechanismen Subklassen für Erweiterungen: modular, aber unflexibel Kein mix & match Stack Stack SecureStack UndoStack SecureStack SynchronizedStack SynchronizedStack UndoStack 35 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 SynchronizedUndoSecureStac Aufgrund diverser Probleme (u. a. Diamant-Problem) in nur wenigen Sprachen verfügbar 36

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 37

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(); 38 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 StackDecorator -values -delegate +push() +pop() +size() +push() +pop() +size() LockedStack UndoStack SecureStack 39 +push() +pop() +size() +lock() +unlock() -log +push() +pop() +undo() -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 40

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) 41

Flexible Erweiterungsmechanismen???? 42

Ausblick Konfiguration mit Generator zur Übersetzungszeit Flexiblere Erweiterungsmechanismen Modularisierung von Features 43

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] 44

Quiz Mit welchen Design Pattern könnte man das Feature Color modular implementieren? (kurz begründen) Visualisiere Module, die (a) sehr kohäsiv + stark gekoppelt 45 (b) sehr kohäsiv + schwach gekoppelt (c) wenig kohäsiv + stark gekoppelt (d) wenig kohäsiv + schwach gekoppelt sind (a) (b) (c) (d)