Softwaretechnik
Download
Report
Transcript Softwaretechnik
Metamodell, Reflection
in objektorientierten
Sprachen
Probevorlesung
Friedrich Steimann
Softwaretechnik
Voraussetzungen
Grundbegriffe der Objektorientierung
grundlegende Notationselemente der UML
Klasse, Beziehung, Subklasse, Verhalten etc.
Klassendiagramm
Grundlegende Programmierkenntnisse in
Java
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Metamodell,
Reflection in
objektorientierten
Sprachen
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Kontext: letzte Vorlesung
Durchgängigkeit der Objektorientierung
annähernd gleiche Konzepte in Analyse,
Design (Modell) und Implementierung
Modell
Programm
Klasse
Klasse
Attribut
Instanzvariable (Feld)
Beziehung
Instanzvariable (Feld)
Array, Collection
Verhalten
Methode
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Modell (Beispiel)
Universität
Student
belegt
Modul
Teil
bietet an
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Dozent
Softwaretechnik
Wechsel des Gegenstandsbereichs
Notation der Modelle bleibt gleich
andere Notation denkbar, ändert nichts an
der Bedeutung
wie sich auch Notation von Modellierung und
Implementierung unterscheiden
Sprachkonstrukte der
Modellierungssprache vom
Gegenstandsbereich unabhängig
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Modell (anderes Beispiel)
TheaterMaxx
Stück
Akt
Szene
Absatz
Regieanweisung
Darsteller
besetzt
Rolle
gehört zu
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Text
Softwaretechnik
Wechsel der Ebene
Modelle können selbst Gegenstand der
Modellierung sein!
Programme können selbst Gegenstand der
Programmierung sein!
Modellierung der Modellierung unter
Verwendung derselben Sprachkonstrukte
Programmierung der Programmierung unter
Verwendung derselben Sprachkonstrukte
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Modell der objektorientierten
Modellierung (Metamodell)
Vererbung
Beziehung
Klasse
Verhalten
abstrakte Klasse
konkrete Klasse
unendlicher
Regress!
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Metaprogramme
Programme, die Programme als Einund/oder Ausgabe haben
Compiler/Interpreter
Refactoring-Werkzeuge
Programme, die sich selbst als Einund/oder Ausgabe haben (Reflektion)
„selbstbewußter“ Code
selbstmodifizierender Code
Metaprogrammierung
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Stufen der Metaprogrammierung
Typ-Introspektion
allgemeine Introspektion
Java (häufig Reflektion genannt)
Interzession oder Interzeption
C++ mit RTTI
Lisp MOP, AspectJ
(volle) Reflektion
Maschinencode (!), Lisp, Prolog, Smalltalk
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Javas Reflection-API
Klasse
Object
Class
Constructor
Field
Method
Modifier
Array
Beschreibung
Methode getClass()
Instanzen repräsentieren Klassen und
Interfaces
Aufruf von Konstruktoren variablen Typs
Information über und Zugriff auf Felder
variabler Typen
Information über und Aufruf von
Methoden variabler Typen
Information über Access Modifier von
Typen und deren Membern
Erzeugung von und Zugriff auf Arrays
variablen Typs
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Beispiel reflektive Programmierung
Absatz absatz = …;
if (absatz instanceof Regieanweisung) …
… (Regieanweisung) absatz …
Typ-Introspektion
public class Object {
public final Class getClass() …
}
public final class Class extends Object …
Constructor[] getConstructors() …
Fields[] getFields() …
allg. Introspektion
Method[] getMethods() …
}
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Weitere einfache Beispiele
…
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Beispiel Serialisierung
class C {
int a = 1;
String b = "abc";
D d = new D();
void serializeOn(PrintStream aStream) {
aStream.println("a");
aStream.println(a);
aStream.println("b");
aStream.println(b);
aStream.println("d");
d.serializeOn(aStream);
}
}
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Reflektive Serialisierung
void serializeOn(PrintStream aStream) {
Class myClass = getClass();
Field[] myFields = myClass.getFields();
for (Field field : myFields) {
aStream.println(field.getName());
try {
Object value = field.get(this);
if (field.getType().isPrimitive() ||
value == null)
aStream.println(value);
else
value.printFieldsOn(aStream);
} catch (Exception e) {…}
}
}
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Weitere Beispiele
…
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Einsatzmöglichkeiten der
Metaprogrammierung
Tracing, Logging, Security etc.
Spracherweiterungen/-anpassungen
Optimierung von Code
dynamisch konfigurierte Systeme („very
late binding“), z. B. Web Services
genetische Programmierung
Künstliche Intelligenz
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Bewertung der
Metaprogrammierung
Vorteile:
Ergänzung von Funktionalität zur Laufzeit
kompaktere Programme
Nachteile:
schwer lesbar
keine Übersetzungszeit, keine Fehlerprüfung
Fazit:
nur sehr kontrolliert einsetzen!
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“
Softwaretechnik
Literatur
Abelson & Sussman Structure and Interpretation of
Computer Programs Chapter 4: „Metalinguistic
Abstraction“ (http://mitpress.mit.edu/sicp/)
Krüger, Stark Handbuch der Java-Programmierung
Kapitel 43 und 44 (www.javabuch.de)
historische Grundlagen
Whitehead und Russel Principia Mathematica Vorwort
und Einleitungen (1910)
Tarski „The semantic conception of truth“ Philosophy and
Phenomenological Research 4 (1944)
F Steimann „Metamodell, Reflection in objektorientierten Sprachen“