Software aus Komponenten - IPD Goos
Software aus Komponenten - IPD Goos
Software aus Komponenten - IPD Goos
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 1<br />
<strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong><br />
Prof. Dr. Gerhard <strong>Goos</strong><br />
Fakultät für Informatik<br />
Universität Karlsruhe<br />
Karlsruhe, Germany 2004<br />
c○ Gerhard <strong>Goos</strong>, Dirk Heuzeroth,<br />
Elke Pulvermüller, Volker Kuttruff<br />
2004<br />
http://www.info.uni-karlsruhe.de/
Organisation<br />
• Vorlesung:<br />
◮ 1. Dienstag 14:00 – 15:30, -101, wöchentlich<br />
◮ 2. Mittwoch 14:00 – 15:30, -101, vierzehntägig<br />
• Übungen:<br />
◮ Mittwoch 14:00 – 15:30, -101, vierzehntägig, erstmals 28.04.2004<br />
• Übungsleiter: Dr. Dirk Heuzeroth, Mamdouh Abu-Sakran, Volker Kuttruff<br />
• Adressen:<br />
◮ Allgemeines Verfügungsgebäude, 2. OG<br />
◮ ggoos@ipd.info.uni-karlsruhe.de<br />
◮ heuzer@ipd.info.uni-karlsruhe.de, msakran@ipd.info.uni-karlsruhe.de,<br />
kuttruff@fzi.de<br />
• Sprechstunden:<br />
◮ <strong>Goos</strong>: Dienstags 16:00 – 17:00<br />
◮ Heuzeroth, Abu-Sakran, Kuttruff: Mittwochs 16:00 – 17:00<br />
• Vorlesungsseite:<br />
http://www.info.uni-karlsruhe.de/lehre/2004SS/swk<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 2
Grundlagen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 19
1.2 <strong>Komponenten</strong>begriffe<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 20<br />
Real Component Systems<br />
Real Component Systems<br />
LEGO<br />
Reale <strong>Komponenten</strong>systeme<br />
bricks<br />
• LEGO<br />
LEGO<br />
IC<br />
• Hohlblöcke<br />
bricks<br />
• ICs<br />
IC<br />
• Hardware-Busse Hardware-Bus<br />
Hardware-Bus<br />
• Was unterscheidet Difference to siesoftware von Methoden construction? der <strong>Software</strong>-Konstruktion?<br />
Difference to software construction?<br />
Gerhard <strong>Goos</strong>, <strong>Software</strong> from Components, Overview 9
Reale <strong>Komponenten</strong>systeme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 21<br />
System Schnittstellen Komposition Anpassung<br />
LEGO Noppen Zusammen- -<br />
stecken<br />
Ziegel Form, Profil Mörtel Stücke abbrechen<br />
ICs, Bus Anschluß-Signal- Zusammen- Signale konvertieren,<br />
Spezifikation stecken, Löten filtern, puffern, . . .<br />
<strong>Software</strong> Signaturen Aufruf Daten, Funktionen,<br />
Protokolle Umwickeln Protokolle, ...
<strong>Komponenten</strong>, Komposition und Adaption<br />
• Entwurf nach Geheimnisprinzip (information hiding)<br />
◮ explizite Spezifikation von Schnittstellen<br />
◮ Implementierung bleibt verborgen<br />
• Komposition<br />
◮ Zusammensetzen von <strong>Komponenten</strong> nach lokalen Entwurfsprinzipien,<br />
die globale funktionale und nicht-funktionale Eigenschaften zusichern<br />
◮ Adaption von <strong>Komponenten</strong>, wenn nötig<br />
interne Adaption von <strong>Komponenten</strong> an ihren<br />
Wiederverwendungskontext<br />
externe Adaption: Anpassung der Schnittstellen für die<br />
Zusammenarbeit<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 22
Definition von <strong>Komponenten</strong><br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 23<br />
• A software component<br />
is a unit of composition with contractually specified interfaces and explicit<br />
context dependencies only. It can be deployed independently and is<br />
subject to composition by third parties.<br />
Szyperski (ECOOP Workshop WCOP 1997)<br />
• A reusable software component<br />
is a logically cohesive, loosely coupled module that denotes a single<br />
abstraction.<br />
Booch<br />
• A software component<br />
is a static abstraction with plugs.<br />
Nierstrasz/Dami
Andere Definitionen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 24<br />
• <strong>Software</strong> components<br />
are defined as prefabricated, pretested, self-contained, reusable software<br />
modules - bundles of data and procedures - that perform specific<br />
functions.<br />
MetaGroup (OpenDoc)<br />
• Reusable software components<br />
are self-contained, clearly identifiable pieces that describe and/or perform<br />
specific functions, have clear interfaces, appropriate documentation, and a<br />
defined reuse status.<br />
Sametinger
<strong>Komponenten</strong> - Unsere Definition<br />
• Programmeinheiten mit standardisierter Basiskommunikation<br />
◮ abstrakt (nur Schnittstelle), generisch oder<br />
konkret (mit Implementierung)<br />
Klassen und Module sind <strong>Komponenten</strong>, Objekte nicht!<br />
• Entworfen mit standardisierten Verträgen zur Komposition:<br />
◮ Export-Schnittstelle sichert semantische Eigenschaften zu<br />
◮ Import-Schnittstelle definiert Vor<strong>aus</strong>setzungen dafür<br />
Explizit oder<br />
Implizit (Parameter von Konstruktoren oder Methoden)<br />
◮ Kein implizites Wissen<br />
• <strong>Komponenten</strong> sind wiederverwendbar<br />
• <strong>Komponenten</strong> können <strong>aus</strong> <strong>Komponenten</strong> zusammengesetzt sein<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 25
<strong>Komponenten</strong>begriffe<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 26<br />
• Drei Ebenen<br />
1. Eine Komponente ist eine Kollektion von Programmfragmenten mit<br />
einem Bauplan, um für eine bestimmte Aufgabe eine <strong>aus</strong>führbare<br />
Programmeinheit zu erzeugen.<br />
2. Eine Komponente ist ein Modul. Es gibt jeweils genau eine davon.<br />
3. Eine Komponente ist ein großes, in sich abgeschlossenes Teilsystem,<br />
welches eine bestimmte Aufgabe erledigt.<br />
• Beobachtung<br />
◮ 1. ist andere Formulierung unserer Definition.<br />
◮ 2. und 3. sind technisch äquivalent<br />
◮ Aber: Allein 3. garantiert ökonomische Skalierbarkeit.
Eigenschaften von <strong>Komponenten</strong><br />
• können <strong>aus</strong> Spezifikation generiert werden<br />
(generische <strong>Komponenten</strong>)<br />
• Unterscheidung funktionaler und nicht-funktionaler Aspekte<br />
◮ Funktion und Daten,<br />
◮ Kommunikation und Synchronisation,<br />
◮ Verteilung,<br />
◮ Persistenz, usw.<br />
• können dynamisch geladen und ersetzt werden<br />
◮ Programme können <strong>Komponenten</strong> mit Reflexion betrachten und deren<br />
Dienste feststellen<br />
◮ Ignorieren unbekannter funktionaler Aspekte<br />
Reflexion: Die Fähigkeit eines Programmes, seinen Zustand zur<br />
Laufzeit zu inspizieren und seine Funktionalität zu bestimmen.<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 27
Komposition<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 28<br />
• Ausfalten generischer <strong>Komponenten</strong> (homogen/heterogen)<br />
• Zusammensetzen von <strong>Komponenten</strong> gemäß Verträgen:<br />
◮ über Funktionen und Daten<br />
◮ über Kommunikation, Synchronisation und Protokolle<br />
◮ Problem der globalen Lebendigkeit (Verklemmungsfreiheit)?<br />
◮ Wie gehen nicht-funktionale Eigenschaften ein?<br />
• Mangelnde Passung erfordert Adaption (Anpassung) der <strong>Komponenten</strong>:<br />
◮ Externe Adaption durch ”<br />
Klebecode“ (glue code)<br />
◮ Interne Adaption:<br />
Offenes Einsetzen<br />
Invasiver Aust<strong>aus</strong>ch nicht-funktionaler Aspekte (z.B.<br />
Basiskommunikation t<strong>aus</strong>chen, Synchronisation einfügen usw.)
Exkurs: Generische <strong>Komponenten</strong><br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 29<br />
• Beispiel: Auf einem Graphen mit Adjazenzmatix A = (a ij ),<br />
betrachte folgende Probleme für i ≠ j:<br />
◮ Existiert ein Pfad von i nach j?<br />
◮ Länge des kürzesten Pfades von i nach j?<br />
◮ Maximaler Fluß von i nach j?<br />
(die Kapazitäten sind durch a ij gegeben)<br />
• Der generische Floyd-Warshall-Algorithmus löst alle drei Probleme<br />
◮ ∀k ∈ [1, n] : a kk := c<br />
∀k ∈ [1, n]:<br />
∀i ∈ [1, n]:<br />
∀j ∈ [1, n]:<br />
a ij := a ij σ (a ik τ a kj )<br />
• Übung: Bestimme die Konstante c und die Operationen σ, τ für alle<br />
Probleme. Welche algebraischen Eigenschaften müssen σ, τ aufweisen?<br />
• Übung: Schreibe eine Schablone (template) in C++, die mit<br />
entsprechenden Parametern die Probleme löst.<br />
◮ Bemerkung: Dieses Beispiel ist nicht OO-spezifisch. Können Sie es in Pascal oder C<br />
lösen?
Exkurs: Generische <strong>Komponenten</strong> II<br />
• Verallgemeinerung und Schlußfolgerungen:<br />
◮ Eine generische Komponente besteht <strong>aus</strong> (einer oder mehreren)<br />
‘‘generischen’’ Klassen, die durch Datentypen, Operationen,<br />
Implementierungen , . . . parametrisierbar ist<br />
◮ Die generische Klasse wird <strong>aus</strong>gefaltet, indem sie mit Exemplaren der<br />
Parameter versorgt wird.<br />
◮ Beispiele<br />
Schablonen in C++ (zu allgemein, unsystematisch definiert)<br />
Generische Pakete in Ada<br />
Generische Klassen in Eiffel, Sather, ..., (Pizza, Java 1.5, C# 2.0)<br />
◮ elementare Hauptanwendung: Behälter (Keller, Listen, ...)<br />
◮ Problem: Viele Operationen der generischen Klasse werden auf<br />
Parameter angewendet. Sicherstellen, daß die Operationen existieren?<br />
Lösung: beschränkte Polymorphie (bounded polymorphism)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 30
generisch vs. generativ<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 31<br />
Generatives Programmieren ist ein <strong>Software</strong>entwicklungsparadigma, das für<br />
eine gegebene Anforderungsspezifikation <strong>Software</strong>-Systemfamilien<br />
modelliert und <strong>aus</strong> dem Konfigurationswissen sowie elementaren,<br />
wiederverwendbaren Implementierungskomponenten automatisch bei<br />
Bedarf ein maßgefertigtes und optimiertes Zwischen- oder Endprodukt<br />
erzeugt.<br />
Generische Komponente ist eine parametrisierte Komponente.
Wiederholung: Entwurf mit Verträgen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 32<br />
• Problem: Programmeinheiten (Klassen, Methoden, . . . ) kommunizieren<br />
◮ Schnittstellen müssen syntaktisch und semantisch passen<br />
• Lösung: Einführen von Zusicherungen (i. a. Formeln im Prädikatenkalkül),<br />
die die benötigten Eigenschaften beschreiben<br />
◮ Vorbedingung: muß vom Aufrufer erfüllt werden, damit der Aufruf<br />
funktionieren kann<br />
◮ Nachbedingung: kann der Aufrufer nach der Rückkehr verwenden<br />
(sofern die Vorbedingung erfüllt war)<br />
◮ Klasseninvariante: Zusicherung über den Zustand einer Datenstruktur<br />
vor und nach jeder Manipulation ( ”<br />
Grundzustand der DS“)
Wiederholung: Entwurf mit Verträgen II<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 33<br />
• Solche Zusicherungen heißen Verträge (contracts, Bertrand Meyer, Eiffel)<br />
zwischen Aufrufer und Aufgerufenen<br />
• Grundlegende OO-Entwurfstechnik: Zunächst nur Verträge zwischen<br />
Klassen und ihren Methoden definieren<br />
◮ deckt nur funktionale Eigenschaften ab<br />
• wendet Standardtechniken der Verifikation ( ”<br />
Hoare Logik“) auf<br />
Programmieren im Großen an<br />
◮ amüsant: ”<br />
Entwurf mit Verträgen“ wird von Praktikern geschätzt und<br />
großflächig eingesetzt, aber ‘‘Verifikation’’ gilt als nicht praktikabel;<br />
allein der Namenswechsel macht den Unterschied.
Wiederholung: Entwurf mit Verträgen III<br />
• Beschränkungen: Allgemeinheit vs. Spezialfälle<br />
◮ Ein Programm erfüllt seine Verträge, wenn die Zusicherungen für alle<br />
gültigen Eingaben erfüllt werden<br />
(ebenfalls durch Zusicherungen geregelt)<br />
◮ Aber: Jeder Test einer Zusicherung zur Laufzeit sichert die<br />
Vertragserfüllung nur für diesen speziellen Aufruf<br />
◮ also: Verträge müssen statisch (von Hand) geprüft werden<br />
◮ Tests zur Laufzeit prüfen nur Spezialfälle<br />
inakzeptabel für verläßliche Systeme<br />
akzeptabel, wenn ein Fehlschlag keine Schäden anrichtet<br />
(abgesehen von Verzögerungen)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 34
Einige Kommunikationsarten<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 35<br />
• Normaler Prozeduraufruf<br />
• Rückruf (callback) und Ereignisse<br />
• Fernaufruf (remote procedure call, remote method invocation)<br />
◮ Einpacken der Objekte in Byte-Strom, Verschicken, Auspacken<br />
◮ kann in heterogenen Systemen eingesetzt werden<br />
Z.B. Java RMI, CORBA usw.<br />
• Gemeinsamer Speicher (synchronisiert mit Semaphoren, . . . )<br />
• uni- oder bidirektionale FIFOs (z.B. pipes, sockets)<br />
• Anschlagtafeln (blackboards, strukturierte Anschlagtafeln (Linda<br />
Tupelraum)<br />
• Transaktionsdienste (Datenbank)<br />
• Migration von Code (z.B. Java Applets)
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 36<br />
Beispiel: Rückruf und Ereignisse: Konzepte<br />
Example: Callbacks and Events I<br />
abstract solution<br />
goal: communication client-server whenever a situation<br />
(event, state change) arises at the server requiring action<br />
• Ziel: Kommunikation zwischen Dienstnehmer und Dienstgeber, wenn eine<br />
Situation by the client (Ereignis, Zustandsübergang) im Dienstgeber Aktivität des<br />
Dienstnehmers erfordert<br />
abstract solution: introduce event server between client and<br />
• abstrakte Lösung: Ereignisdienst als Zwischenschicht einführen<br />
server<br />
event<br />
client<br />
server<br />
server<br />
◮ Dienstnehmer abonniert relevante Ereignisse beim Dienstgeber<br />
client notifies event server in advance about all events of interest<br />
relevant“ durch Nebenbedingungen weiter einschränkbar<br />
“interest” ”<br />
◮ Dienstgeber may benachrichtigt constraint by Dienstnehmer mentioning additional über conditions Ereignisse (mit<br />
Nutzdaten)<br />
server notifies event server about all incoming events (state<br />
changes) including additional information<br />
◮ Ereignis kann keinen, einen, oder beliebig viele Dienstnehmer erreichen<br />
event server may notify zero, one or several clients about the event<br />
◮ Synchrone oder asynchrone Benachrichtigung<br />
notification by event server may be synchronous or asynchronous<br />
◮ Ereignisdienst oft im Dienstgeber integriert (Ereignisschleife)<br />
event server often integrated into the server (“event loop”)<br />
Gerhard <strong>Goos</strong>, <strong>Software</strong> from Components, Overview 22
Beispiel: Rückruf und Ereignisse II<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 37<br />
• Aufrufer übergibt Prozedurvariable oder Verweis auf Objekte (anonyme<br />
Klasse in Java, Rückruf-Dienst in Corba, delegate in C#, .Net)<br />
◮ Rückruf durch Rahmensystem, Bibliothek oder Dienstgeber<br />
◮ Zuerst eingesetzt zur Anbindung von Programm und<br />
Benutzerschnittstelle<br />
• Ereignisse zur asynchronen Kommunikation<br />
◮ technisch über Rückruf gelöst<br />
◮ Reihenfolge meist nicht zugesichert<br />
• dynamisch variierbarer Empfänger<br />
• Ereignisquellen sind meist Dienste<br />
• Z.B. in Java Beans, Corba Event Service
Echtzeitbedingungen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 38<br />
Vorlesung betrachtet o.B.d.A. keine Echtzeitsysteme<br />
• Echtzeitbedingungen lassen sich in einem Automaten separat zu den<br />
Zustandsübergängen (funktionaler Automat) des betrachteten Systems<br />
spezifizieren und mit diesem bei Bedarf zusammenfügen (Dissertation<br />
Lötzbeyer).<br />
⇒ Zeitbedingungen lassen sich in die <strong>Komponenten</strong>schnittstelle<br />
aufnehmen.<br />
• Wichtig für die Analyse: Scharfe Unterscheidung zwischen Eingabewerten,<br />
Ausgabewerten und lokalen Variablen in einer Komponente, d. h.<br />
transiente Parameter nicht zugelassen<br />
⇒ Komponente kann zu einer Menge von Zuweisungen<br />
<strong>aus</strong>gabeparameter := f(eingabewert)<br />
abstrahiert werden.
1.3 Vorgehensweisen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 39<br />
1.3.1 Merkmalsanalyse<br />
1.3.2 Produktlinien
1.3.1 Merkmalsanalyse<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 40<br />
• Merkmalsanalyse (Feature Analysis) modelliert Systemfamilien<br />
◮ identifiziere Variationspunkte<br />
◮ zähle Alternativen auf<br />
◮ bilde Hierarchien (momentan starr)<br />
• Arten der Variation<br />
◮ innerhalb eines Systems zur Laufzeit<br />
◮ zwischen einzelnen Läufen eines Systems<br />
◮ zwischen Mitgliedern der Systemfamilie<br />
• Darstellung als Merkmalsdiagramme (feature diagrams)<br />
◮ Untermenge regulärer Ausdrücke (kein Kleene’scher Stern)<br />
◮ graphische Darstellung als Baum<br />
◮ redundante Repräsentation → Normalformen<br />
• Abbildung auf Sprachmechanismen<br />
• Abgrenzung zu Aspekten?
Merkmalsmodellierung<br />
• Zweck:<br />
◮ Beschreibung des Anforderungsraumes eines bestimmten Bereichs<br />
(Domäne).<br />
◮ Eine spezifische Implementierung kann man auffassen als eine ”<br />
Instanz<br />
des Merkmalsmodells“ oder eine Menge von Merkmalen, die einzelne<br />
Fähigkeiten eines Systems oder eine Menge von Systemen beschreiben.<br />
◮ Kommunikationsmedium zwischen Anwendern und Entwicklern.<br />
• Merkmale sind Attribute eines Systems, die direkt den Endanwender<br />
betreffen. Ein Merkmal ist damit ein bedeutender oder unverkennbarer, für<br />
den Anwender sichtbarer Aspekt, eine Qualität oder Charakteristik eines<br />
<strong>Software</strong>-Systems oder einer Menge von <strong>Software</strong>-Systemen.<br />
• Merkmal, Belang und Aspekt sind Synonyme.<br />
• Merkmalsmodell<br />
◮ ist Ergebnis einer Merkmalsanalyse<br />
◮ erfaßt das Verständnis des Endanwenders von den allgemeinen<br />
Fähigkeiten der Anwendungen in einem Bereich<br />
◮ erfaßt die gemeinsamen Merkmale und Unterschiede der Anwendungen<br />
in einem Bereich (Familie von Anwendungen)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 41
Merkmalsmodelle<br />
• Es gibt verschiedene Ansätze und Notationen:<br />
◮ Die wichtigste ist FODA.<br />
◮ Weitere (Erweiterungen oder Variationen): Czarnecki/Eisenecker, Stan<br />
Jarzabek, Jan Bosch, Jacobson/Griss, Coleman, Matthias Cl<strong>aus</strong>s, etc.<br />
• Elemente eines Merkmalsmodells sind nach Kang, Cohen, Hess, Novak,<br />
Peterson:<br />
◮ Merkmalsdiagramm<br />
◮ Kompositionsregeln<br />
◮ Belange und Entscheidungen<br />
◮ Systemmerkmalskatalog<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 42
Elemente von Merkmalsdiagrammen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 43
Definition von Merkmalen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 44<br />
Name: [ FROM < Quellname > ]<br />
Description (Beschreibung): < Textuelle Beschreibung des Merkmals ><br />
Consists Of (Besteht <strong>aus</strong>) [ { optional | alternative } ]<br />
Source (Quelle): < Informationsquelle ><br />
Type (Bindezeit): { compile-time | load-time | runtime }<br />
Cross-tree Constraints (Composition rules):<br />
[ Mutually Exclusive With: < Merkmalsnamen > ]<br />
[ Mandatory With: < Merkmalsnamen >]<br />
• Belange und Entscheidungen: Entscheidung - Beschreibung - Begründung<br />
• Systemmerkmalskatalog: Tabelliere Merkmale und Merkmalswerte<br />
existierender Systeme
Merkmalsdiagramm mit Korrelation<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 45<br />
Quelle: Lars Geyer, Universität Kaiserslautern
1.3.2 Programmfamilien und Produktlinien<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 46<br />
We consider a set of programs to constitute a family whenever it is<br />
worthwhile to study programs from the set by first studying the common<br />
properties of the set and then determining the special properties of the<br />
individual family members. (Parnas, 1976)<br />
A software product line is a set of software-intensive systems sharing a<br />
common, managed set of features that satisfy the specific needs of a<br />
particular market segment or mission and that are developed from a common<br />
set of core assets in a prescribed way (Clements, 2002)
Produktlinien als Beispiel erfolgreicher Wiederverwendung<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 47<br />
Produktlinien:<br />
• Fest definierte Anwendungsdomäne<br />
⇒ ermöglicht umfassende Domänenanalyse:<br />
◮ Merkmalsanalyse liefert Gemeinsamkeiten und Variabilitäten der<br />
Mitglieder der Produktlinie.<br />
⇒ ◮ Menge geeigneter <strong>Komponenten</strong><br />
◮ generische Architektur: Beschreibung der Zusammensetzung aller<br />
Mitglieder der Produktlinie durch Variabilitäten,<br />
d. h. Menge der <strong>Komponenten</strong>, die ein konkretes Mitglied bilden,<br />
wird nach fest vorgegebenem Verfahren anhand konkreter Werte<br />
gebildet.<br />
Eine Architektur gibt also die Menge der <strong>Komponenten</strong> und deren<br />
Zusammensetzung zu einem konkreten System an.<br />
⇒ Vermeidung von Paßfehlern<br />
• erfordert präzise Planung, um Variabilitäten zu erfassen.<br />
• erfordert Konfiguration, um Variabilitäten passend zu belegen.
Produktfamilien<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 48<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Der Entwicklungsprozeß<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 49<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Prozeßschritte<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 50<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Konstruktion eines Mitglieds einer Produktlinie<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 51<br />
Quelle: Lars Geyer, Universität Kaiserslautern
Einschränkungen<br />
• funktioniert nicht oder nur teilweise mit COTS:<br />
◮ COTS passen i. a. nicht in generische Architektur, weil COTS nicht<br />
<strong>aus</strong> der Domänenanalyse hervorgehen. (vgl. Folie 9)<br />
• Merkmale beschreiben hauptsächlich funktionales Verhalten<br />
⇒ Interaktionsverhalten ist schlecht oder überhaupt nicht durch Merkmale<br />
faßbar und damit nicht konfigurierbar<br />
⇒ Architektur sollte konfigurierbar sein<br />
• Evolution bzgl. neuer Anforderungen ist sehr aufwendig:<br />
◮ Anpassung der Produktlinienarchitektur statt einzelner Produkte<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 52
Konsequenzen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 53<br />
• Wiederverwendung funktioniert im Falle von Produktlinien<br />
• Die Einschränkung bzgl. COTS ist praktisch irrelevant,<br />
denn nach (Lampson, 2003) funktionieren COTS ohnehin nicht<br />
(vgl. Folie 18).<br />
• Interaktionsanpassungen erfordern Architekturevolution:<br />
Änderung der Interaktion zwischen <strong>Komponenten</strong> bedeutet im allgemeinen<br />
eine Änderung der Zusammensetzung des Systems oder beeinflußt diese.<br />
⇒ Änderung von Interaktionsbeziehung impliziert Änderung der<br />
Architektur.<br />
• Neue Anforderungen erfordern komplette Überarbeitung der Produktlinie
1.4 Umgebungssysteme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 54<br />
1.4.1 UML<br />
1.4.2 Versionsverwaltung: CVS<br />
1.4.3 Erweiterbare integrierte Entwicklungsumgebungen:<br />
Eclipse
1.4.1 Modellieren mit UML <strong>Komponenten</strong>-Diagrammen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 55<br />
Billing.exe<br />
Billing<br />
System<br />
Register.exe<br />
Course.dll<br />
Course<br />
People.dll<br />
User<br />
Student<br />
Professor<br />
Course<br />
Course<br />
Offering<br />
Copyright © 1997 by Rational <strong>Software</strong><br />
Corporation
Probleme mit UML<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 56<br />
• Semantik sehr flexibel<br />
• Nichts ist definiert, also keine Anpassung nötig<br />
• Problem der Implementierung<br />
• Probleme je nach Implementierungssprache oder -system<br />
Aber:<br />
• Ein Großteil aller DV-Probleme (80%?) folgen in ihrer Programmstruktur<br />
dem Aufbau von Datenstrukturen, die sich mit UML gut modellieren<br />
lassen.<br />
• löst UML 2.0 (Ende 2004?) die Probleme besser?
1.4.2 Versionsverwaltung: CVS<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 57<br />
CVS: Concurrent Versions System<br />
Motivation und Begriffe:<br />
• Programme werden weiterentwickelt, d. h. die Entwickler modifizieren evtl.<br />
simultan die zugehörigen Dateien.<br />
• Modifikation einer Datei ergibt eine neue Revision.<br />
Revisionen sind numeriert.<br />
• Eine Kollektion von Dateien mit bestimmten Revisionsnummern faßt man<br />
zu einer Version des Systems/Produkts zusammen.<br />
Beispiel: Version 2.3 bestehe <strong>aus</strong> der Revision 1.42 von Datei A und der<br />
Revision 2.15 von Datei B
Versionsverwaltung: Aufgaben<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 58<br />
• Aufgabe: Rückgriff auf frühere Revisionen, z.B. Meldung eines Fehlers,<br />
der sich auf diese bezieht.<br />
Naive Lösung: Manuelle Verwaltung der Revisionen z.B. durch Kopieren<br />
der Dateien und Namenskonventionen<br />
Problem: fehleranfällig und speicherintensiv<br />
• Aufgabe: Koordinieren simultaner Änderungen<br />
Naive Lösung: Sperren der Datei, Bearbeiten der Datei, Entsperren der<br />
Datei (lock-modify-unlock model)<br />
Probleme:<br />
◮ Verwaltung der Sperren aufwendig und unübersichtlich.<br />
◮ Stehlen von Sperren kann notwendig werden.<br />
⇒ Funktioniert nur, wenn Entwickler nahe beieinander sitzen<br />
⇒ Automatisierung durch Versionsverwaltungssystem notwendig
Versionsverwaltung: Hintergründe<br />
• Warum interessiert uns das?<br />
◮ Entwicklung großer Systeme (<strong>aus</strong> <strong>Komponenten</strong>) bedeutet Arbeit im<br />
Team<br />
◮ Komponente ist Menge von Programmfragmenten, die wir verwalten<br />
müssen.<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 59
Versionsverwaltung: CVS konkret (1)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 60<br />
CVS-Ansatz: copy-modify-merge model (CVS: http://www.cvshome.org)<br />
• Revisionen werden in zentraler Ablage (engl. repository ) verwaltet:<br />
◮ Ablage ist durch Baum im Dateisystem realisiert.<br />
◮ Erstellen einer zentralen Ablage im Verzeichnis /public/cvs:<br />
cvs -d /public/cvs init<br />
◮ Importieren vorhandener Quellen <strong>aus</strong> dem Verzeichnis<br />
/home/arthur/myproj:<br />
cd /home/arthur/myproj<br />
cvs -d /public/cvs import -m "initial import into CVS" myproj<br />
arthur-soft start<br />
Die Syntax des import-Befehls ist allgemein:<br />
cvs -d repository-root-dir import -m "log msg" projname<br />
vendortag releasetag
Versionsverwaltung: CVS konkret (2)<br />
• Anfordern einer Arbeitskopie des Projekts<br />
(engl. checking out working copy ):<br />
◮ Kein Entwickler darf direkt in der zentralen Ablage arbeiten, sondern<br />
nur auf einer Kopie der Dateien.<br />
◮ Die Arbeitskopie enthält alle Projektdateien der angefragten (meist<br />
aktuellen) Version.<br />
Die aktuelle Version wird von CVS automatisch HEAD genannt und<br />
enthält die aktuellen Revisionen.<br />
◮ cvs -d /public/cvs checkout myproj<br />
• Bearbeiten der Dateien der Arbeitskopie (modify phase):<br />
◮ Jeder Entwickler bearbeitet die Dateien seiner Arbeitskopie separat mit<br />
seinem Lieblingseditor.<br />
◮ Entwickler dürfen auch neue Dateien erstellen.<br />
Neue Dateien müssen die Entwickler dem Verwaltungssystem<br />
bekanntmachen:<br />
cd /home/arthur/myproj<br />
cvs add newfile.ext<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 61
Versionsverwaltung: CVS konkret (3)<br />
• Änderungen in die Ablage eintragen (commit phase):<br />
◮ cvs commit<br />
◮ Kann fehlschlagen, weil andere Entwickler Änderungen an den selben<br />
Dateien vorgenommen und bereits in die Ablage eingetragen haben.<br />
Daher:<br />
◮ Konsolidierungsphase (merge phase):<br />
Mischen der Änderungen <strong>aus</strong> der Ablage mit den eigenen:<br />
cvs update<br />
Bemerkung: Auch um Arbeitskopien zu aktualisieren verwaltet CVS alle<br />
Änderungen einer Datei seit ihrer Entstehung als Differenzen/Deltas. Auf<br />
Dateiebene verwendet CVS zu diesem Zweck das RCS (revision control system).<br />
Manuelles Anpassen der Dateien, die CVS während des Aktualisierens<br />
(update) entsprechend kennzeichnet.<br />
Die in Konflikt stehenden Textpassagen kennzeichnet CVS ebenfalls<br />
deutlich.<br />
Prüfen, ob sich das System in der eigenen Arbeitskopie fehlerfrei<br />
übersetzen und <strong>aus</strong>führen läßt.<br />
Erneuter Versuch, die Änderungen in die Ablage einzubringen:<br />
cvs commit<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 62
CVS: Weitere Funktionen (1)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 63<br />
• Hilfe erhalten:<br />
◮ allgemein zu cvs: cvs --help<br />
◮ zu speziellem CVS-Befehl, z. B.: cvs add -H<br />
• Dateien löschen:<br />
cvs delete filename<br />
cvs commit filename<br />
• Status der Arbeitskopie erfragen:<br />
cvs status<br />
Dies liefert auch die Revisionsnummern der einzelnen Dateien.<br />
• Änderungen anschauen:<br />
◮ Änderungen zwischen Arbeitskopie und zentraler Ablage:<br />
cvs diff -c filename<br />
◮ Änderungen zwischen zwei Revisionen:<br />
cvs diff -r1.1 -r1.5 filename<br />
• Änderungshistorie anschauen:<br />
cvs history<br />
• Protokollnachrichten anschauen:<br />
◮ alle Dateien der Arbeitskopie:<br />
cvs log<br />
◮ bestimmte Datei:<br />
cvs log filename
CVS: Weitere Funktionen (2)<br />
• Zugriff auf entfernte Ablagen (accessing remote repositories):<br />
◮ Zugriff per rsh/ssh:<br />
cvs -d :ext:arthur@cvs.server.org:/public/cvs checkout<br />
◮ Zugriff über den CVS-Server-Prozeß:<br />
cvs -d :pserver:arthur@cvs.server.org:/public/cvs login<br />
cvs -d :pserver:arthur@cvs.server.org:/public/cvs checkout<br />
• Beobachten: Sich benachrichtigen lassen, wenn andere Entwickler<br />
bestimmte Dateien in der Ablage bearbeiten/ändern.<br />
◮ In CVSROOT/loginfo eintragen, daß man eine EMail erhalten möchte,<br />
wenn jemand ein cvs commit <strong>aus</strong>führt.<br />
◮ Watches: Eintrag in CVSROOT/notify und ggf. Einträge in CVSROOT/users<br />
vornehmen.<br />
• Versionen kennzeichnen: Alle Revisionen des Arbeitsverzeichnisses in der<br />
Ablage mit einer symbolischen Marke (Versionskennzeichnung) versehen.<br />
cd /home/arthur/myproj<br />
cvs -d /public/cvs tag marke<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 64
CVS: Weitere Funktionen (3)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 65<br />
• Verzweigungen (Branches): Beispielsweise sinnvoll, wenn man einen Fehler<br />
in einer alten Version korrigiert.<br />
◮ Aufspalten der Historie bei der alten Version:<br />
1 Arbeitskopie der alten Version beschaffen:<br />
cvs checkout -d myproj_old_release -r Release-2003_12_06 myproj<br />
2 Verzweigung markieren:<br />
cvs tag -b Release-2003_12_06_bugfix_branch<br />
Schritt 1 und 2 kann man abkürzen durch:<br />
cvs rtag -b -r Release-2003_12_06 Release-2003_12_06_bugfix_branch myp<br />
3 Arbeitsverzeichnis für die Verzweigung einrichten:<br />
cvs checkout -d myproj_branch -r Release-2003_12_06-bugfix_branch<br />
◮ Änderungen an den Dateien in diesem Verzeichnis durchführen.<br />
◮ Änderungen in die zentrale Ablage übernehmen: cvs commit<br />
◮ Diesen Punkt markieren, damit man bei weiteren Fehlerkorrekuren auf<br />
der Verzweigung von hier ab in den Stamm integriert und nicht vom<br />
Beginn des Zweiges auch die schon integrierten Fehlerkorrekturen:<br />
cvs tag Release-2003_12_06-bugfix_branch-fix1
CVS: Weitere Funktionen (4)<br />
(Verzweigungen: Fortsetzung)<br />
◮ Zweig mit Stamm zusammenführen (merging branch to trunk)):<br />
1 Aktuellen Stand des Stamms <strong>aus</strong> der Ablage in die Arbeitskopie<br />
übertragen (dabei Sondermarken mit -A löschen):<br />
cvs update -d -A<br />
2 Verzweigung in den Stamm integrieren:<br />
cvs update -d -j Release-2003_12_06_bugfix_branch<br />
3 Integriertes Arbeitsverzeichnis (nach Prüfung) in die zentrale Ablage<br />
eintragen: cvs commit<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 66
• CVS konfigurieren:<br />
◮ Umgebungsvariablen:<br />
CVS: Weitere Funktionen (5)<br />
CVSROOT ist das Wurzelverzeichnis der zentralen Ablage.<br />
Setzt man CVSROOT = /public/cvs, dann kann man in allen o.g.<br />
Beispielen auf die Angabe von -d /public/cvs beim Aufruf von cvs<br />
verzichten.<br />
CVSEDITOR: Editor zum Eintragen von Protokollierungsnachrichten<br />
(engl. log messages).<br />
Beispiel: CVSEDITOR=’emacs -nw’<br />
CVSUMASK: Zugriffsberechtigungen für die Dateien in der zentralen<br />
Ablage festlegen.<br />
Beispiel: CVSUMASK = 003<br />
CVS RSH gibt an, wie sich CVS mit einem entfernten Rechner<br />
verbinden soll, auf dem eine Ablage liegt.<br />
Beispiel: CVS RSH = ssh<br />
◮ Konfigurationsdateien:<br />
.cvsignore legt von CVS zu ignorierende Dateien fest.<br />
Beispiel: Eintragen von *.class in .cvsignore<br />
Globale Einstellungen in .cvsrc.<br />
Beispiel: update -d legt fest, daß update immer mit der Option -d<br />
<strong>aus</strong>geführt wird und damit auch neue Verzeichnisse aktualisiert<br />
werden.<br />
• Graphische Oberflächen: WinCVS, WebCVS<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 67
1.4.3 Erweiterbare integrierte Entwicklungsumgebungen<br />
• Interessant <strong>aus</strong> zwei Gründen:<br />
1 Verwaltung großer Projekte:<br />
◮ mehrsprachig<br />
◮ inkrementelle Übersetzung wichtig<br />
◮ Projekt- und Konfigurationsverwaltung<br />
◮ Testverwaltung<br />
◮ . . .<br />
⇒ Einheitliche Verwaltung einer Vielzahl von Werkzeugen<br />
2 <strong>Komponenten</strong>architektur der Entwicklungsumgebung: Einsetzen von<br />
<strong>Komponenten</strong>, um die Funktionalität der Entwicklungsumgebung zu<br />
erweitern<br />
• Speziell: Eclipse<br />
◮ Basisplattform stellt Infrastruktur für die Interaktion von<br />
Erweiterungskomponenten, sogenannten Plug-ins.<br />
◮ Plug-ins für verschiedene Übersetzer, Editoren, Konfigurations- und<br />
Build-Werkzeuge, etc.<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 68
Erweiterungsmechanismus in Eclipse<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 69<br />
• Erweiterungspunkte (extention points) definieren Stellen, zum Einhängen<br />
von Erweiterungen.<br />
• Eine Erweiterung (extention) definiert, welchen Erweiterungspunkt sie wie<br />
erweitert. Erweiterungen werden von Erweiterungskomponenten definiert<br />
und implementiert.<br />
• Erweiterungspunkte und Erweiterungen sind in XML-Dateien (den<br />
sogenannten Manifest-Dateien) beschrieben, die zu den jeweiligen<br />
<strong>Komponenten</strong> gehören.<br />
Grund: Man kann die Abhängigkeiten der <strong>Komponenten</strong> prüfen, ohne<br />
deren Code laden zu müssen.<br />
Der Code wird bei der ersten Benutzung (Aktivierung) der<br />
Komponente geladen.<br />
• Technik:<br />
◮ Ein Erweiterungspunkt definiert eine Schnittstelle.<br />
◮ Eine Erweiterung liefert eine Implementierung für diese Schnittstelle.<br />
◮ Die zu einem Erweiterungspunkt verfügbaren Erweiterungen verwaltet<br />
eine Registratur (Registry ). Die Registratur wird beim Start der<br />
Entwicklungsumgebung im Speicher angelegt.
Eclipse Metapher<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 70<br />
• Sicht: Eine Repräsentation des Datenmodells/Programms oder die damit<br />
in Zusammenhang stehenden Daten. Eine Sicht hat ein eigenes Fenster<br />
im Arbeitsbereich.<br />
• Perspektive: Eine Menge von in einer bestimmten Weise auf dem<br />
Bildschirm in Fenstern angeordneten Sichten (auf das Datenmodell /<br />
Programm oder die damit in Zusammenhang stehenden Daten, wie z.B.<br />
Programm<strong>aus</strong>gaben).<br />
• Beispiel: Eclipse bietet eine CVS-Perspektive, die u. a. den<br />
Verzeichnisbaum der Arbeitskopie und die Revisionsnummern der<br />
einzelnen Dateien in einem Fenster darstellt.
Eclipse: Java Perspektive<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 71
1.5 Klassische Ansätze<br />
◮ UNIX<br />
◮ Module<br />
◮ Klassen und Vererbung<br />
◮ Rahmensysteme (framework)<br />
• betrachtet als <strong>Komponenten</strong>systeme<br />
mit Diskussion der Probleme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 72
UNIX<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 73<br />
• Basiskommunikation: Byte-Ströme von Quelle zu Senke<br />
◮ Einfach und flexibel<br />
◮ In einem Rechner: Pipes<br />
◮ In Rechnernetzen: Sockets<br />
• <strong>Komponenten</strong> sind eigenständige Programme<br />
◮ Schnittstellen: Standardeingabe, Standard<strong>aus</strong>gabe<br />
◮ Generierung: durch make usw.<br />
• Komposition mit Pipes in Shells und Skriptsprachen<br />
• Adaption:<br />
◮ externe Adaption durch eigenständige <strong>Komponenten</strong>, meist<br />
programmierbare Filter (awk, cut, grep, sed, usw.)<br />
◮ interne Adaption nicht unterstützt
Probleme<br />
• <strong>Komponenten</strong> haben jeweils nur einen Ein- und Ausgang<br />
• Einschränkung auf Ketten von Filtern (Pipelines)<br />
◮ Allgemeinerer Einsatz von Pipes und Sockets möglich.<br />
◮ Programme in C/C++ können so außerhalb des Modells agieren.<br />
◮ Komposition mit Werkzeugen wie Shells, Skripte dort unmöglich.<br />
• Einschränkung auf asynchrone Protokolle ohne Rückkanal<br />
• Adaption schwierig<br />
◮ Formale Modellierung der Daten fehlt<br />
◮ Standardwerkzeuge beherrschen maximal reguläre Muster<br />
• Allgemeine Probleme mit Skripten:<br />
◮ Schlecht skalierbar<br />
◮ Schlecht wartbar<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 74
Module (à la Parnas)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 75<br />
Every module hides an important design decision behind a well-defined<br />
interface which does not change when the decision changes.<br />
David Parnas<br />
• Eigenschaften<br />
◮ Feste Schnittstellen<br />
◮ Kapselung, Geheimnisprinzip (information hiding)<br />
◮ Statische Bindung: Keine dynamische Erzeugung<br />
• Durchdringt viele moderne Sprachen (Modula, Ada, Java, C/C++ usw.)<br />
• Betrachtung als <strong>Komponenten</strong>system:<br />
◮ Basiskommunikation: Prozeduraufruf<br />
◮ Schnittstellen: Prozeduren mit Parametern, globale Variable<br />
◮ Generierung: sprachspezifisch für generische Module<br />
◮ Adaption explizit und manuell
Probleme<br />
• Sprachabhängigkeit der<br />
◮ Basiskommunikation<br />
◮ Spezifikation von Daten und Prozeduren<br />
◮ Synchronisation<br />
• Protokolle nicht spezifiziert<br />
• Fehlende Werkzeuge für<br />
◮ Komposition<br />
◮ Adaption<br />
◮ Verteilung<br />
• Heterogene, verteilte Lösungen erfordern viel Handarbeit!<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 76
Objektorientierte Klassensysteme<br />
• Klassen sind Module<br />
◮ können mehrere zur Laufzeit erzeugte Objekte haben<br />
◮ Objekte haben Zustände (evtl. persistent)<br />
• Vererbung und Untertypbeziehungen<br />
◮ Polymorphie<br />
◮ Späte Bindung von Aufrufen ( ”<br />
faule Auswertung“)<br />
• Betrachtung als <strong>Komponenten</strong>system:<br />
◮ Basiskommunikation: (Polymorphe) Methodenaufrufe, Variable<br />
◮ Schnittstellen: Polymorphe Methoden, Objekt- und Klassenvariable<br />
◮ Generierung: sprachspezifisch, oft mit generischen Klassen<br />
◮ Adaption: durch Vererbung oder Delegation<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 77
Generische oder Abstrakte Klassen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 78<br />
generic/abstract class<br />
instance<br />
system<br />
implementation
Probleme<br />
• Sprachabhängigkeit der<br />
◮ Basiskommunikation<br />
◮ Spezifikation von Daten und Prozeduren<br />
◮ Synchronisation<br />
• Protokolle nicht spezifiziert<br />
• Adaption durch Spracheigenschaften eingeschränkt<br />
(Kontravarianz oder Kovarianz bei Vererbung)<br />
• Fehlende Werkzeuge zur Verteilung<br />
• Heterogene, verteilte Lösungen erfordern viel Handarbeit!<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 79
Rahmensysteme (Frameworks)<br />
• Rahmensysteme sind Klassensysteme mit ”<br />
Rahmen“<br />
◮ Der Rahmen bestimmt, welche zusätzlichen Klassen mit welchen<br />
Eigenschaften hinzugefügt werden müssen, um ein lauffähiges System<br />
zu erhalten.<br />
◮ Der Rahmen spezifiziert also auch einen Bauplan für das Gesamtsystem<br />
• Das Rahmensystem bestimmt Ablauf und Kommunikation einer<br />
Anwendung<br />
• Parametrisierung durch Klassen<br />
• Rahmensysteme als <strong>Komponenten</strong>systeme:<br />
◮ Basiskommunikation: Methodenaufrufe<br />
◮ Schnittstellen: Brennpunkte (hot spot) — Mengen von polymorphen<br />
Methoden<br />
◮ Generierung: Instantiierung der Parameterklassen oder Implementierung<br />
der abstrakten Klassen gemäß den Einschränkungen des Rahmens<br />
◮ Adaption: durch Vererbung oder Delegation<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 80
Rahmensysteme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 81<br />
parameter classes<br />
instances<br />
system<br />
implementation<br />
implementation
Probleme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 82<br />
• Oft sprachabhängig<br />
• Keine Wiederverwendung in fremdem Kontext<br />
(Grund: zu starke Standardisierung)<br />
• Rahmen legt Möglichkeiten im vor<strong>aus</strong> fest:<br />
◮ Adaption<br />
◮ Verteilung<br />
◮ Art der Kommunikation<br />
◮ Heterogene Lösungen
1.6 Industrielle <strong>Komponenten</strong>systeme<br />
• <strong>Komponenten</strong>system (Plattform, Rahmensystem)<br />
◮ definiert Standards für <strong>Komponenten</strong>: Schnittstellen, Protokolle,<br />
Aufgaben kommerzieller Systeme<br />
Kommunikations- und Implementierungsbasis<br />
◮ stellt Grundvor<strong>aus</strong>setzungen (Corba, (D)COM, für Einsatz der EJB) <strong>Komponenten</strong> sicher<br />
◮ reguliert Interaktionen zwischen den <strong>Komponenten</strong><br />
• Busse Daten- garantieren und Hardware-Interoperabilität<br />
Interface-Beschreibung<br />
• <strong>Komponenten</strong>systeme<br />
Referenz- und Wertesemantik<br />
liefern Äquivalent für <strong>Software</strong>:<br />
◮ Objekte, die in einen <strong>Software</strong>bus gesteckt werden können<br />
Kommunikation (Nachrichten und RMI)<br />
◮ Mit dem Bus und einer Menge von standardisierten Schnittstellen<br />
bilden Verteilung, sie ein <strong>Komponenten</strong>system Persistenz, Heterogenität (Plattform)<br />
<strong>Software</strong>bus<br />
Dr. Welf Löwe und Markus Noga 2<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 83
CORBA, (D)COM, .Net, EJB, WebServices<br />
• Basiskommunikation:<br />
◮ Normale Prozeduraufrufe an Kommunikationssystem<br />
◮ Weiterleitung über normale Aufrufe und Fernaufrufe<br />
• Standardisierte Schnittstellen<br />
◮ set/get Properties,<br />
◮ QueryInterface (Corba), IUnknown (COM), EJBHome (EJB)<br />
◮ Namensdienste usw.<br />
• Generierung: <strong>aus</strong> Klassen und Definitionssprachen<br />
• Nur externe Adaption:<br />
◮ Für verteilte Systeme (Weiterleiten von Aufrufen über Fernaufrufe,<br />
marshaling)<br />
◮ Für gemischtsprachliche Systeme (IDL)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 84
CORBA<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 85<br />
CORBA<br />
• Offener Standard, siehe http://www.corba.org<br />
• Unabhängig von Sprache und Verteilung<br />
open standard, see http://www.corba.org<br />
• Schnittstellendefinitionssprache (interface definition language) IDL<br />
independent from programming language and distribution<br />
• <strong>Komponenten</strong> als Quellcode oder binär<br />
interface definition language IDL<br />
source code or binary components<br />
client<br />
Java<br />
IDL stub<br />
client<br />
C<br />
IDL stub<br />
server<br />
C++<br />
IDL skeleton<br />
object adapter<br />
Object Request Broker (ORB), Trader, Services
(D)COM<br />
(D)COM<br />
• Microsoft proprietär, siehe http://www.activex.org<br />
Microsoft proprietary, see http://www.activex.org<br />
• ähnelt CORBA, aber einige Einschränkungen<br />
similar to CORBA<br />
• rein binärer Standard<br />
only binary standard<br />
client<br />
VBasic<br />
COM stub<br />
client<br />
C++<br />
COM stub<br />
server<br />
C++<br />
COM skeleton<br />
monikers, registry<br />
Gerhard <strong>Goos</strong>, <strong>Software</strong> from Components, Overview 42<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 86
(Enterprise) JavaBeans<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 87<br />
JavaBeans<br />
• Offener Standard, siehe http://www.javasoft.com<br />
• sprachabhängig: nur Java<br />
open standard, see http://www.javasoft.com<br />
• unabhängig von Verteilung (durch RMI)<br />
•<br />
language<br />
Quellcode<br />
dependent:<br />
oder Bytecode<br />
Java only<br />
independent from distribution (by RMI)<br />
components in source or byte code<br />
Java<br />
Bean<br />
Java<br />
Bean<br />
Java<br />
Bean<br />
Bean Container<br />
Event InfoBus, RMI
.Net<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 88<br />
• Alle <strong>Komponenten</strong> abgebildet auf Zwischensprache CLR (common<br />
language runtime)<br />
• kommt dem Bild des <strong>Software</strong>bus am nächsten<br />
• sprachunabhängig (aber Verweis-Arithmetik verboten)<br />
• viele Elemente durch ECMA-Norm festgelegt<br />
Aber<br />
◮ auf Verwendung von Windows zugeschnitten<br />
◮ unter Kontrolle von Microsoft<br />
⇒ Weiterentwicklung von den Geschäftsinteressen von Microsoft, nicht<br />
von denen der Kunden, abhängig
Einsatz von XML (WebServices)<br />
• Allgemeine Idee:<br />
◮ Ersetze UNIX’ Byteströme durch strukturierte Daten (Bäume)<br />
◮ Lasse mehrere benannte Ein- und Ausgaben zu<br />
◮ Erlaube syntaktische und semantische Datentransformationen<br />
• <strong>Komponenten</strong> sind eigenständige Programme oder Teile davon<br />
• XML als Aust<strong>aus</strong>chformat<br />
• XSLT für Datenanpassungen<br />
◮ Pfadsprache zur Musterbeschreibung, regelbasierte Ersetzung<br />
◮ andere Graphersetzungssysteme denkbar, nicht Standard<br />
• SOAP (Simple Object Access Protocol) als Basiskommunikation<br />
◮ Transport meist über HTTP<br />
• UNIX als <strong>Komponenten</strong>system kann subsumiert werden<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 89
1.7 Grundsätzliche Ansätze (akademisch)<br />
• Überlegungen:<br />
◮ Funktionaliltät gegeben, dann Weg zum Zusammenschließen finden<br />
⇒ Systemmodellierung notwendig: Nachweis, daß wir das<br />
Anwendungsproblem lösen!<br />
Paßfehler beim Zusammenschalten überbrücken<br />
⇒ Probleme müssen auf mehreren Ebenen gelöst werden:<br />
1 Problemebene (Anforderungen)/Modellierung: Simulation des<br />
Systems<br />
2 Architektur: Zerlegung in <strong>Komponenten</strong> und deren Interaktionen,<br />
Überbrücken von Paßfehlern<br />
3 Implementierung: Abbildung auf konkrete Sprache(n)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 90
Paßfehler<br />
• Paßfehler: <strong>Software</strong>-<strong>Komponenten</strong> machen inkompatible Annahmen über<br />
die Interaktion mit ihrer Umgebung<br />
• Syntaktische Paßfehler: Vom Übersetzer erkennbar, z. B. unterschiedliche<br />
Signaturen von Dienstdeklaration und Dienstaufruf.<br />
• Daten-/Strukturpaßfehler [Jackson1975]: Format und/oder Kodierung der<br />
zu kommunizierenden Daten auf Sender- und Empfängerseite sind<br />
unterschiedlich.<br />
• Architekturpaßfehler:<br />
◮ Mechanismuspaßfehler: Der für den Datentransfer vom Empfänger<br />
erwartete Mechanismus entspricht nicht dem vom Sender verwendeten<br />
Mechanismus.<br />
◮ Antriebspaßfehler [vgl. Garlan et. al. 1995]: Inkompatible Annahmen<br />
darüber, wer eine Interaktion initiiert.<br />
◮ Aktivitätspaßfehler [vgl. Garlan et. al. 1995]: Inkompatible Annahmen<br />
darüber, welche Interaktionspartner aktiv (Träger von Aktivität) und<br />
welche passiv sind.<br />
◮ Protokollpaßfehler [vgl. Garlan et. al. 1995]: Die Reihenfolge von<br />
Dienstanforderungen widerspricht dem in der Komponente<br />
vorgesehenen Ablauf.<br />
• Semantische Paßfehler: Falsche Annahmen über die erbrachte<br />
Funktionalität.<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 91
Beispiel: Antriebspaßfehler<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 92<br />
public class Producer {<br />
private Consumer consumer = null;<br />
private int pNum = 0;<br />
}<br />
public Producer(Consumer c) {<br />
consumer = c;<br />
}<br />
public void produce() {<br />
Product p = new Product(pNum);<br />
System.out.println(p + " produced.");<br />
consumer.consume(p);<br />
}<br />
public class Consumer {<br />
private Producer producer;<br />
}<br />
public Consumer(Producer p) {<br />
prodcuer = p;<br />
}<br />
public void consume() {<br />
Product p = producer.produce();<br />
System.out.println(p + " consumed.");<br />
}
Architektur<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 93<br />
Bewerkstelligung von Interaktionsanpassungen:<br />
• Man muß Abstraktionen finden für:<br />
◮ Schnittstellenkonsistenz<br />
◮ Protokollkonsistenz<br />
◮ Architekturkompatibilität<br />
• Die gesuchte Abstraktion heißt ein Konnektor (Garlan et al, 1993): Ein<br />
Konnektor kapselt die Interaktion zwischen <strong>Komponenten</strong>. Er verbindet<br />
die Interaktionspunkte, genannt Tore, von <strong>Komponenten</strong>.<br />
• Tor: Stelle in einer Komponente, an der die Komponente eine Eingabe<br />
von außen erwartet oder eine Ausgabe nach außen tätigen möchte.<br />
(Formalisierung später.)
Architektur: Probleme<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 94<br />
Problem: Explizite Konnektoren zur Laufzeit<br />
verringern meist die Systemleistung.<br />
Lösung: Eliminiere explizite Konnektoren, wenn möglich.<br />
Beispiel: Interaktion zwischen Symbolentschlüßler und Zerteiler in einem<br />
Übersetzer.<br />
Ausgangssituation: Symbolentschlüßler produziert Symbolstrom.<br />
Symbolstrom ist eine Datenstruktur, auf die der Zerteiler zugreift.<br />
Der Symbolstrom ist damit ein expliziter Konnektor.<br />
Konnektorelimination: Zerteiler ruft direkt den Symbolentschlüßler auf,<br />
um sich jeweils das nächste Symbol liefern zu lassen. Die Daten werden<br />
somit nach Bedarf des Zerteilers vom Symbolentschlüßler erzeugt.<br />
Ansätze:<br />
• Alle Konnektoren zu einem <strong>Software</strong>-Bus zusammenfassen<br />
• Aspektorientiertes Programmieren (AOP)<br />
• Invasive Komposition.
Modellierung<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 95<br />
Ziel: Ausführbare Systemmodellierung, um zu prüfen, daß das modellierte<br />
System das gegebene Problem löst<br />
Ansatz: Definiere die dynamische Semantik des Modells formal.<br />
Beispiel: Das Architektursystem Rapide. Dynamische Semantik ist durch<br />
abstrakte Ereignisinteraktion definiert.
1.8 Probleme und generelle Lösungen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 96<br />
• Wie baue ich große Systeme in einer heterogenen Welt?<br />
A vision of software components working smoothly together, without regard<br />
to details of any component’s location, platform, operating system,<br />
programming language, or network hardware and software.<br />
Jon Siegel, Object Management Group (OMG), 1989<br />
⇒ Realisierung des <strong>Software</strong>-Bus: Man braucht Mechanismen zur<br />
Transparenz von<br />
◮ Sprachen (IDL)<br />
◮ Plattformen<br />
◮ Betriebssystemen<br />
◮ Ausführungsort:<br />
Global eindeutige Referenz<br />
Stellvertreterobjekte (stub/skeleton)<br />
Wiederverwendbare Dienste zum Ermitteln von <strong>Komponenten</strong> und<br />
deren Eigenschaften (z.B. für dynamische Komposition):<br />
· Namensdienst<br />
· Makler<br />
· Persistenz (Objekte <strong>aus</strong> Datenbank holen)<br />
· Reflexion (Schnittstellen erfragen)<br />
Objektverwaltung (Lebenszyklus)<br />
⇒ Anpassungen: Paßfehlerüberbrückung
Sprachtransparenz: Ziel<br />
• Ein <strong>Komponenten</strong>system ist sprachtransparent, wenn für die Verwendung<br />
einer Komponente belanglos ist, in welcher Sprache sie implementiert ist.<br />
• Problem: Heterogenität mehrsprachiger Systeme<br />
◮ Aufrufkonzept<br />
Prozedur, Koroutine, Nachrichten<br />
◮ Aufrufrepräsentation<br />
Übergabekonventionen: Register, Stapel, ...<br />
Wer alloziert, wer räumt ab?<br />
◮ Datentypen<br />
Werte, Referenzen<br />
Arrays, Unions, Records<br />
Ko-/kontravariante Vererbung<br />
◮ Datenrepräsentation<br />
Breite und Kodierung primitiver Typen<br />
Layout zusammengesetzter Typen<br />
◮ Laufzeitumgebung<br />
Speicherverwaltung, Lebenszyklus<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 97
Sprachtransparenz: Ansatz<br />
• Allgemeine Alternativen:<br />
◮ Direktes Anpassen:<br />
Konvertierung von jeder Sprache in jede andere<br />
⇒ Aufwand O(n 2 ) bei n Sprachen<br />
◮ Anpassen an Aust<strong>aus</strong>chformat:<br />
Bei n Sprachen n Abbildungen auf ein Aust<strong>aus</strong>chformat<br />
⇒ Aufwand O(n)<br />
◮ Standardisieren: Keine Anpassung, aber restriktiv.<br />
Aufwand O(1) für Erstellung des Standards.<br />
• In industriellen <strong>Komponenten</strong>systemen:<br />
◮ Aufrufkonzept<br />
standardisiert auf Prozedur (Fernaufruf)<br />
◮ Aufrufrepräsentation<br />
standardisiert auf C<br />
◮ Datentypen<br />
Anpassung an Aust<strong>aus</strong>chformat (IDL)<br />
◮ Datenrepräsentation<br />
Anpassung an Aust<strong>aus</strong>chformat (IDL)<br />
◮ Laufzeitumgebung<br />
standardisiert als Dienste<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 98
Sprachtransparenz: Umsetzung<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 99<br />
• Interface Definition Language (IDL) oder Common Type System (CTS)<br />
◮ Sprachunabhängiges Typsystem<br />
◮ Obermenge gängiger Sprachen<br />
◮ Beschreibt Daten und Schnittstellen von <strong>Komponenten</strong><br />
• Standardisierte Sprachbindungen (language bindings)<br />
◮ Umsetzung von IDL-Konzepten mit Sprachmitteln<br />
◮ Werkzeug: sprachspezifische IDL-Übersetzer<br />
• Vorgehen zum Bau einer Komponente:<br />
◮ Beschreibe Schnittstellen in IDL<br />
◮ Erzeuge Gerüst in gewünschter Sprache mit IDL-Übersetzer<br />
◮ Fülle Gerüst mit Implementierung
Sprachtransparenz: CORBA IDL<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 100<br />
Interface Definition Language<br />
Typen<br />
Typen<br />
Referenz-<br />
Referenz-<br />
Objekte<br />
Objekte<br />
Objekte<br />
Objekte<br />
Wertobjekte<br />
Wertobjekte<br />
Nicht-Objekte<br />
Nicht-Objekte<br />
Basistypen<br />
Basistypen<br />
Konstruktoren<br />
Konstruktoren<br />
Any<br />
Any<br />
Bool<br />
Bool<br />
Enum<br />
Enum<br />
Ints (short,..)<br />
Ints (short,..)<br />
Reals Typen (float..)<br />
Reals Typen (float..)<br />
Char, string,<br />
Char, string,<br />
octet<br />
octet<br />
Struct<br />
Struct<br />
Sequence<br />
Sequence<br />
Union<br />
Union<br />
Array<br />
Array<br />
Dr. Welf Löwe und Markus Noga 14
Sprachtransparenz: Sprachbindung<br />
• Bijektive Abbildung: IDL ↔ spezielles Typsystem<br />
• Vorgehen: Strukturelle Induktion<br />
◮ Definiere Abbildung für alle primitiven Typen<br />
◮ Definiere Abbildung für alle Typkonstruktoren<br />
◮ Fertig<br />
• Leistet Transparenz von<br />
◮ byte order<br />
◮ Wortbreiten<br />
◮ Speicherlayout<br />
◮ Speicherverwaltung<br />
◮ Referenzen<br />
• Wo nötig Anpasser erzeugen (Kopien minimieren)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 101
Sprachtransparenz: .NET Common Type System<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 102
Ortstransparenz: Ziel<br />
• Ein <strong>Komponenten</strong>system ist ortstransparent, wenn für die Verwendung<br />
einer Komponente belanglos ist, wo sie sich befindet.<br />
• Problem: Heterogenität verteilter Systeme<br />
◮ Werte weitgehend unproblematisch<br />
◮ Gültigkeitsbereiche von Referenzen<br />
Thread / Prozeß,<br />
Rechner<br />
Kommunikationspartner<br />
Netz<br />
Zeitschranken (Speicherbereinigung, garbage collection)<br />
◮ Zugriffsarten auf Referenzen<br />
Speicherzugriff auf Felder<br />
Lokale Aufrufe<br />
Fernaufrufe<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 103
Ortstransparenz: Ansatz<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 104<br />
• Weltweit eindeutige Referenzen (GUUID, URI, etc.)<br />
◮ Z.B. Rechneradresse + lokale Referenz<br />
◮ Umsetzungstabelle für lokale Referenzen<br />
Keine lokale Freigabe extern bekannter <strong>Komponenten</strong><br />
Konsistente Änderung lokaler Adressen extern unsichtbar<br />
• Fernzugriff über transparente Stellvertreter (Proxies)<br />
◮ Implementiert alle Schnittstellen der Komponente<br />
◮ Aufrufe an Stellvertreter stets lokal<br />
◮ Weitergeleitet an Komponente durch Fernaufrufe<br />
Daher: Feldzugriffe nur über Zugriffsfunktionen<br />
Rechner 1 Rechner 2<br />
Komponente<br />
Objekt<br />
?<br />
Komponente<br />
Skelett<br />
RPC<br />
Stell−<br />
vertreter<br />
Konnektor
Ortstransparenz: Umsetzung (1)<br />
• Erzeuge Stellvertreter <strong>aus</strong> IDL<br />
◮ stub: eigentlicher Stellvertreter<br />
Ablauf IDL-Codegenerierung<br />
Leitet lokale Aufrufe als Byteströme über das Netz<br />
◮ skeleton: macht Komponente für Fernaufrufe zugänglich<br />
Dekodiert Byteströme und setzt sie in lokale Aufrufe um<br />
IDL<br />
IDL<br />
Interface<br />
Interface<br />
IDL-<br />
IDL-<br />
Compiler<br />
Compiler<br />
Server<br />
Server<br />
Implementation<br />
Implementation<br />
Server<br />
Server<br />
Skeleton<br />
Skeleton<br />
Client<br />
Client<br />
Stub<br />
Stub<br />
Client<br />
Client<br />
Implementation<br />
Implementation<br />
Implementation<br />
Repository<br />
Compiler<br />
Compiler<br />
Objektadapter/<br />
Objektadapter/<br />
BOA<br />
BOA<br />
Server<br />
Server<br />
Client<br />
Client<br />
Dr. Welf Löwe und Markus Noga 15<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 105
Ortstransparenz: Umsetzung (2)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 106<br />
• <strong>Komponenten</strong>behälter: Zentraler Eintrittspunkt (pro Rechner)<br />
◮ Allgemeine Infrastruktur für Fernaufrufe<br />
Kommunikationsprotokoll<br />
Authentifizierung (wer ist X?)<br />
Autorisierung (was darf X?)<br />
Lebenszyklus von <strong>Komponenten</strong><br />
Elementare Dienste<br />
• Weiterleitung von Aufrufen:<br />
Local<br />
Remote<br />
Client XStub<br />
Container Container<br />
XSkeleton<br />
X
Ortstransparenz: Statische Methodenaufrufe<br />
• Methoden der Teilnehmer sind statisch bekannt, dynamisch nur<br />
Verbindungsaufbau durch Anmeldung erforderlich.<br />
◮ Aufruf durch Stummel und Skelette,<br />
◮ Keine Suche nach Diensten (in der Ablage),<br />
◮ Keine Suche nach Dienstobjekten,<br />
◮ Schnell<br />
• Statische Typprüfung durch Übersetzer möglich<br />
• Da der Aufruf an die Skelette durch den Objekt-Adapter geht, erscheint<br />
dem Klienten das Dienstobjekt durchgängig lebendig (transparentes<br />
Leben)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 107
Ortstransparenz: Dynamischer Aufruf (Request Broking)<br />
• Dynamischer Aufruf (dynamische Abfrage)<br />
◮ <strong>Komponenten</strong> dynamisch <strong>aus</strong>get<strong>aus</strong>cht oder nachträglich eingebracht<br />
◮ Neuübersetzung entfällt<br />
◮ Beispiel: Plugins für Browser, Zeichenprogramme etc.<br />
• Beschreibung der <strong>Komponenten</strong>semantik zur Suche<br />
◮ Object Interface<br />
◮ Informationen<br />
Metadaten (beschreibende Daten)<br />
Schnittstellendaten<br />
Verzeichnisse von <strong>Komponenten</strong> (interface repository ,<br />
implementation repository )<br />
• Such-Vermittler<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 108
Ortstransparenz: Ermitteln von Interaktionspartnern<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 109<br />
• Finden von Schnittstellen: Schnittstellenablage. Verwaltung der<br />
registrierten Schnittstellen<br />
• Finden von Objekten: Objektablage. Eine Schnittstelle kann von<br />
verschiedenen Objekten realisiert sein, finde eines davon.<br />
• Dienste:<br />
◮ Namensauflösung: Namensdienst<br />
◮ Vermittler (Makler, Trader )<br />
◮ Persistenz (Objekte <strong>aus</strong> Datenbank/von Platte holen)<br />
◮ Reflexion (Schnittstellen/Eigenschaften ermitteln)<br />
• Dienste bilden die Grundfunktionalität des Laufzeitsystems. Sie stellen die<br />
von <strong>Komponenten</strong> allgemein benötigte Funktionalität bereit und sind<br />
selbst <strong>Komponenten</strong>.<br />
• Motivation<br />
◮ Standardisierung<br />
◮ Wiederverwendung
Ortstransparenz: Namensauflösung — Namensdienst<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 110<br />
• Henne-Ei-Problem:<br />
◮ Woher kennt eine Komponente andere <strong>Komponenten</strong>?<br />
◮ Durch vom Aufrufer übergebene Referenzen.<br />
◮ Woher kennt der Aufrufer die Komponente?<br />
• Lösung<br />
◮ Führe (menschenlesbare) Namen für <strong>Komponenten</strong> ein<br />
◮ Stelle Dienst zur Namensauflösung bereit<br />
Bindet Namen an <strong>Komponenten</strong><br />
Namen sind keine <strong>Komponenten</strong> (Corba-Jargon: Pseudoobjekte)<br />
Bindung erfolgt in einem Namensraum (scope, naming context)<br />
Auffinden des Namensdienstes ist Behälterfunktion<br />
<strong>Komponenten</strong> registrieren sich mit Name und Referenz<br />
Auffinden weiterer <strong>Komponenten</strong> über Namen<br />
Component<br />
NameService<br />
+resolve(in name : string(idl)) : Component<br />
+register(in comp : Component, in name : string(idl))<br />
X<br />
Container<br />
+getNameService() : Component
Ortstransparenz — Namensdienst: Ablauf<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 111<br />
Systemabhängiger<br />
Name<br />
Erzeuge Name<br />
Suche / Erzeuge<br />
Namensraum<br />
Corba-Name<br />
Corba-<br />
Namensraum<br />
Binde<br />
Komponente<br />
(Corba-Objekt)<br />
Suche Name
Ortstransparenz: Vermittler/Makler<br />
• Erweitere das Auffindungsproblem:<br />
◮ Name unbekannt<br />
◮ Eigenschaften bekannt<br />
• Lösung<br />
◮ Stelle Dienst zur Vermittlung bereit<br />
Auffinden des Vermittlers über Namensdienst<br />
<strong>Komponenten</strong> registrieren sich mit Eigenschaften und Referenz<br />
Auffinden weiterer <strong>Komponenten</strong> über Vermittler<br />
◮ Standardisiere Eigenschaften (Terminologie, Ontologie)<br />
Funktionale Eigenschaften: Domänenmodell<br />
Nichtfunktionale Eigenschaften: Dienstgüte, ...<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 112
Ortstransparenz — Makler: Ablauf<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 113<br />
Geschäftsprozessdienste: Makler<br />
Makler handeln mit<br />
Diensten (services,<br />
service types)<br />
Makler<br />
Vermittlermuster<br />
Exportiere<br />
Funktionalität<br />
Importiere<br />
Funktionalität<br />
Dienst<br />
Interagiere<br />
Kunde<br />
Dr. Welf Löwe und Markus Noga 55
Ortstransparenz — Makler: Dienstangebote<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 114<br />
• Dienstangebot: Paar <strong>aus</strong> eindeutiger Referenz und Eigenschaften<br />
• Eigenschaften<br />
◮ von Maklern genutzt für Anfragen nach Diensten<br />
◮ Dynamische Eigenschaften (!)<br />
• Zum Vergleich spezielle Anfragesprache<br />
(standard constraint language)<br />
◮ boolesche Ausdrücke über Eigenschaften<br />
◮ numerische und Stringvergleiche<br />
• Findet ein Makler keinen passenden Dienst<br />
◮ kann er Nachbarn beauftragen (Entwurfsmuster Zuständigkeitskette,<br />
chain of responsibility )<br />
◮ Dazu ist ein Graph <strong>aus</strong> Maklern aufgebaut<br />
◮ Filtern beim Weitergeben der Dienstsuchanfrage
Ortstransparenz — Maklergraph: Dienst-Hüpfen (hopping)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 115<br />
Dienst-Hüpfen (hopping)<br />
Makler 1<br />
Fluß der<br />
Eigenschaften<br />
der Dienstanfrage<br />
Angebote der Makler<br />
Policies, die die Werte<br />
der Eigenschaften der<br />
Dienstanfrage verändern<br />
Makler 2<br />
Makler 4<br />
Makler 3<br />
Dr. Welf Löwe und Markus Noga 58
Ortstransparenz — Makler: Schnittstellen<br />
• Schnittstellen<br />
◮ Lookup (Anfragen stellen)<br />
◮ Offer Iterator<br />
◮ Register (zum Export und Zurückziehen von Diensten)<br />
◮ Link (Aufbau des Maklernetzes)<br />
◮ Proxy (Stellvertreter-Objekte, die Makler vertreten)<br />
Stellvertretung für andere Makler<br />
Erlaubt Kapselung von Altsystemen<br />
◮ Admin (Eigenschaften von Dienste)<br />
Lookup.Query(<br />
in ServiceTypeName,in Constraint, in PolicySeq,<br />
in SpecifiedProps, in howMany,<br />
out OfferSequence, out offerIterator<br />
)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 116
Ortstransparenz — Makler: Maklerarten<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 117<br />
Maklerarten<br />
Lookup<br />
Lookup<br />
Register<br />
LookupRegister Admin<br />
Anfragemakler<br />
(query trader)<br />
Einfacher<br />
Makler<br />
(simple trader)<br />
Selbständiger<br />
Makler<br />
(standalone<br />
trader)<br />
Lookup Register Admin<br />
Lookup Register Admin<br />
Lookup Register Admin<br />
Sozialer Makler<br />
(linked trader)<br />
Stellvertreter<br />
Makler<br />
(proxy trader)<br />
Komplett-<br />
Makler<br />
(full-service<br />
trader)<br />
Link<br />
Proxy<br />
Link<br />
Proxy<br />
Dr. Welf Löwe und Markus Noga 61
Ortstansparenz: Persistenz<br />
• Verändere das Auffindungsproblem:<br />
◮ Eigenschaften bekannt<br />
◮ Instanz möglicherweise passiviert (Datenbank)<br />
• Lösung<br />
◮ Stelle Dienst zur Vermittlung bereit<br />
Auffinden der Instanz über Schlüssel<br />
Bei Bedarf aktivieren (Objekt erzeugen)<br />
Bei Nutzungsende erneut passivieren<br />
◮ Nutzen<br />
Alle Objekte erscheinen permanent lebendig<br />
Handhabung des Objektlebenszyklus vereinfacht<br />
• Alternative<br />
◮ Auch denkbar: verallgemeinerte Referenzen<br />
◮ Aber: erfordert Änderungen der Basisplattform<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 118
Ortstransparenz: Reflexion<br />
• Mit Reflexion können die Schnittstellen einer (unbekannten) Komponente<br />
zur Laufzeit ermittelt und verwendet werden.<br />
• Motivation<br />
◮ Automatische Konfiguration<br />
◮ Einsatz in Entwicklungsumgebungen<br />
• Probleme<br />
◮ Inkompatibilitäten: bereits duch Sprachtransparenz <strong>aus</strong>geräumt<br />
◮ Noch offen: Standardisierter Zugriff auf Schnittstellen<br />
• Ansatz<br />
◮ IDL ist bereits standardisiert<br />
◮ Standardisiere Laufzeitrepräsentation<br />
◮ Standardisiere Zugriff darauf<br />
• Umsetzung<br />
◮ Beschreibe abstrakten Syntaxbaum für IDL in IDL<br />
◮ Mache Definitionstabelle im Behälter zugänglich<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 119
Reflexion: Metadaten<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 120<br />
Metadaten<br />
Meta: griech. darüber, jenseits<br />
Metadaten: Daten über Daten<br />
• µɛτα: griech. – Datenbeschreibung<br />
darüber, jenseits<br />
• Metadaten: – Modellierung Daten über Daten<br />
◮ Datenbeschreibung<br />
– Können reflexiv sein<br />
◮ Modellierung Reflektion: Programm greift auf<br />
◮ Können Metadaten reflexivzusein<br />
• Reflexion: Selbstmodifikation Programm greift (intercession)<br />
auf Metadaten kann Erkenntnisse zu nutzen<br />
• Selbstmodifikation kann<br />
Erkenntnisse nutzen<br />
Metadaten<br />
Metadaten<br />
Beschreiben<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Ändern<br />
Zugriff<br />
Metaebene<br />
(Konzeptebene)<br />
Realität<br />
Dr. Welf Löwe und Markus Noga 69
Reflexion und Selbstmodifikation<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 121<br />
Reflexion:<br />
for all c in self.classes do<br />
generate_class_start(c);<br />
for all a in c.attributes do<br />
generate_attribute(a);<br />
done;<br />
generate_class_end(c);<br />
done;<br />
Selbstmodifikation:<br />
for all c in self.classes do<br />
helpClass = makeClass(c.name+"help");<br />
for all a in c.attributes do<br />
helpClass.addAttribute(copyAttribute(a));<br />
done;<br />
self.addClass(helpClass);<br />
done;<br />
Reflexion bietet Zugriff auf Typinformationen<br />
für ein Programm. Es wird<br />
dabei nicht geändert.<br />
Selbstmodifikation ändert das laufende Programm<br />
anhand reflektierter Information.
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 122<br />
Reflexion: Ausspähen (Introspection)<br />
Ausspähen (Introspection)<br />
• falscher Sprachgebrauch: gemeint ist inspection<br />
• Spezialfall der Reflexion: über fremde <strong>Komponenten</strong><br />
• Bestimmen Bestimmen semantikbehafteter semantikbehafteter Eigenschaften Eigenschaften<br />
• wichtig für den Web-<strong>Komponenten</strong>-Supermarkt<br />
Spezialfall der Reflektion: über fremde <strong>Komponenten</strong><br />
Wichtig für den Web-<strong>Komponenten</strong>-Supermarkt.<br />
Metadaten<br />
Metadaten<br />
Metaebene<br />
(Konzeptebene)<br />
Zugriff<br />
Beschreiben<br />
Realität<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Daten,<br />
Daten,<br />
Code<br />
Code<br />
Ändern
Ortstransparenz: Objektverwaltung<br />
• Client/Server-Ansatz: Objektlebenslebenszyklus<br />
◮ Client fragt nach einer Komponente: Server verwaltet<br />
Programmstücke/<strong>Komponenten</strong>: Eine Komponente (ein<br />
Programm/eine Implementierung/eine Klasse) ist bereit, wenn der<br />
Server die Fabrik zur Erzeugung von Instanzen der Komponente<br />
erzeugt hat.<br />
◮ Client fragt nach einer <strong>Komponenten</strong>instanz:<br />
Objekt nicht auf Server vorhanden: Server verwendet Fabrik, um<br />
neues Objekt zu erzeugen.<br />
Objekt auf Server vorhanden:<br />
· Objekt im Speicher: Verwende dieses Objekt.<br />
· Objekt auf Platte: Lade und aktiviere das Objekt.<br />
◮ Server deaktiviert eine <strong>Komponenten</strong>instanz → Nachricht an<br />
Objektverwalter<br />
◮ Server deaktiviert eine Komponente → Nachricht an<br />
<strong>Komponenten</strong>/-objektverwalter<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 123
Ortstransparenz — Objektverwaltung Überblick (1)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 124
Ortstransparenz — Objektverwaltung Überblick (2)<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 125
Ortstransparenz — Objektverwaltung: Serverseite<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 126<br />
Serverseite<br />
• Anfrage nach Komponente und dessen Instanz.<br />
• Instanz wird neu erzeugt.<br />
• Instanz und Komponente werden nach Verwendung deaktiviert.<br />
Server / Object Implementation<br />
impl_is_<br />
ready<br />
object_is_<br />
ready<br />
deactivate_<br />
obj<br />
deactivate_<br />
impl<br />
BOA<br />
IDL<br />
Skeleton<br />
ORB Kern<br />
Dr. Welf Löwe und Markus Noga 17
Synchronisation und Transaktionsschutz<br />
• Synchronisation: Sperren<br />
◮ Einzelne oder Mengen von Sperren<br />
◮ Innerhalb von oder ohne Transaktionen<br />
• Transaktionen (Standard-Datenbanktechnik):<br />
◮ Einfache/Flache Transaktionen<br />
begin<br />
rollback<br />
commit (two-phase-commit)<br />
◮ Geschachtelte Transaktionen<br />
◮ Beispiele<br />
Bankkonten als <strong>Komponenten</strong><br />
· Operationen Abheben, Einzahlen<br />
· Überweisung ist Transaktion über zwei <strong>Komponenten</strong><br />
Webseiten<br />
· Bidirektionale Verweise<br />
· Wie erziele ich Konsistenz?<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 127
Eigenschaftsdienst<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 128<br />
• Mechanismus für dynamische Erweiterungen<br />
• Eigenschaften (properties) sind Tupel von Strings (name, value)<br />
• Dienst verwaltet Eigenschaften von <strong>Komponenten</strong><br />
komponente1: ("makelbar" , "ja")<br />
("kategorie", "geschäftsdienst")<br />
• Konzept bekannt:<br />
◮ assoziative Arrays<br />
◮ LISP property lists<br />
◮ Java property classes<br />
• Iteratoren für Eigenschaftswerte<br />
• Verfeinerung PropertySetDef<br />
◮ Definierte Semantik für: readonly, fixed_readonly, . . .<br />
• Schnittstelle: define_property, define_properties, get_property_value,<br />
get_properties, delete_property, . . .
Anpassungen: Komposition<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 129<br />
• Generische <strong>Komponenten</strong> <strong>aus</strong>prägen (mit Argumenten für generische<br />
Parameter)<br />
• Zusammensetzen von <strong>Komponenten</strong> laut Verträgen:<br />
◮ über Funktionen und Daten<br />
◮ über Kommunikation, Synchronisation und Protokolle<br />
◮ Problem der globalen Lebendigkeit?<br />
◮ Wie erreicht man nicht-funktionale Eigenschaften?<br />
• Mangelnde Passung erfordert Adaption der <strong>Komponenten</strong>:<br />
◮ Externe Adaption durch Umwickeln<br />
◮ Interne Adaption:<br />
Offenes Einsetzen<br />
Invasiver Aust<strong>aus</strong>ch nicht-funktionaler Aspekte (z.B.<br />
Basiskommunikation t<strong>aus</strong>chen, Synchronisation einfügen etc.)
Anpassungen: Paßfehler überbrücken<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 130<br />
• Datenformate konvertieren<br />
• Auflösen von Datenstrukturpaßfehlern [Jackson1975]: Gemeinsame<br />
kleinste gemeinsame Teilstruktur wählen.<br />
• Interaktionsmechanismen anpassen: Umwickeln oder invasiv modifizieren<br />
[Heuzeroth2004]<br />
• Antrieb invasiv anpassen: Programminversion<br />
[Jackson1975,Heuzeroth2004]<br />
• Aktivitätspaßfehler: Aktivitäten sequentialisieren<br />
• Protokollpaßfehler: Protokollanpassung durch Adapter [Yellin und<br />
Strom1994]
Zusammenfassung der Aufgaben<br />
Gesamtaufgabe: Zusammenspiel von <strong>Komponenten</strong> in einer heterogenen Welt<br />
organisieren<br />
• Sprachtransparenz<br />
• Ortstransparenz<br />
◮ eindeutige Referenzen<br />
◮ Stellvertreter<br />
◮ Dienste zum Auffinden/Vermitteln: Namensdienste, Makler, Persistenz,<br />
Behälterdienste, DB-Zugriff, Reflexion<br />
• Anpassungen<br />
Prof. Dr. G. <strong>Goos</strong> <strong>Software</strong> <strong>aus</strong> <strong>Komponenten</strong> 131