University of Munich/ Department of CS(Informatik)
Link to free Java Refactoring Browser: DPT
Evolution von Softwaresystemen durch Transformation
(Object-Oriented Software Refactoring via Design Pattern Transformation)
Inhalt:
1) Motivation
a) SW -Kosten minimieren.
b) Fehleranfälligkeit der Software senken
c) Entwurf- /Entwicklungszeit und Wartungsaufwand reduzieren.
2) Architektur und Funktionsweise
a) Voraussetzungen
b) Grundoperationen
-Vererbungstransformation(Inherit)
- Objekt-Fabrik Transformation(Factory)
- Referenzenverschiebung(Substitute)
- AndereTransformationen(CreateClass/AddVariable/Singelton)
c) Theorie in Praxis: Durchführung einer SW-Transformation
- SW- Wiederverwendung mittels Transformationen (gleicher Funktionalität)
- SW- Erweiterung mittels Transformationen (zusätzlicher Funktionalität)
d) Weitere Beispiele(oberflächlich)
- CIM-Works
- Andrew User Interface System
3) Vor- und Nachteile der Design Pattern Transformation Techniken
a) Offensichtliche Vorteile
b) Zwiespältige Vorteile
c) Objektive Nachteile
d) Subjektive Nachteile
4) Zusammenfassung und offene Diskussion
a)Integration mit anderen Tools und neue Features der SWE
b) Einsatzmöglichkeiten.
Die Entwicklung der Informatik, neuer Hard- und Software- Technologien hat in den letzten Jahren zu einen gigantischen
Beitrag der Arbeitslosigkeit in den führenden Industrieländer geführt. Viele traditionelle Berufe sind entweder ganz
oder teilweise durch den Computer und Programme ersetzt worden. Nun ist die Zeit reif, dass die Softwareentwickler
letztendlich auch für die Arbeitslosigkeit in den eigenen Reihen sorgen werden. Ein gutes Beispiel dafür liefert uns
hier die Design Pattern Transformation, die zusammen mit den OOSR das Hauptthema meiner Arbeit ist.
1) Motivation
a) SW -Kosten minimieren.
Natürlich gibt es auch wichtigere Gründe für die Einführung der OOSR via Pattern Transformation,
als nur die Steigerung der Arbeitslosigkeit. Wir alle wollen unser Geld bestmöglich investieren,
die Firmen wollen, dass ihre Aktien möglichst hoch steigen, dies ist jedoch gewinnbedingt,
was wiederum von den Kosten abhängig ist. Kurz gesagt, wir wollen bei der SW-Entwicklung und Wartung kosten einsparen.
Wenn früher (70er/80er) die Wartungskosten bei 30-50% lagen, so sind sie heutzutage bei 80/90% der
Gesamtkosten der Software. Design Pattern vergrößert zwar die Entwicklungskosten, verringert aber
erheblich die Wartungskosten, da z.B. Upgrade und Portierung mit weniger Aufwand verbunden sind.
Die Stichworte Wiederverwendung und Erweiterbarkeit der Software bekommen ein weiteres Attribut -
einfache (kostenminimale) Wiederverwendung bzw. Erweiterbarkeit.
b) Fehleranfälligkeit der Software senken
Das Beispiel des Problems der Umstellung auf das Jahr 2000 zeigt uns, das durchaus externe Ereignisse
für die Fehleranfälligkeit der SW sorgen können, die mit dem eigentlichen Programm vielleicht gar
nichts zu tun haben, oder zum Zeitpunkt der Entwicklung nicht erkannt wurden. OOSR via Design Pattern
Transformation gibt uns auch hier Mechanismen, um die Fehleranfälligkeit der Programme mit minimalen
Aufwand zu beheben (in diesem speziellen Beispiel wäre es ein Wrapper für den Datentyp). Außerdem ist
es sicherer bestehende (und "fehlerfreie") Module zu rekonstruieren und wiederzuverwenden, als neue
Module mit ähnlicher Funktionalität zu entwickeln.
c) Entwurf- /Entwicklungszeit und Wartungsaufwand reduzieren.
Der dritte Grund für die Einführung von OOSR via Design Pattern wäre die Zeit. Es ist üblich in der
SW- Branche, daß angesichts der harten Konkurrenz, jede Firma kürzere Entwurf- und Entwicklungszeiten
verspricht, als es eigentlich notwendig wäre. Die Versuche der Firmen die versprochenen Termine einzuhalten,
sorgten für die Akzeptanz neuer Projekt Management und Entwicklungs- Technologien, die z.B. Entwicklung
während des Entwurfes erlauben (Stichwort: Reverse Engineering). Gute Beispiele dafür sind "Rational Rose"
und "STP" OMT -Tools. Diese Tools in Verbindung mit den ClassViewer-Tools (etwa SNIFF+ / Visual Works / MSD)
verwenden unter anderem Design Pattern (z.B.Class-Wizard) und in der nächsten Zukunft auch Pattern Transformationen,
um eben die Entwicklung und Wartungszeiten zu reduzieren.
Jetzt haben wir aber schon viel gesagt, ohne zu wissen, was nun eigentlich die OOSR via Pattern Transformation
wirklich bedeutet! Nun Design Pattern (Muster) definieren uns einen Zielzustand
d.h. den Entwurf für eine Programmcode Implementierung. Ein brauchbares Transformationstool wäre
in der Lage den vorhandenen Code (oder UML-Diagramme) automatisch zu transformieren in ein
neues als Ziel definiertes Programm! Ein solches Tool, das die Modifikation vom Programmcode
automatisch ausführt, hätte nicht nur dem Programmierer die Codierung und damit verbundene
Fehleranfälligkeit erspart, sondern hätte die Softwarekosten erheblich reduzieren können.
Damit hätten wir in unserem Beispiel kleinere Kosten, größere Gewinne, Aktien- Höhenflug und
Viele Arbeitslose Programmierer!
Um das Thema Motivation abzuschließen, möchte ich noch zwei Gesetze der SW- Branche zitieren:
"Nicht große Firmen essen Kleine, sondern die Schnellen essen die Langsamen!" und " Zeit ist Geld!"
2) Architektur und Funktionsweise
Vor lauter Optimismus in der Einführung ist es manchen wohl so vorgekommen, das die OOSR via Patern Transformation
ein schneller und kostenminimaler Weg zum Erfolg sei, wir möchten aber, dass die
Rahmenbedingungen für den Einsatz der Pattern Transformation uns nicht entgangen bleiben. Denn der Einsatz neuer
Technologien ist mit Risiken verbunden, so daß man manchmal leicht auf die Schnauze fällt(wie es manche Projekte tun!).
Anstatt schnell und kostenminimal zum Erfolg zu kommen, wird man dann mit einem Klotz am Bein den Aufwand verdoppeln,
wenn man die Randbedingungen nicht beachtet. Deshalb möchte ich zunächst einmal auf die Voraussetzungen für die OOSR
via Pattern Transformation eingehen. Dabei muß man in erster Linie zwischen den "Specification to Source" und
"Source to Source " -Transformationen unterscheiden.
a) Voraussetzungen
Nehmen wir nun den Fall "Source to Source ". Dabei gelten folgende Faustregel:
1) Vorhandener Code soll keine komplizierten Pre-Compiler Makros erhalten (z.B.: #ifndef, #pragma, usw.)
2) Compiler- Wechsel ist bei der Transformation nicht möglich. (wegen Make-File compatibility)
3) Vorhandener Code ist ein Einzelprogramm (keine Programmfamilie) z.B.: Falls DLL zu dem Programm
geändert wird, werden andere Programme, die dieselbe DLL benutzen, nicht mehr laufen!
4) Code Verfügbarkeit. z.B.: FrameWork oder System-API header-files sind nur "Read Only" und können
nicht für die Transformation verwendet werden. Deshalb grundsätzlich transformiere nur eigenen Code!
5) Gute Planung ist alles:
- Plazierung des generierten Code(Code Placement),
- Transformation Aktivierungs- Bedingungen(Enabling Conditions),
- Granularität der Transformation.
Da insbesondere alle Einzelheiten später näher erläutert werden, werden wir uns an der Stelle erstmal
mit den Grundoperationen der Pattern Transformation beschäftigen.
b) Grundoperationen
Pattern Transformationen sind nun eine kleine Menge von primitiven Object-Orientierten Transformationen.
Object-Orientierte Transformationen sind ihrerseits Programmcode Transformationen, und zwar Code,
welcher Klassen, Methoden, Vererbung und weitere Konstrukte
der Objekt- Orientierten Programmierung enthält (Also SmallTalk, C++, Java)
Transformation kann wie folgt beschrieben werden:
1) Beschreibung
2) Argumente
3) Anfangs- und End- Zustand
4) Anwendung spezifischer Eigenschaften und Einschränkungen
5) Transformationsaufruf
Zur Demonstration der Grundtransformationen wird im folgenden die Sprache C++ verwendet, da
die Sprache am weitesten verbreitet ist und den meisten wohl bekannt sein wird.
Vererbungstransformation (Inherit Transformation)
1) Beschreibung: Macht es möglich eine Super-Subclass Beziehung zwischen zwei vorhandenen,
aber unabhängigen Klassen herzustellen.
2) Argumente: c1(Superclass Name), c2 (Subclassname)
vm2* (Liste von c2 virtuellen Methoden, die in c1 vorhanden sein werden)
m2* (Liste von c2 Methoden, die in c1 vorhanden sein werden)
iv2* (Liste von c2 instanz-variablen, die in c1 verschoben werden)
3) Start- und End-Zustände (siehe Abb.1.1)
4) Eigenschaften:
- andere Subclassen von c1 (falls vorhanden) müssen vm2*() unterstützen
- c2 muß alle virtuelle Methoden von c1 unterstützen
- Methoden m2*() von c2 dürfen keine anderen Subklass-spezifische Variablen referenzieren
(z.B. c2 wäre von c3 abgeleitet und hat c3 spezifische Instanz-Variablen)
5) Aufruf: Inherit(c1,c2,vm2*(),m2*(),iv2*);
Objekt Fabrik Transformation (Factory Methode)
1) Beschreibung: Macht es möglich bei Methodenaufruf der Klasse c1 ein neues Objekt der
Klasse c2 zu erzeugen (z.B. C2* p_c2 = c1.CreateC2(); )
2) Argumente: c1(Fabrik Name), c2 (Klassname), c3 (Klasse, die erzeugt wird)
3) Start- und End-Zustände (siehe Abb.1.2)
4) Eigenschaften:
- Name der Fabrik-Methode (CreateC2()) darf nicht in c1 schon vorhanden sein!
- C3 ist entweder C2 selbst, oder Superklasse von C2
- V ist ein Ausdrück, welcher ein Objekt mit der Mehtode Create() liefert.
5) Aufruf: Factory (c1,c2,c3=c2,v);
Referenzenverschiebung (Substitute Transformation)
1) Beschreibung: Sei Klasse C2 von C3 abgeleitet und in C1 referenziert. Folgende
Transformation macht die Verschiebung der Referenz einer Klasse
auf die Basisklasse dieser referenzierter Klasse möglich.
2) Argumente: c1(Klasse, bei der Referenz vorliegt), c2 (Klasse, die referenziert ist),
c3(die zu referenzierende Klasse)
3) Start- und End-Zustände (siehe Abb.1.3)
4) Eigenschaften:
- C3 soll die Interface von C2 zu C1 anbieten (Test: Compiler-error: "undefined member")
- Aufrufe der C1-Methoden, die einen Zeiger auf C2 liefern müssen auch C3 akzeptieren.
(Test: Compiler-error: "type mismatch")
- Wenn C1 erzeugt C2, so muß C3 eine Basis der C2 sein und newC2() mit newC3() ersetzen
- Falls C3 eine abstrakte Basisklasse ist, ersetze C2-Referenz mit C3, keine Transformation!
5) Aufruf: Substitute (c1,c2,c3);
Andere Transformationen:
Andere Transformationen sind entweder wohl bekannt oder treten sehr selten auf:
Erste zwei Transformationen sind aus diversen Class-Wizards bekannt:
- CreateClass(Classname) oder CreateInstanceVariable(VarName, VarType):
Beschreibung: Dienen zur Erzeugung der neuen Klasse und der Member der Klasse
- Singleton und InverseSingleton:
Beschreibung: Macht es möglich, daß einer Klasse nur eine Instanz zur Laufzeit existiert
Oder auch umgekehrt (Inverse Singelton).
Problem: Prüfung, ob Singleton sicher und korrekt ist, ist sehr schwer
c) Theorie in Praxis: Durchführung einer SW-Transformation
Nun wollen wir gemeinsam die Transformations-Theorie an einem praxisnahen Beispiel näher betrachten
und uns in die Tiefe(auf die Source-Ebene) begeben.
Ausgangssituation: Ein Programm, das ein Honda Prelude erzeugt und 100000 Meilen fährt. Dabei werden
Reifen und Motor gewechselt. Das Programm arbeitet nur für Honda Prelude.
Aufgabe: Wir sollen ein Programm mit gleicher Funktionalität schreiben, das neue Modelle erzeugt und
fahren läßt.Insbesondere soll zunächst ein Honda Accord damit erzeugt werden.
Dabei dürfen wir das Programm für Honda Prelude verwenden.
Vorgehen:
1) Transformiere das vorhandene Programm zu einem neuen Programm mit gleicher Funktionalität.
Das neue Programm soll für Erweiterbarkeit und Wiederverwendbarkeit ausgelegt sein.
2) Transformation zu einem neuen Programm mit gewünschter Funktionalität.
SW- Wiederverwendung mittels Transformationen (gleicher Funktionalität)
Step1.1: Inherit Transformation = Erzeuge (abstrakte) Basisklassen für (konkrete) Reifen und Motor.
a) Ist Zustand (Tab.2.1)
b) Soll Zustand (Tab.2.1)
c) Transformationskontext und Code: (Abb.2.1)
d) Aufruf: Inherit[Engine,VTEC2_2,nil,(Drive),(miles, max_miles)]
Step1.2: Substitute Transformation = Wir wollen der Klasse "Auto" die Benutzung der neuen Klassen
"Reifen" und "Motor" beibringen.
a) Ist Zustand (Tab.2.2)
b) Soll Zustand (Tab.2.2)
c) Transformationskontext und Code: (Abb.2.2)
d) Aufruf: Substitute[Car,VTEC2_2,Engine] / Substitute[Car,GY184_HR14,Tire]
Step1.3: Factory Transformation = Nun wollen wir Autos mit verschiedenen Reifen und Motoren
erzeugen können. Wir brauchen also eine Auto-Objekt Factory.
a) Ist Zustand (Tab.2.3)
b) Soll Zustand (Tab.2.3)
c) Transformationskontext und Code: (Abb.2.3)
d) Aufruf: CreateClass[CarFactory]
CreateInstanceVariable[App,PreludeFactory*,car_factory,new PreludeFactory]
FactoryMethod[PreludeFactory, GY184_HR14, MakeTire,Tire, app->car_factory]
FactoryMethod[PreludeFactory, VTEC2_2, MakeMotor, Motor, app->car_factory]
Step1.4: Inherit Transformation = Erzeuge (abstrakte) Auto-Factory für (concrete) Auto-Factory .
a) Ist Zustand (Tab.2.4)
b) Soll Zustand (Tab.2.4)
c) Transformationskontext und Code: (Abb.2.4)
d) Aufruf: Inherit[CarFactory,PreludeFactory,(MakeMotor,MakeReifen),nil,nil]
Step1.5: Substitute Transformation = Beibringen der Anwendung das Arbeiten mit der AutoFactory.
a) Ist Zustand (Tab.2.5)
b) Soll Zustand (Tab.2.5)
c) Transformationskontext und Code: (Abb.2.5)
d) Aufruf: Substitute[App, PreludeFactory, CarFactory]
Ergebnis: Schritt 1 ist abgeschlossen! Anwendung kann immer noch einen Honda Prelude erzeugen und fahren.
Das Programm ist nicht mehr an konkreten Prelude-Teilen abhängig (diese sind nicht mehr explizit referenziert ),
sondern es enthält eine AutoFactory, die Objekte von Typ Motor und Reifen erzeugt,
welche in einem Auto referenziert sind. Desweiteren wird diese abstrakte AutoFactory durch eine
konkrete PreludeFactory implementiert, welche uns konkrete Prelude-Teile (VTEC2_2 Motor und GY184_HR14 Reifen)
für das Auto-Objekt zur Verfügung stellt.
SW- Erweiterung mittels Transformationen (zusätzlicher Funktionalität)
Das neu entstandene Programm bietet uns nun eine ganze Reihe von Erweiterungsmöglichkeiten,
Welche in ursprünglichem Programm mit einem riesigen Aufwand verbunden wären. Unter Anderem:
- wir können neue Typen von Reifen oder Motoren einfach erzeugen, indem wir weitere Subklassen von
Reifen oder Motoren bilden (richtiges Verhalten wird vererbt!)
- wir können unseren Honda Prelude mit diesen neuen Teilen ausstatten, indem wir die Factory-Method
in PreludeFactory modifizieren
- wir können andere Auto-Factorys hinzufügen, welche uns andere Autos erzeugen(z.B. Accord)
- wir können schließlich die gleiche Anwendung nutzen um andere Autos erzeugen und fahren zu lassen,
soweit eine andere konkrete AutoFactory implementiert ist.
Step2.1: Creation Transformation = Addieren neuer Reifen und Motor- Klassen.
a) Ist Zustand (Tab.3.1)
b) Soll Zustand (Tab.3.1)
c) Transformationskontext und Code: (Abb.3.1)
d) Aufruf: CreateClass[AccordEngine] / CreateClass[AccordTire]
Inherit[AccordEngine, Engine, nil, (max_miles,miles)]
Inherit [AccordTire, Tire, nil, (max_miles,miles)]
Step2.2: Factory Transformation = Prelude soll mit neuen Reifen und Motor erzeugt werden.
a) Ist Zustand (Tab.3.2)
b) Soll Zustand (Tab.3.2)
c) Transformationskontext und Code: (Abb.3.2)
d) Aufruf: FactoryMethod[PreludeFactory,AccordTire,MakeTire,Tire,app->car_factory]
[PreludeFactory,AccordEngine,MakeEngine,Engine,app->car_factory]
Step2.3: Creation Transformation = Addieren neue AutoFactory.
a) Ist Zustand (Tab.3.3)
b) Soll Zustand (Tab.3.3)
c) Transformationskontext und Code: (Abb.3.3)
d) Aufruf: CreateClass[AccordFactory]
Inherit[AccordFactory, CarFactory, (MakeTire,MakeEngine),nil]
Step2.4: Reassociate Transformation = Reassitiation der Anwendung mit neuer AccordFactory.
a) Ist Zustand (Tab.3.4)
b) Soll Zustand (Tab.3.4)
c) Transformationskontext und Code: (Abb.3.4)
d) Aufruf: Reassociate[App, PreludeFactory, AccordFactory], oder per Hand!
Ergebnis: Schritt2 ist abgeschlossen und wir haben unsere Aufgabe erfüllt!
Insgesamt waren 9 Stufen notwendig um die gesamte Programmtransformation durchzuführen.
d) Weitere Beispiele:
Nachdem wir nun die Pattern-Transformationstechnik an diesem umfangreichem Beispiel in einer
greifbaren Nähe kennengelernt haben, können wir auch einen kurzen Ausblick auf weitere Beispiele
aus der Industrie einwerfen.
CIM-Works
CIM-Works ist ein Industrieweites Framework für Windows-Anwendungen, die für Simatech
Spezifiziert sind (wie etwa MFC für VisualC++). Große Architektur Veränderungen sind zwischen
Den Versionen 2 und 4 passiert und wurden mit Hilfe der Transformationen nachvollzogen.
Dieses Refactoring ist in 8 Stufen von einer Menge der primitiven Transformationen (wie etwa:
-rename_class / - create_class / -create_factory/ - add_variable / move_variable / inherit) realisiert
worden. Dabei sind 5K Byte Code entstanden.
Andrew User Interface System
Andrew User Interface System von CMU ist eine Sammlung von Tools, welche dem Benutzer das Erzeugen,
Benutzen und Mailen von Dokumenten und Programmen mit eingebetteten Objekten
erlaubt. Upgrade von Version 6.3(C-API) zu Version 8.0(in C++) war ebenso mit Hilfe der Transformationen
(wie z.B. structur_to_class / create_class / create_factory/ procedur_to_command) simuliert.
Dieses 9-stufige Programm Refactoring wurde mit insgesamt 800 Transformationen durchgeführt.
Dabei wurde 14K Byte Code generiert.
3) Vor- und Nachteile der Design Pattern Transformation Techniken
Zum Schluß wollen wir nun auf die Vor- und Nachteile der PatternsTransformations-Technologie
eingehen und über weitere Einsatzmöglichkeiten sowie Integration mit den anderen Tools diskutieren.
a) Offensichtliche Vorteile:
SW-Entwicklung muß schnell, sicher und kostenminimal abgewickelt werden.Entstehende SW soll wiederverwendbar,
erweiterbar und möglichst platformunabhängig sein.Pattern Transformationen
helfen uns dabei mit einer Reihe von Mechanismen, die Source-Code automatisch transformieren,
ohne dabei die Funktionalität zu verändern (struct_to_class / Factory / Substitute - Transformationen) oder
um die neue gewünschte Funktionalität herzustellen (create_class / Add_variable / Inherit / Singelton).
Mit der Pattern Transformation Technologie haben wir erstmals eine Möglichkeit nicht nur für
Generierung des Programmcodes des Entwurfes, sondern auch von einem existierendem Programm aus.
Wir müssen nur lernen mit diesem mächtigen Werkzeug umzugehen!
b) Zwiespältige Vorteile:
- Automatische Code Formatierung. Dies ist zwar bequem, macht aber Programmcode weniger lesbar
(Man kann jedoch die Formatierung ausschalten)
- Generierung der Kommentare. Einerseits brauchbar, so dass man weiss, was durch welche
Transformation entstanden ist, und andererseits kann sie unter Umständen völlig unbrauchbar sein.
(Man kann diese Option ebenso ausschalten)
c) Objektive Nachteile:
Wie in der Voraussetzung erwähnt worden war, ist Pattern Transformation nicht einsetzbar bei:
- Komplizierten Makros (z.B.: #ifdef, #define makro() F(), #pragma(compiler-abhängig) #Flag )
- Compilerwechsel. Denn das Tool hat Makefiles als Argument um Source-Code zu finden und
Compiler-Flags zu berücksichtigen. Bei Compiler Wechsel sind Makefiles nicht kompatibel.
- Programm Familie: Wenn die Library geändert wird, welche von den anderen Programmen benutzt wird.
- File Access: Alle in die Transformation eingehenden Dateien müssen den Schreibzugriff gewährleisten.
Dies ist in der Realität oft nicht der Fall (Frameworks, System-Hearder)
d) Subjektive Nachteile:
- Programmierer sind Menschen: Alte handgemachte Kommentare werden teilweise unbrauchbar oder
werden gelöscht. Programmierer mögen keine generierten Codeformatierungen oder Kommentare!
- Code Placement: Es muß entschieden werden wohin mit dem generiertem Programmcode.
- Enabling Conditions: Wie sicher ist die Transformation.(Man muß eben genau wissen, was man tut!)
- Granularität der Transformation: Man muß ein gesundes Maß an Granularität finden! Denn
einerseits will man nicht vom Hundertsten ins Tausendste (z.B. jede move_variable zu Basis-Klasse als
eigenständige Transformation) kommen und andererseits will man ja auch die komplizierten Transformationen,
die nicht sicher sind und die keiner nachvollziehen kann, möglichst vermeiden.
4) Zusammenfassung
a) Integration mit anderen Tools und neue Features der SWE:
Pattern Transformation Tools können und werden in die moderne OMT-Tools (wie etwa Rational Rose, STP) integriert,
was nicht nur der Generierung von Source-Code aus UML- Diagrammen dient, sondern
auch der Abbildung der vorhandenen Programme in UML-Darstellung. Beispiele dafür sind:
- Smalltalk Refactoring Browser wurde von Meijers in OMT-Viewer integriert.
- Griswold Transformation Tool für eine Scheme-Umgebung
- CMU- und Demeter- Software für C++ Transformationen
b) Einsatzmöglichkeiten
Man könnte sich einige Gebiete vorstellen, in denen Pattern und Pattern-Transformationen sehr
erfolgreich eingesetzt sein würden. Solche Software weisen bestimmte Eigenschaften auf:
- Permanente Grundfunktionalität (BSP. Framework und Design.Tools),
- Veränderung der Objekt-Attribute bei gleicher Funktionalität
(BSP. Unterhaltung Software: Neue Version der Lora-Game mit neuen Labyrinthen!)
- Automatisierung ( Programme für Fließbänder, neue Produktionshalle usw.)
- Internet-Software und DBMS (Gleiche Grundalgorithmen, Schnittstellen)
Weniger ist diese Technik für die Anwendungen geeignet, die sehr komplizierte Vorgänge abbilden und
mit aufwendigen Benutzerschnittstellen ausgestattet sind, da man insbesondere nicht weis, was alles
von einer Transformation betroffen sein wird und wie sicher die Transformation ist. Beispiele dafür sind
Bank- und Versicherungssoftware, die an eine Datenbank im Hintergrund gebunden sind und dessen
Objekt-Typen von den Datenbank-Objektrepräsentationen abhängig und daher weniger flexibel sind.
Jedoch mit der Entwicklung der Objekt-orientierten Datenbanken ist auch hier der Einsatz der Pattern und
Transformationen eine Frage der Zeit...
Literatur:
Automated Software Evolution via Design Pattern Transformation" von L. Tokuda, D. Batory
Design Patterns: Abstraction and Reuse of Object-Oriented Design" von Erich Gamma
Refactoring Object-Oriented Frameworks" von W.F.Opdyke
Designing reusable Classes" von E. Johnson
Evolving Object-Oriented Software Architectures with Refactorings" von L. Tokuda, D. Batory
Last Modified: 30.12.99
1999 Alexej Kupin. All rights reserved!