AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Referenz Verwaltung

Ein Thema von Jonas Shinaniganz · begonnen am 21. Jun 2012 · letzter Beitrag vom 22. Jun 2012
 
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Referenz Verwaltung

  Alt 21. Jun 2012, 18:16
Im Falle von Delphi, [...], würde ich auf solche Tricks wie Smart Pointer komplett verzichten.
Weshalb verzichten? Und wieso ist das ein "Trick"? Ohne gegenseitige Benachrichtigung bei Freigabe von Objekten würde die ganze VCL nicht funktionieren...
Die VCL verwendet keine Tricks sondern nur den etablierten Weg über Komponenten.

DAS hier ist ein Trick (in dem die Referenzzählung eines Interface ausgenützt wird):
Delphi-Quellcode:
unit UAutoRelease;

interface

{**************************************************************************
* NAME:    AutoRelease
* DESC:    Gibt das übergebene Objekt automatisch beim Verlassen der
*          aktuellen Funktion frei.
* PARAMS:  obj: TObject
* RESULT:  IUnknown
*
* Hilfsfunktion, um Objekte automatisch beim Verlassen der aktuellen
* Funktion freizugeben.
* Damit kann man sich manche try .. finally Blöcke sparen.
* Beispiel:
*    procedure xyz;
*    var sl: TStringList;
*      t : IUnknown;
*    begin
*      sl := TStringList.Create;
*      t := AutoRelease(sl);
*      sl.LoadFromFile('c:\autoexec.bat');
*      ...
*      // sl.Free wird nicht mehr benötigt!!!
*    end;
*************************************************************************}

function AutoRelease(obj: TObject): IUnknown;

implementation

type
   TAutoReleaseObject = class(TInterfacedObject, IUnknown)
   private
      FObject: TObject;
   public
      constructor Create(obj: TObject);
      destructor Destroy; override;
   end;

constructor TAutoReleaseObject.Create(obj: TObject);
begin
   inherited Create;
   FObject := obj;
end;

destructor TAutoReleaseObject.Destroy;
begin
   FObject.Free;
   inherited;
end;

function AutoRelease(obj: TObject): IUnknown;
begin
   Result := TAutoReleaseObject.Create(obj);
end;

end.
Delphi-Quellcode:
finalization
  MeinGlobalesObjekt.Free;
end.
Wo ist das Problem?
Das Problem ist, dass man globale Objekte vermeiden sollte wann immer es möglich ist.
Manchmal lässt es sich nicht vermeiden ein Objekt global anzulegen, aber jedes globale Objekt erzeugt auch Probleme wie schlechte Testbarkeit.
Wenn Projekte an Umfang zunehmen und Hunderte von Units haben ist jedes globale Objekt eine technische Schuld für die man "Zinsen" bezahlen muss.
Andreas

Geändert von shmia (21. Jun 2012 um 18:21 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz