Einzelnen Beitrag anzeigen

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