ObjectEx
Übersicht

![]() |
ThunderBetreff: ObjectEx |
![]() Antworten mit Zitat ![]() |
---|---|---|
Liebe BlitzMax-User,
ich präsentiere euch das neuste vom Neusten: Das ObjectEx-Modul! Es ist erst WiP und ich würde es auch noch nicht posten, wenn ich nicht Feedback bräuchte und zwar von Leuten, die sich vorstellen könnten, dass es nützlich wäre oder dass sie es Mal benutzen würden. Ich brauche Feedback zum Design des Moduls, was man besser machen könnte usw. und ob es überhaupt nützlich ist. Alles hat damit begonnen, dass ich BladeRunners Beitrag im Thema "Vorschläge & Co für BlitzMax" gelesen habe, wo er sich einen Operator wünscht, der eine Kopie von einer Typeinstanz anlegt. Und ich dachte mir, es muss möglich sein, so eine Funktion zu schreiben. Tatsächlich. Und ich habe auch eine zweite Funktion geschrieben, die es schon relativ gut hinbekommt, jede Referenz in dieser bestimmten Instanz auch zu kopieren und den Referenzen zu folgen. Arrays sind noch nicht wissentlich supportet. BlitzMax: [AUSKLAPPEN] 'Deklarationen CopyObjectTree war nur möglich, da BlitzMax die Debuginformation zu allen Types auch im Release-Modus speichert und dass ich an die rangekommen bin. Also dachte ich mir, es könnte nützlich sein, diese Information einzulesen. Daraus entstand der neue Type ObjectEx es speichert die Debuginformation (Name, Typ, Offset von Fields, Konstanten, Methods und Functions eines Types) und kann dann damit arbeiten: BlitzMax: [AUSKLAPPEN] ' Deklarationen (generiert mithilfe von ObjectEx) Man übergibt ObjectEx.Create eine Instanz irgendeines Types und es parst die Informationen, die es zu dem Type finden kann und speichert sie. Die Instanz wird aber nicht im ObjectEx gespeichert, denn ObjectEx ist dafür da, auf alle Instanzen eines gewissen Types zugreifen zu können. So ist es auch möglich auf Instanzvariablen eines Types per String und zugehöriger ObjectEx zuzugreifen: BlitzMax: [AUSKLAPPEN] Strict Das dürfte dank TMap auch relativ schnell sein. Meine Frage dazu ist an Leute gerichtet, die sich mit Reflection auskennen. Ich weiß, dass Reflection ähnliche Features hat und ich wollte wissen, ob soetwas trotzdem interessant sein könnte oder nicht. Außerdem kann man sich alle Fields, alle Methods, alle Functions und alle Konstanten liefern lassen und ihre Typen anschauen. Konstanten lassen sich zusätzlich auslesen. Und Fields kann man schreiben und lesen. Was ich noch plane, wäre Functions und Methods per String aufrufen zu können. Weiß aber nicht, ob ich das hinkriege und wie gesagt weiß ich nicht, ob das sinnvoll ist. Außerdem habe ich in ObjectEx schon eine weitere Map eingebaut, die als Liste fungieren könnte. Weiß auch nicht, ob das gewünscht ist. So könnte man Referenzen auf Objekte in der ObjectEx speichern und per String sowohl auf die Objekte als auch auf ihre Instanzvariablen zugreifen. Würde mich über Rückmeldungen freuen. Hier das aktuelle Modul: https://www.blitzforum.de/upload/file.php?id=12699 Hier ein paar Beispieldateien: https://www.blitzforum.de/upload/file.php?id=12700 Das Modul ist leider in meinen Augen etwas unübersichtlich und schwer verständlich. Ich habe versucht, es so gut wie möglich zu dokumentieren. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessante Sache. Ich werde mit den Reflections leider nicht viel beisteuern können.
Verstehe ich das richtig: CopyObject ist eine shallow copy (Objekt wird kopiert, alle Referenzen bleiben aber gleich) während CopyObjectTree eine deep copy (Objekt wird kopiert, jede Referenz wird auch kopiert) ist? |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lustig das -ich hatte es zwischenzeitlich mit Chaos.Clone selbst gelöst (solte per Suche zu finden sein ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oje. Das hab ich nicht gewusst. Ich hoffe, das geht hier nicht auf Kosten deiner Einnahmen ![]() Omg, habe gerade in deinem Beispielcode die geschweiften Klammern mit {clone} und {noclone} gesehen. Sieht interessant aus! @DAK: Ja, das hast du richtig verstanden. Es wird sogar in den referenzierten Objekten nach Referenzen gesucht und in denen auch usw. Es gibt da kein Verschachtelungslimit (könnte man einbauen), aber er schaut drauf, dass er referenzierte Objekte, die er schon einmal kopiert hat, nicht nochmal kopiert. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noch eine Frage: Wie löst du das mit zyklischen Referenzen? Also A hat ein Feld, das auf B verweist und umgekehrt. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, dass du fragst! Eigentlich beschäftigt sich Beispiel test5.bmx mit dieser Problematik, aber da (hab ich gerade gesehen) ist ein Denkfehler drinnen - also dieses Beispiel ignorieren.
Ich bin mir nicht sicher, ob ich bei der Sache jeden Fall bedacht habe, aber dein einfaches Beispiel wird momentan wirklich vorbildlich gelöst. Nämlich beides wird kopiert (jeweils nur einmal) und die Referenzen zeigen aufeinander. CopyObjectTree arbeitet rekursiv und übergibt an die nächste Instanz von sich selbst eine Liste von all den Referenzen, die schon kopiert worden sind. Wenn jetzt die nächste Instanz eine Referenz findet, schaut sie zuerst in der Liste nach, ob diese schon kopiert wurde. Wenn ja, dann setzt es einfach die zugehörige neue Referenz ein. Wenn nein, kopiert es das betreffende Objekt mit CopyObjectTree. Das dürfte sicherstellen, dass jedes Objekt nur einmal kopiert wird, und dass die gewünschte Struktur beibehalten wird (hoffe ich Mal). Arrays habe ich übrigens gerade probiert - die gehen noch nicht. Kommt aber in der nächsten Version. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Thunder, np. Anzahl der Spenden bei - über sämtliche Quellen verteilt- ca. 1000 Downloads ist: null.
Ich hatte aber nie wirklich geglaubt dass da wer was spendet. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group