Einzelnen Beitrag anzeigen

Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Ausgedachtes System scheitert an Referenzzählen / Sichtbarkeiten

  Alt 29. Mär 2019, 10:40
irgendwie fällt mir keine aussagekräftige Überschrift ein .Ich habe mir was ausgedacht und habe Probleme bei der Umsetzung.

Angenommen ich habe eine Klasse für Personen. Diese Klasse besitzt ein "Personenlager" vom Typen TObjectDictionary. Wenn ich jetzt eine Person aufrufen will, rufe ich die Klassenfunktion "getPersonByID" auf. Diese Funktion schaut erst im Lager, ob es das Personenobjekt bereits gibt. Wenn nicht wird es erzeugt und eingelagert. Anschließend wird die Referenz des Objektes rausgegeben.

Das mache ich aus 3 Gründen. Erstens ist es irgendwie Speichersparender, zweitens kann ich dann mit Hilfe der Connektoren, die ich im nächsten Absatz erkläre alle Edits synchronisieren und drittens reduziere ich so die Datenbankzugriffe um die Performance zu erhöhen.

Statt Strings verwende ich in dem Objekt Connektoren, die zum einen den String enthalten, aber bei denen man auch meine selbst entwickelten Edits registrieren kann, die mit dem String verknüpft werden sollen. Beispielsweise Name. Wenn ich jetzt ein Edit im Connector registriere, wird ein TNotifyEvent des Connectors an das Edit übergeben. Wenn sich nun das Edit ändert, wird auch der String verändert und dadurch auch der Inhalt aller anderen registrierten Edits. Außerdem signalisiert der Connector eine Wertänderung und kann sowohl den alten als auch den neuen Wert ausgeben.

Jetzt habe ich ein Problem mit der Freigabe der Objekte. Die Person soll aus dem Lager geworfen und freigegeben werden, wenn sie sonst nirgends mehr verknüpft ist. je nachdem wie oft ich die Person irgendwo hinterlegt habe, als Parameter übergebe oder in Funktionsvariablen nutze, kann ich irgendwann überhaupt nicht mehr feststellen, wie viele Referenzen denn nun irgendwo rumschwirren. Somit kann ich niemals gefahrlos die Person freigeben.

Um das zu verhindern habe ich ein Interface erstellt, dass alle Funktionen und Properties enthält, die das Personenobjekt nach außen anbieten muss. Das Personenobjekt habe ich von TInterfacedObject abgeletet statt von TObject und zusätzlich halt von diesem Interface. Jetzt erstelle ich das Objekt und caste es in das Interface und ab da funktioniert das Referencecounting. Die IDee ist, dass ich dann nur noch mit Interfaces arbeite statt Objekten. Somit ist mein Problem gelöst, aber es treten neue auf. Erstens muss ich jede Funktion doppelt deklarieren (Im Interface und im Objekt) und zweitens müssen die ganzen Getter und Setter für die Properties auch im Interface angegeben werden. Diese sind im Objekt private aber nach dem Casten zum Interface kann ich diese nutzen als wären sie Public. Das ist echt kaka.

Hat jemand eine Idee, wie ich mein Dilemma lösen kann?
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?

Geändert von Getox (29. Mär 2019 um 10:48 Uhr)
  Mit Zitat antworten Zitat