30.01.2014 Aufrufe

Software aus Komponenten - IPD Goos

Software aus Komponenten - IPD Goos

Software aus Komponenten - IPD Goos

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!