ObjectEx

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Thunder

Betreff: ObjectEx

BeitragSa, Feb 15, 2014 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Function CopyObject:Object(inst:Object)
Function CopyObjectTree:Object(inst:Object)


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)
Type ObjectEx

Field class:Int Ptr
Field ident:TMap
Field instances:TMap
Field name:String
Field size:Int

Method Add:Int(a:String, b:Object, c:Int)
Method Constants:ObjectExIdent[]()
Method Delete:Int()
Method Fields:ObjectExIdent[]()
Method Functions:ObjectExIdent[]()
Method Get:Int(a:Object, b:String)
Method GetConstValue:String(a:Object, b:String)
Method GetDouble:Double(a:Object, b:String)
Method GetFloat:Float(a:Object, b:String)
Method GetLong:Long(a:Object, b:String)
Method Identifier:ObjectExIdent(a:String)
Method Methods:ObjectExIdent[]()
Method New:Int()
Method Obj:Object(a:String)
Method Objs:Object[]()
Method Remove:Int(a:String)
Method Set:Int(a:Object, b:String, c:Int)
Method SetDouble:Int(a:Object, b:String, c:Double)
Method SetFloat:Int(a:Object, b:String, c:Float)
Method SetLong:Int(a:Object, b:String, c:Long)
Method SuperObjectEx:ObjectEx()
Method new_ident:Int(a:Int, b:String, c:String, d:Int)

Function Create:ObjectEx(a:Object)
EndType


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
Framework brl.standardio
Import Thunder.ObjectEx

Type T
Global oex:ObjectEx = ObjectEx.Create(New T)

Field a:Int, b:Int
EndType

Local instance:T = New T

T.oex.set instance, "a", 42
T.oex.set instance, "b", 1337

Print instance.a
Print instance.b


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

BeitragSa, Feb 15, 2014 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Feb 15, 2014 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Lustig das -ich hatte es zwischenzeitlich mit Chaos.Clone selbst gelöst (solte per Suche zu finden sein Smile)
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

BeitragSo, Feb 16, 2014 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Oje. Das hab ich nicht gewusst. Ich hoffe, das geht hier nicht auf Kosten deiner Einnahmen Smile
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

BeitragSo, Feb 16, 2014 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 16, 2014 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragSo, Feb 16, 2014 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group