SOFTWARETECHNIK Kapitel 5 – Wiederverwendung Vorlesung im Wintersemester 2012/13 FG System- und Software-Engineering Prof. Dr.-Ing. Armin Zimmermann Inhalt Einführung Entwurfsmuster Klassenbibliotheken Frameworks Komponenten SSE Zimmermann Softwaretechnik Wiederverwendung – 2 Einführung Warum Wiederverwendung? Geringerer Aufwand Das Rad nicht noch einmal neu erfinden Verwenden üblicher, aus Erfahrung gewachsener Strukturen .. und warum nicht? Aufwand für Anpassung kann hoch sein! Einarbeiten in teilweise komplexe Schnittstellen Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung SSE Zimmermann Softwaretechnik Wiederverwendung – 3 Einführung Beispiele für Wiederverwendung Architekturmuster Entwurfsmuster (Patterns) Modellebene Frameworks Komponenten Klassenbibliotheken Module Codeebene SSE Zimmermann Softwaretechnik Wiederverwendung – 4 Inhalt Einführung Entwurfsmuster Klassenbibliotheken Frameworks Komponenten SSE Zimmermann Softwaretechnik Wiederverwendung – 5 Entwurfsmuster Was ist ein Entwurfsmuster ? Eine schematische Lösung für eine Klasse verwandter Probleme Höhere Ebene: Architekturmuster Feinentwurf: Entwurfsmuster (design pattern) Beschreibung von interagierenden Objekten und Klassen, die ein grundsätzliches Entwurfsproblem in einem bestimmten Kontext lösen [GoF: Gamma, Helm, Johnson, Vlissides, “Design Patterns – Elements of Reusable Object-Oriented Software” 1994] SSE Zimmermann Softwaretechnik Wiederverwendung – 6 Entwurfsmuster Analogie außerhalb der Informatik Each pattern .. describes a problem which occurs over and over again in our environment, and then .. describes the core of the solution to that problem, in such a way that you can use this solution a million times over, .. without ever doing it the same way twice. (Alexander, Ishikawa, Silverstein et al: “A Pattern Language: Towns/Buildings/Construction” 1977) SSE Zimmermann Softwaretechnik Wiederverwendung – 7 Entwurfsmuster Wie helfen Muster im Entwurf? Identifizieren von Klassen (Anwendungs- und Lösungsdomäne) Regeln sind abstrakt oder an realen Objekten orientiert Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben Änderbarkeit und Lesbarkeit des Entwurfs verbessern Arten von Entwurfsmustern Erzeugungsmuster Strukturmuster Verhaltensmuster SSE Zimmermann Softwaretechnik Wiederverwendung – 8 Entwurfsmuster Übersicht Quelle: Polze SSE Zimmermann Softwaretechnik Wiederverwendung – 9 Entwurfsmuster Beschreibung von Entwurfsmustern Name Problem Lösung Motivation, Anwendungsbereich, Bedingungen Struktur (Klassendiagramm) Bestandteile (meist Klassen-, Assoziations- und Operationsnamen) Rollennamen: Platzhalter für Bestandteile der Anwendung feste Bestandteile der Implementierung Objektinteraktion (Abläufe, evtl. Sequenzdiagramm) Diskussion Vor- und Nachteile, Abhängigkeiten, Einschränkungen Bekannte Verwendung, Spezialfälle Nach Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 10 Entwurfsmuster Erzeugungsmuster Factory Method, Fabrikmethode Abstract Factory, Abstrakte Fabrik Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen Prototype, Prototyp Schnittstelle zur Erzeugung von Familien verwandter Objekte Builder, Erbauer Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert Objekterzeugung durch Vorlage und Kopie Singleton Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet SSE Zimmermann Softwaretechnik Wiederverwendung – 11 Entwurfsmuster Beispiel Erzeugungsmuster: Fabrik Varianten von Objekten sollen erzeugt werden, ohne dass sich der Auslöser um die Entscheidung kümmern muss Erzeugen von Objekten, deren genauer Typ (Klasse) zur Laufzeit (datenabhängig) entschieden wird Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 12 Entwurfsmuster Beispiel für Fabrikmuster Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 13 Entwurfsmuster Strukturmuster I Adapter Bridge, Brücke Abstraktion von Implementierung entkoppeln, um beide unabhängig ändern zu können Decorator, Dekorierer Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen) Facade, Fassade Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff SSE Zimmermann Softwaretechnik Wiederverwendung – 14 Entwurfsmuster Strukturmuster II Flyweight, Fliegengewicht Composite, Verbund, Kompositum Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand) Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden Proxy, Stellvertreter Kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt Gründe: Schutz, entfernter Zugriff (remote proxy), smart pointer, Erzeugung on demand SSE Zimmermann Softwaretechnik Wiederverwendung – 15 Entwurfsmuster Beispiel Strukturmuster: Adapter Alternativer Name: Wrapper Problem: Anpassung der Schnittstelle eines vorgegebenen Objekts (adaptee) an eine Schnittstelle (target) Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 16 Entwurfsmuster Adapter Beispielproblem Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 17 Entwurfsmuster Adapter Beteiligte Rollen des Musters für das Beispielproblem Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 18 Entwurfsmuster Adapter Lösung des Beispielproblems Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 19 Entwurfsmuster Adapter Beispielhafte Notation in UML Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 20 Entwurfsmuster Verhaltensmuster I Command, Befehl Observer, Beobachter 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 Visitor, Besucher Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen) Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird Interpreter Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache SSE Zimmermann Softwaretechnik Wiederverwendung – 21 Entwurfsmuster Verhaltensmuster II Iterator Memento Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können Template Method, Schablonenmethode Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden Strategy, Strategie Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte SSE Zimmermann Softwaretechnik Wiederverwendung – 22 Entwurfsmuster Verhaltensmuster III Mediator, Vermittler State, Zustand Objekt, das das Zusammenspiel einer lose gekoppelten Objektmenge in sich kapselt. Vermeidet direkten Bezug der Objekte untereinander und ermöglicht unabhängige Änderung des Zusammenspiels Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt Chain of Responsibility, Zuständigkeitskette Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist SSE Zimmermann Softwaretechnik Wiederverwendung – 23 Entwurfsmuster Beispiel Verhaltensmuster: Iterator Problem: Häufiges Durchlaufen von Sammlungen von Objekten zur Anwendung einer Operation (Zählen, Ändern, ..) Sammlung intern implementiert z.B. als Liste, Menge, hash table oder Baum Durchlaufen: unabhängig von interner Repräsentation! Mehrere Durchläufe (Sichten) gleichzeitig möglich? Lösung: Interface oder Abstrakte Klasse für Zugriffsschnittstelle SSE Zimmermann Softwaretechnik Wiederverwendung – 24 Entwurfsmuster Beispiel Verhaltensmuster: Iterator Prinzip des Musters Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 25 Entwurfsmuster Anwendung Iterator Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 26 Entwurfsmuster class DirectoryIterator implements Iterator { private Object[] collection; private int current; public DirectoryIterator(Object[] init) { collection = init; current = 0; } public boolean hasNext() { return current < collection.length; } public Object next() { return collection[current++]; } } SSE Zimmermann Softwaretechnik Wiederverwendung – 27 Entwurfsmuster Object[] myDirectory = new Object[] { new File(..), new File(..), .. }; DirectoryIterator iterator = new DirectoryIterator(myDirectory); while(iterator.hasNext()) { System.out.println(iterator.next()); } SSE Zimmermann Softwaretechnik Wiederverwendung – 28 Entwurfsmuster Auswahl von Entwurfsmustern Überlege, wie Entwurfsprobleme durch Muster gelöst werden Beachten der Problembeschreibung der Muster Untersuche Zusammenspiel der Muster Finde ähnliche Strukturen Finde passende Objekte Lege Granularität (Abstraktionsgrad) fest Spezifiziere Schnittstellen der Objekte Jeweils für Mustertypen (Erzeugung, Struktur, Verhalten) Überlege, welche Gründe zu Entwurfsänderungen führen können Welche Teile des Entwurfs sollten daher variabel sein? Welche Aspekte sollten getrennt werden? SSE Zimmermann Softwaretechnik Wiederverwendung – 29 Entwurfsmuster Anwendung von Entwurfsmustern Untersuche Anwendbarkeit und Konsequenzen Analysiere Struktur, Teilnehmer und Kollaborationen Wähle aus dem Anwendungskontext Namen für Teilnehmer Spezifiziere die teilnehmenden Klassen Deklariere Schnittstellen, Vererbung und Variablen Identifiziere existierende Entwurfsklassen, die durch das Muster beeinflusst werden Wähle anwendungsspezifische Namen für Operationen Implementiere Operationen entsprechend den Verantwortlichkeiten und Kollaborationen des Musters SSE Zimmermann Softwaretechnik Wiederverwendung – 30 Entwurfsmuster Beziehungen zwischen Mustern Quelle: Polze SSE Zimmermann Softwaretechnik Wiederverwendung – 31 Inhalt Einführung Entwurfsmuster Klassenbibliotheken Frameworks Komponenten SSE Zimmermann Softwaretechnik Wiederverwendung – 32 Klassenbibliotheken Wiederverwendung von Code – Voraussetzungen Klar definierte Schnittstelle Dokumentation Pflege und Wartung der verwendeten Software Softwareentwurf für Wiederverwendung Einfachster Fall, alte Idee im Entwurf: Modul Ein Modul ist ein Teil eines Softwaresystems, das bestimmte Dienste bereitstellt, aber kein eigenständiges System ist. SSE Zimmermann Softwaretechnik Wiederverwendung – 33 Klassenbibliotheken Klassenbibliotheken Zusammenfassung von Modulen, Klassen, etc. Mit einem bestimmten (abstrakten) Zweck Abstrakte Datenverwaltung, Templates Grundlegende System-Aufgaben Untere Kapselungs-Schicht des Laufzeitsystems oder der Programmierumgebung Numerische Routinen, Simulation, … Wird in Anwendung eingebunden (importiert), API Objekte instanziieren oder Klassen ableiten Meist passiv: Kontrollfluss wird von Anwendung gesteuert Beispiele stdclib, MFC, GNU scientific library, Java 3D SSE Zimmermann Softwaretechnik Wiederverwendung – 34 Klassenbibliotheken Beispiel: Boost Boost provides free peer-reviewed portable C++ source libraries that may become part of future standard C++ Available for Unix, Linux, Windows, … Math, Containers, File system, additional types, IPC, MPI, smart pointers, Regex, Statecharts, … www.boost.org SSE Zimmermann Softwaretechnik Wiederverwendung – 35 Klassenbibliotheken include <boost/numeric/conversion/cast.hpp> using boost::numeric_cast; using boost::numeric::positive_overflow; … try { int i=42; short s = numeric_cast<short>(i); } catch(negative_overflow& e) { std::cout << e.what(); } catch(positive_overflow& e) { std::cout << e.what(); } SSE Zimmermann Softwaretechnik Wiederverwendung – 36 Inhalt Einführung Entwurfsmuster Klassenbibliotheken Frameworks Komponenten SSE Zimmermann Softwaretechnik Wiederverwendung – 37 Frameworks Was ist ein Framework? A framework is a set of prefabricated software building blocks that programmers can use, extend, or customize for specific computing solutions [Taligent] Ein framework (Rahmenwerk, Anwendungsgerüst) ist eine Menge von zusammengehörigen Klassen, die einen abstrakten Entwurf für eine Problemfamilie darstellen [nach Pomberger/Blaschek] Ziele Wiederverwendung von Code, Architektur, Entwurfsprinzipien und Verhaltensschema Ähnliche Benutzungsschnittstelle SSE Zimmermann Softwaretechnik Nach Rumpe Wiederverwendung – 38 Frameworks Klassifikation I Anwendungs-Framework (application framework) Bereichsspezifisches Framework (domain framework) Gibt Systemarchitektur für typische Anwendungsstruktur vor GUI-Framework: Motif, Qt, Swing, … Expertenwissen für Anwendungsbereich für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, … Beispiel: AUTOSAR Infrastrukturgerüst (support framework) Gerätetreiber, Anpassung an Hardware Middleware: DCOM, Java RMI, CORBA, WebSphere, … SSE Zimmermann Softwaretechnik Wiederverwendung – 39 Frameworks Klassifikation II Offene Programmgerüste Erweiterbarkeit durch Vererbung und dynamische Bindung Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden Geschlossene Programmgerüste Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation SSE Zimmermann Softwaretechnik Wiederverwendung – 40 Frameworks Vergleich Klassenbibliothek / Framework Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 41 Frameworks Beispiel GUI-Framework: Java Swing Plattformunabhängige Grafikbibliothek look-and-feel anpassbar mit Skins UIManager.setLookAndFeel( new MetalLookAndFeel()); SSE Zimmermann Softwaretechnik Wiederverwendung – 42 Frameworks import java.awt.event.*; import javax.swing.*; class MyFrame extends JFrame { public MyFrame() { setTitle("My Closeable Frame"); setSize(300,200); setLocation(10,200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } Public static void main(String[] args) { JFrame f = new MyFrame(); f.show(); } } SSE Zimmermann Softwaretechnik Wiederverwendung – 43 Frameworks Einordnung in Softwarearchitektur Beispielhafte Schichtenstruktur GUI-Framework Anwendungslogik Datenhaltung Klassenbibliothek AbstraktionsSchicht Laufzeitsystem SSE Zimmermann Softwaretechnik Wiederverwendung – 44 Frameworks Vorteile Weitergabe von Expertenwissen Durchdachtes Design: langfristige Aufwandsersparnis Wartungsaufwand reduziert, systematische Tests möglich Prinzipiell sehr hohe Produktivität möglich Erleichtert Integration und Konsistenz verwandter Anforderungen Nachteile Erstellung und Einarbeitung aufwändig Zusätzlicher Dokumentations- und Wartungsaufwand Fehlersuche erschwert durch Overhead des Frameworks Kombination verschiedener Frameworks sehr schwierig Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 45 Inhalt Einführung Entwurfsmuster Klassenbibliotheken Frameworks Komponenten SSE Zimmermann Softwaretechnik Wiederverwendung – 46 Komponenten Bausteinorientierte Programmierung (component-ware) Softwareentwicklung: Konstruktion aus vorgegebenen Bausteinen (siehe Kapitel Entwurf und Architektur!) Entsprechung für Wiederverwendung: Generische Bausteine (components) Anpassbar, zusammensetzbar Werkzeuggestützte bzw. grafische Kompositionsmechanismen Beispiele: Java Beans, Enterprise Java Beans (EJBs), Microsoft COM+ Komponenten-Entwicklung oft auch projektspezifisch nach: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 47 Komponenten Definition Komponente A component is an independently deliverable unit of software that encapsulates its design and implementation and offers interfaces to the out-side, by which it may be composed with other components to form a larger whole. [Nierstrasz] A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A software component can be deployed independently and is subject to composition by third parties. [Szyperski] SSE Zimmermann Softwaretechnik Wiederverwendung – 48 Komponenten Warum Komponenten? Monolithische, proprietäre Software führt zunehmend zu Problemen Zunehmend verteilte Anwendungen mit offener Struktur und Internet-Anbindung Zusammensetzen der Funktionalität aus standardisierten Elementen, die über offene Schnittstellen kommunizieren Komponenten sollen Flexibilität bei sich ändernden Anforderungen erhöhen Weg aus der „Software-Krise“? SSE Zimmermann Softwaretechnik Wiederverwendung – 49 Komponenten Eigenschaften Müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein Kontextabhängigkeiten: benötigte Komponenten-Infrastruktur und Systemressourcen Kapseln ihre angebotenen Funktionen Werden immer als ganze Einheit eingesetzt; alle Bestandteile sind enthalten (Archiv-Datei) Sind nicht von Kopien ihrer selbst unterscheidbar Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung Komposition durch Dritte: Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator; meist nur kompilierter Code verfügbar nach: Polze, Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 50 Komponenten JavaBeans Komponentenmodell von Java Definition: Eine Bean (Bohne) ist eine Sammlung von Java-Klassen und anderen Ressourcen, bei der die Klassen bestimmten Konventionen genügen Beans exportieren Eigenschaften (properties): Bestandteile des lokalen Zustands, auf die über get- und set-Methoden zugegriffen werden kann Ereignisse (events): Ereignisklassen und "EventListener"Klassen entsprechend dem Ereignismodell von Java/AWT Methoden (methods): öffentlich bekannte Methoden des Objekts Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 51 Komponenten JavaBeans Wann ist eine Java-Klasse eine JavaBean? Nicht durch Schnittstellen-Implementierung! Durch Einhaltung bestimmter Namens-Konventionen Konventionen für Eigenschaften (Properties) public setPropertyName (PropertyType p); public PropertyType getPropertyName(); Persistenz: Zustand muss serialisierbar sein für eine Abspeicherung auf Speichermedium Implementiert java.io.Serializable oder java.io.Externalizable Wiederherstellung über Deserialisierung Austausch von Beans über Systemgrenzen hinweg möglich SSE Zimmermann Softwaretechnik Wiederverwendung – 52 Komponenten public class SimpleBean extends Canvas implements Serializable { private Color color = Color.green; public Color getColor(){ return color; } public void setColor(Color newColor){ color = newColor; repaint(); } public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30); } public SimpleBean(){ setSize(60,40); setBackground(Color.red);} } Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 53 Komponenten Komposition von Komponenten Grafische Werkzeuge zum Zusammenstellen „plumbing instead of programming“ Interaktion durch Verbindung von Ereigniserzeugung und -verarbeitung (event source, register event listeners) SSE Zimmermann Softwaretechnik Wiederverwendung – 55 Komponenten Kompositionsprobleme Widerspruch zum Ansatz: Verschiedene inkompatible Technologien für Komponenten existieren OMG’s CORBA, Microsoft’s COM+, Sun’s JavaBeans (EJB). Interoperabilität: Problem mit unterschiedlichen Umgebungen und Plattformen Spezielle Integrations-Werkzeuge, z.B. COM and CORBA Interworking Spec (OMG) Kontextabhängigkeiten Im Gegensatz zu angebotenen Schnittstellen sind die benötigten Komponenten oft unklar Nichtfunktionale Abhängigkeiten werden nicht betrachtet SSE Zimmermann Softwaretechnik Wiederverwendung – 56 Komponenten Komponenten für Client/Server-Architekturen Wichtige Aspekte Transaktionen Sicherheit Ressourcenverwaltung Persistenz Komponentenkonzept für Server-Komponenten meist unsichtbare Komponenten standardisierte Realisierung der wichtigen Eigenschaften für Client/Server-Anwendungen Realisierung: Enterprise Java Beans (EJBs) innerhalb eines Java Enterprise Edition Servers Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 57 Komponenten Architektur von Enterprise JavaBeans Quelle: Rumpe SSE Zimmermann Softwaretechnik Wiederverwendung – 58 Komponenten Arten von Enterprise JavaBeans Entity Bean Repräsentiert persistente Information aus einer Datenbank Typischerweise mit mehreren Transaktionen assoziiert Mehrbenutzerzugriff möglich Session Bean EJB-Instanz, die mit einem einzelnen Client assoziiert ist Typischerweise nicht persistent Beispiele: Benutzersitzung innerhalb einer Webseite, Buchungsvorgang Stateful / Stateless Session Bean Dialogzustände innerhalb der Session oder nicht SSE Zimmermann Softwaretechnik Quelle: Rumpe Wiederverwendung – 60