Reflexion - Was ist damit möglich?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Reflexion - Was ist damit möglich?

Beitrag von RSE »

Hallo!

In meiner Bachelorarbeit bewerte ich verschiedene Architekturmuster (patterns), eines davon ist Reflexion. Nun bin ich mir momentan offenbar noch nicht ganz klar darüber, was Reflection letzten Endes eigentlich ist. Abstrakt beschrieben:
Es gibt ein Metalevel, welches die Beschreibungen der reflexiven Objekte beinhaltet, und ein Base-Level, welches die Anwendungslogik beinhaltet und sich bei der Benutzung der reflexiven Objekte auf das Metalevel stützt. Das Metalevel bietet weiterhin ein Metaobject Protocol, um die Struktur der reflexiven Objekte zu bearbeiten.
So weit so klar, aber was bedeutet das bei der Umsetzung eigentlich??? Heißt das, man reserviert sich zur Runtime einen Datenblock und lädt da rein die Werte der im Metalevel beschriebenen Member-Variablen der reflexiven Objekte? Sind reflexive Objekte somit nichts weiter als eine wüste Ansammlung von Werten, deren Typen und Adressen im Metaobjekt steht? Wie funktioniert das mit Methoden, oder haben reflexive Objekte keine Methoden?
Ich habe in meiner Arbeit 2 Beispielprojekte. Jedes Muster wird beispielhaft auf eines der beiden Projekte angewandt, um die Bewertung des Musters beispielhaft zu verdeutlichen. Nur bei Reflexion reicht mein Verständnis nicht so weit, um es auf eines meiner Beispielprojekte anzuwenden. Ich hoffe es kann mir einer weiterhelfen...

Edit: Die Beispiele sollen nicht speziell in Pascal ausformuliert werden, sondern ganz allgemein beschrieben sein, aber Pascal ist nun mal die Programmiersprache die ich kenne, im Gegensatz zu C++ o.ä. und von daher mir am leichtesten Verständlich ;-) Ihr dürft mir gern auch Grenzen von FPC aufzeigen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Reflexion - Was ist damit möglich?

Beitrag von theo »

Naja, in Delphi ist das wohl am ehesten als RTTI umgesetzt.
http://www.blong.com/Conferences/BorCon ... /CB140.htm" onclick="window.open(this.href);return false;
http://robstechcorner.blogspot.com/2009 ... r-run.html" onclick="window.open(this.href);return false;

Mit Theorie kann ich dir da aber auch nicht weiter aushelfen.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reflexion - Was ist damit möglich?

Beitrag von RSE »

Also was in deinem ersten Link steht ist mir nicht neu und ich gebe zu, dass ich nicht alle von Robs Abhandlungen (2. Link) gelesen habe, aber die ganze RTTI ist doch nur eine Hilfe, um Reflexion umzusetzen und trifft so nicht wirklich den Kern meiner Frage. Die RTTI liefert, wenn ich das richtig verstanden habe, Informationen über vorhandene Elemente von Klassen (Membervariablen und -Methoden). Sie kann also als Informationsquelle für das Metalevel dienen. Aber wenn ich das richtig verstanden habe, dann kann man mit Reflexion die STRUKTUR einer Software ändern, und das bedeutet für mich MANIPULATION der Objekte, hinzufügen neuer Membervariablen und sowas, wie das auch immer funktionieren soll. Habe ich das komplett falsch verstanden und Reflexion ermöglicht wirklich nur, Werte von erst zur Laufzeit ermittelten Membervariablen zu verändern? Das erscheint mir wesentlich weniger revolutionär, als Reflexion immer dargestellt wird - zumindest kommt es mir so vor.

Liege ich vollkommen falsch?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Reflexion - Was ist damit möglich?

Beitrag von theo »

Naja Reflection gibt's wohl auf verschiedenen Ebenen, bei Maschinencode angefangen:
http://de.wikipedia.org/wiki/Reflexion_(Programmierung)

P.S. vllt. fragst du besser mal in der FPC Mailing List. Die sind da eher so theoretisch/akademisch drauf ;-)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reflexion - Was ist damit möglich?

Beitrag von RSE »

Den Wiki-Artikel kannte ich zwar schon, aber jetzt ist mir der Link auf http://www.petendi.de/seminare/reflection/ nochmal besonders ins Auge gestoßen und in der Präsentation auf Seite 8 sind die verschiedenen Arten von Reflexion mal schön dargestellt. Demnach ist Reflexion nicht zwangsweise immer eine strukturelle Reflexion ;-). Auch das Ändern von Werten gilt schon als Reflexion.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

mannewolff
Beiträge: 10
Registriert: Mi 6. Jan 2010, 17:25
OS, Lazarus, FPC: L 0.9.28.2 FPC 2.2.4
CPU-Target: 32Bit
Wohnort: Bremen

Re: Reflexion - Was ist damit möglich?

Beitrag von mannewolff »

Delphi/ObjectPascal kennen nicht - wie z.B. Java - Reflection also ein Metamodell von Objekten, mit Hilfe derer Manipulationen möglich sind.

Also in Java ist es z.B. möglich die Klasse TMeinObjekt zu instanziieren über:

TMeinObjekt obj = Class.forName("TMeinObjekt").newInstance();
statt
TMeinObjekt obj = new TMeinObjekt();

In der ersten Version wird über das Metamodell eine Klasse mit dem Namen (also einer Zeichenkette) TMeinObjekt gesucht und eine Instanz dieser Klasse zurückgegen. Genau so ist es möglich Methoden zur Laufzeit über das Metamodell aufzurufen. Wo braucht man das. Wenn man z.B. dynamisch Objekte laden und manipulieren will ohne den genauen Typ zu kennen.

Von hinten durch die Brust ins Auge geht das auch mit ObjectPascal. Wenn ein Objekt von TPersistence erbt und über

RegisterClass(TMeinObjekt );

registriert wurde, dann kann das Objekt auch über eine Typ-Referenz geladen werden.

Code: Alles auswählen

TCommand = class(TPersistent)
  public
    function execute(AContext: TContext) : boolean; virtual;
  end;
  TCommandClass = class of TCommand;
  ..
 
  TMeinObjekt = class(TCommand)
  ....
  end;
 
var
  bezeichner : String;
  tc              : TCommandClass;
  ...
  bezeichner := 'TMeinObjekt';
  tc := TCommandClass (FindClass(bezeichner));
  command := TCommand(tc.newinstance);
Ich brauche das z.B. um Regelketten über Dateien zu komponieren um sie dann zur Laufzeit auzurufen.

Mal als Beispiel: http://pointers.de/cor.html

Antworten