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“