Reflection



  • tfa schrieb:

    Reflection beschreibt die Technik in einer (meist objektorientierten) Programmiersprache, Informationen über die Struktur des Programmes herauszufinden und zu modifizieren.
    Wenn z.B. ein Grafiktreiber eine Schnittstelle zum Auslesen der unterstützten Funktionen anbietet oder ein Shell-Programm auf Wunsch eine Bedienungsanleitung ausspuckt, hat das mit Reflection nichts zu tun.

    Typische Java Definition.

    Die Leute sehen immer nur die Implementierung und vergessen dass es beim Programmieren um Konzepte geht. Implementierungen sind irrelevant.

    Reflection bedeutet:
    ich habe eine Blackbox und will Metainformationen bekommen. Reflection ist nun der Name für das Konzept mit dem ich an die Daten rankomme.

    zB ist Java Reflection kein bisschen anders als --help als cl-argument. Denn auch bei Java Reflection ist ein getMethods() nichts anderes als ein --help. Sowohl die --help Message als auch die Liste der Methoden wurden beim Kompilieren automatisch erstellt.



  • Die "Java-Definition" scheint mir deutlich näher am allgemeinen Verständnis zu liegen, als die "shade of mine"-Definition.
    Ich geb zu, ich bin nicht all zu sehr "C++-verwurzelt", vielleicht würde ich die Definition dann auch stark erweitern, damit es passt.
    Wie auch immer, wenn du dich morgens beim Rasieren im Spiegel betrachtest, ist das schließlich auch Reflection 🤡



  • Ich gebe hier mal mein Verständnis von Reflektion wieder:

    Reflektion ist die Möglichkeit dynamisch zur Laufzeit Informationen über eine Komponente/DLL/Datentyp/Funktion... zu bekommen, und diese Ansprechen zu können. Dies umfasst auch die Möglichkeit eine Funktion mit einer vorher nicht bekannten Anzahl an Parametern ansprechen zu können.

    In Sprachen die Reflektion direkt unterstützen ist das oben genannte in der Regel ohne Mehraufwand möglich. In Sprachen die es nicht direkt unterstützen kann man es meist mehr oder weniger Simulieren (wobei man dann schon Aussagen zu einer Schnittstelle machen muß, z.B. das eine DLL immer eine bestimmte Funktion die nähere Informationen liefert, mitbringen muss).

    Ich wüßte aber nicht wie man z.B. unter C++ portabel eine erst zur Laufzeit bekannte Parameterliste füllen kann (Was z.B. unter C# geht)...

    cu André



  • asc schrieb:

    Ich wüßte aber nicht wie man z.B. unter C++ portabel eine erst zur Laufzeit bekannte Parameterliste füllen kann

    Na, mit einer Schlüssel-Wert-Zuordnung (oder, noch vereinfachter, einer geordneten Argumentmenge). Klar, ein wenig aufbohren müsste man da schon:

    class MethodInterface {
        virtual base* invoke() = 0;
        virtual size_t argument_count() const;
        virtual void bind_argument(string const& id, base* value);
        virtual ~MethodInterface() = 0;
    };
    
    MethodInterface::~MethodInterface() { }
    

    Dafür könnte man sich sogar nen Helper schreiben, der sowas zuließe:

    dynamic_invoke("method_name", arg("foo", foo), arg("bar", bar));
    

    /EDIT: Typo.



  • @Shadow Of Mine: Klar, deine Argumentation macht Sinn. Dummerweise kann ich fast jede Tätigkeit unter einem bestimmten Begriff zusammenfassen, wenn ich die Definition abstrakt genug betrachte.

    Wenn ein Hilfeparameter einer Konsolenanwendung Reflection bedeutet, dann ist das Starten eines Spiels unter Windows auch die Instanziierung eines Objektes. Und die Sekretärin implementiert abstrakte Klassen, weil sie ausgedruckte Formulare kopiert und sie mit unterschiedlichen Daten füllt.

    Jeder zweite Deutsche kann programmieren - ja, nämlich den Videorecorder und den Wecker. Damit ist er aber noch lange kein Programmierer.

    Letztendlich ist die Reflection im Sinne der Softwareentwicklung gemeint. Und hier handelt es sich um eine Methode, um zur Laufzeit Objektdetails wie Methoden und Attribute in Erfahrung zu bringen.



  • mit dieser definition wirst du dich nicht wirklich vom anfangs erwähnten grafikkarten-beispiel abgrenzen können.



  • Na und, nur weil irgendein Treiber irgendetwas ausliest, nennt man das Reflection? Als abstrakte Begriffe lasse ich mir z.B. "auslesen" gefallen. Aber Reflection beschreibt meiner Ansicht nach ein konkretes Programmierwerkzeug.

    http://de.wikipedia.org/wiki/Reflection_(Programmierung)

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.



  • dann ist jeder getter Reflection



  • Konrad Rudolph schrieb:

    da du nichtmal merkst dass […] die praezisierung drunter stand.

    Darunter stand etwas vollkommen zusammenhangloses: Das, was Du da beschreibst mag ja alles Reflexion sein, habe ich auch nie angezweifelt. Deine Beispiele, zumindest aber das mit dem Notruf, hingegen beschreiben ganz allgemeine Kommunikationsprotokolle, das ist eine vollkommen andere Abstraktionsebene. Dass dieses Frage-Antwort-Spiel für Reflexion benutzt werden kann, stand nie zur Debatte. Und der Gebrauch des Wortes „reflektiert“ in Deinem Beispiel suggeriert einfach eine falsche Bedeutung („to reflect“ hat mehrere Übersetzungen und die von Dir benutzte ist hier die falsche). Mehr wollte ich gar nicht sagen.

    Du kannst ohne kommunikation keine reflection haben. du versuchst hier ein Pattern auf zwang mit einer implementierung zu koppeln. wie bloedsinnig waere es zu behaupten dass du in assembler keine linked list hast, nur weil da keine STL existiert und ein pointerdatentyp schon garnicht, also ist das nicht moeglich?
    Ein pattern ist unabhaengig von der implementierung. Ich kann durch 1000 dateien auf meiner festplatte gehen und auf vielerlei wegen herausfinden was es fuer dateien sind. das ist reflektion, dafuer muss ich nicht irgendwelchen attributen strings zuordnen, ich kann dir das bild einfach anzeigen wenn ich reflektieren kann welcher typ es ist und ich sein format kenne.
    schau dir einfach mal RTTI bei c++ an, das hat garkeine strings usw. um typeninformationen zu entnehmen

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.
    Der threadstarter hat keinesfalls gefragt, was java und reflektion auf sich hat, sondern nur was reflektion ist und mehr als informationen aus einer blackbox zu entnehmen ist es nicht. WIE du das machst, ist auf 1000 weisen loesbar und garnicht gegenstand der frage, und schon garnicht die klaerung was die einzig moegliche implementierung sein kann.
    ansonsten kann ich sicher anfangen zu quieken, dass RTTI alles noetige hat, oder reflektionwuensche aeussern, die auch Java nicht erfuellt.



  • superallgemeiner schrieb:

    dann ist jeder getter Reflection

    Solange es zur Laufzeit evaluiert wird, ja! Wenn es nur ein Zugriff auf einen Speicherbereich ist, nein!



  • reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Eine Klasse ist auch ein abstrakter Begriff, und hängt nicht von der Implementierung ab, wie man sie in C++ und Java vorfindet. Ich kann Klassen somit auch in QBASIC programmieren. Schließlich sind Klassen ja nur ein Konzept, und die Implementierung ist nur ein Detail, das im "Konzept" nicht weiter interessiert.

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.



  • LOLAlter schrieb:

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.

    Es wurde schon hunderttausendmal gesagt, nun nochmal: Eine Sprache kann nicht OOP sein, sie kann nur OOP besonders gut oder auch nicht unterstützen.



  • rapso schrieb:

    Du kannst ohne kommunikation keine reflection haben.

    Ja und? Ohne Kommunikation kannst Du auch tausend andere Sachen nicht haben. Du hast trotzdem nur ein Beispiel für Kommunikation gebracht und nicht für Reflexion.

    Ein pattern ist unabhaengig von der implementierung. […] schau dir einfach mal RTTI bei c++ an, das hat garkeine strings usw. um typeninformationen zu entnehmen

    Wie oft denn noch? Das ist mir klar! Es ging mir lediglich um Dein Beispiel. Ich habe auch nie irgendwas von Strings oder anderen speziellen Techniken erzählt (mal davon abgesehen, dass es sehr wohl C++-Implementierungen gibt/gab, die Stringvergleiche der Typennamen für RTTI verwendet haben).

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    Bring nicht meine Kritik mit der Kritik anderer Leute durcheinander. Ich habe nie etwas gegen die Grafikkartentreiber gesagt.

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Du verwendest immer noch die falsche Übersetzung, auch wenn sie schon besser geworden ist.



  • LOLAlter schrieb:

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Eine Klasse ist auch ein abstrakter Begriff, und hängt nicht von der Implementierung ab, wie man sie in C++ und Java vorfindet. Ich kann Klassen somit auch in QBASIC programmieren. Schließlich sind Klassen ja nur ein Konzept, und die Implementierung ist nur ein Detail, das im "Konzept" nicht weiter interessiert.

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.

    Da sieht man es dass du es verstanden hast, mit gutem beispiel 👍
    das Klassenkonzept und eine sprache haben keinen zwanghaften zusammenhang, da hast du recht. man kann in allerlei sprachen objektorientiert programmieren. eine sprache die sowas von sich aus als grundlage anbieten ist ein nettes helferlein, aber keine grundlage der definition von objektorientiert.

    sagt ja auch niemand (mehr) dass z.b. java keine objektorientierte sprache ist nur weil sie keine moeglichkeit zur multiplen vererbung bietet.

    es ist nur zum eigenen vorteil, wenn man lernt werkzeuge und verfahren voneinander zu trennen.



  • Konrad Rudolph schrieb:

    rapso schrieb:

    Du kannst ohne kommunikation keine reflection haben.

    Ja und? Ohne Kommunikation kannst Du auch tausend andere Sachen nicht haben. Du hast trotzdem nur ein Beispiel für Kommunikation gebracht und nicht für Reflexion.

    andere haben verstanden dass die kommunikation das medium der reflektion war. du nicht. q.e.d.

    Ein pattern ist unabhaengig von der implementierung. […] schau dir einfach mal RTTI bei c++ an, das hat garkeine strings usw. um typeninformationen zu entnehmen

    Wie oft denn noch? Das ist mir klar! Es ging mir lediglich um Dein Beispiel. Ich habe auch nie irgendwas von Strings oder anderen speziellen Techniken erzählt (mal davon abgesehen, dass es sehr wohl C++-Implementierungen gibt/gab, die Stringvergleiche der Typennamen für RTTI verwendet haben).

    wenn du also zwei objekte mittels cobra kommunizieren laesst. ist keine reflektion moeglich, weil schon (tcp)kommunikation von statten geht?

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    Bring nicht meine Kritik mit der Kritik anderer Leute durcheinander. Ich habe nie etwas gegen die Grafikkartentreiber gesagt.

    obwohl ueber das treiberprotokoll eine kommunikation stattfindet?

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Du verwendest immer noch die falsche Übersetzung, auch wenn sie schon besser geworden ist.

    da meine aussage gleich bleibt, entnehme ich daraus, dass du dich dem verstaendniss naeherst. weiter so 👍



  • Bei Interesse lohnt auch ein Blick auf Wikipedia, allerdings wird die Definition dort wohl nicht allen gefallen...



  • Wie auch immer es gewendet wird, der Begriff Reflection kam mit den Programmiersprachen auf, die Zugriff auf Klassenmerkmale zur Laufzeit erlauben, und bezeichnet eben genau dieses _Werkzeug_*, siehe Wikipedia.

    Dass gerade eine Community, welche sich mit einer Sprache befasst die eben nicht eine Reflection in diesem Sinne bietet versucht, den Begriff abstrakter zu sehen, ist verständlich. Genauso wie die Basic-Fraktion immer davon redet, dass objektorientierte Programmierung eine Philosophie ist und deshalb mit der Unterstützung innerhalb einer Sprache nichts zu tun hat.

    Selbst wenn einige es als richtig erachten, die Reflection ein wenig weitläufiger zu definieren, so ist es doch zumindest sehr offensichtlich, dass der Threadersteller eben das konkrete Werkzeug* gemeint hat, wie es in Wikipedia beschrieben ist.

    -------------------------------
    *Werkzeug nicht im Sinne einer Programmiersprache, sondern einer Grundfunktionalität bei der Programmierung, wie beispielsweise Arrays.



  • Das ist garnicht so sehr der zentrale Punkt. Wichtig ist vor allem, dass Reflection (zu deutsch Reflexion, nicht Wiedergabe) es dem Programm ermöglicht die *eigene* Struktur zu betrachten und zu modifizieren. Genau deswegen ist ein Listing der möglichen Parameter auch keine Reflection, weil nämlich der Benutzer hier die Information bekommt und nicht das Programm. Genauso verhält es sich auch mit der Abfrage der möglichen Bildschirmauflösungen. Hier werden Hardware-Eigenschaften abgefragt und wiederum nicht die Struktur des Programms. Daher handelt es sich dabei nicht um Reflection.



  • rapso schrieb:

    Konrad Rudolph schrieb:

    rapso schrieb:

    Du kannst ohne kommunikation keine reflection haben.

    Ja und? Ohne Kommunikation kannst Du auch tausend andere Sachen nicht haben. Du hast trotzdem nur ein Beispiel für Kommunikation gebracht und nicht für Reflexion.

    andere haben verstanden dass die kommunikation das medium der reflektion war. du nicht. q.e.d.

    Werd nicht albern und liefer lieber Argumente, bzw. geh konstruktiv auf meine ein, statt meine Aussagen zu ignorieren und irgend etwas ganz anderes darauf zu schreiben.

    Wie oft denn noch? Das ist mir klar! Es ging mir lediglich um Dein Beispiel. Ich habe auch nie irgendwas von Strings oder anderen speziellen Techniken erzählt (mal davon abgesehen, dass es sehr wohl C++-Implementierungen gibt/gab, die Stringvergleiche der Typennamen für RTTI verwendet haben).

    wenn du also zwei objekte mittels cobra kommunizieren laesst. ist keine reflektion moeglich, weil schon (tcp)kommunikation von statten geht?

    Wo ist denn da der Zusammenhang? Bitte setz Dich mal mit Aussagenlogik und speziell Negation auseinander, denn Du verdrehst mir einfach die Worte im Mund! Ich habe NIE behauptet, dass Kommunikation nicht Bestandteil von Reflektion ist. Im *Gegenteil*, ich habe mehrmals darauf hingewiesen, dass ich diesen Fakt explizit anerkenne.

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    Bring nicht meine Kritik mit der Kritik anderer Leute durcheinander. Ich habe nie etwas gegen die Grafikkartentreiber gesagt.

    obwohl ueber das treiberprotokoll eine kommunikation stattfindet?

    Dito. Schon wieder derselbe Mist. Die „Reflexion“ zwischen uns läuft offensichtlich nicht besonders gut.

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Du verwendest immer noch die falsche Übersetzung, auch wenn sie schon besser geworden ist.

    da meine aussage gleich bleibt, entnehme ich daraus, dass du dich dem verstaendniss naeherst. weiter so 👍

    Quatsch. Vielleicht meintest Du das gleiche, Du hast aber etwas anderes gesagt. Das solltest Du unterscheiden, das ging offensichtlich auch schon bei Deinem Beispiel schief, und daher die ganze Diskussion.

    Jester hat es auf den Punkt gebracht: „to reflect“ bedeutet, über *sich selbst* nachzudenken. Reflexion ist daher ursprünglich das Konzept, die *eigene* Struktur zu kennen und manipulieren zu können.



  • Jester schrieb:

    Das ist garnicht so sehr der zentrale Punkt. Wichtig ist vor allem, dass Reflection (zu deutsch Reflexion, nicht Wiedergabe) es dem Programm ermöglicht die *eigene* Struktur zu betrachten und zu modifizieren. Genau deswegen ist ein Listing der möglichen Parameter auch keine Reflection, weil nämlich der Benutzer hier die Information bekommt und nicht das Programm. Genauso verhält es sich auch mit der Abfrage der möglichen Bildschirmauflösungen. Hier werden Hardware-Eigenschaften abgefragt und wiederum nicht die Struktur des Programms. Daher handelt es sich dabei nicht um Reflection.

    Wie definierst du Programm?

    Ist eine Klasse die ich extern Lade Teil des Programmes aber ein Grafiktreiber nicht? Wo trennt man da? Was ist mit einem DatenBank Treiber? Wenn ich Information über eine blackbox bekomme, so ist das reflection.

    wie sieht es in java zB aus? da hat jede klasse eine liste an methoden die sie mir liefert wenn ich sie frage. genau wie ein display treiber mir eine liste der möglichen auflösungen. wobei bei beiden systemen vorkompiliert die liste im ram liegt.

    reflection bietet mir ja keine dynamischen informationen. sie bietet mir statische information über dynamische objekte.


Anmelden zum Antworten