Unikanie zagnieżdżonych prób… wreszcie blokuje w Delphi
Tego ranka miałem ten pomysł na unikanie zagnieżdżonych bloków próbuj, jak poniżej
procedure DoSomething;
var
T1, T2, T3 : TTestObject;
begin
T1 := TTestObject.Create('One');
try
T2 := TTestObject.Create('Two');
try
T3 := TTestObject.Create('Three');
try
//A bunch of code;
finally
T3.Free;
end;
finally
T2.Free;
end;
finally
T1.Free;
end;
end;
Korzystając z automatycznego zliczania referencji interfejsów, wymyśliłem
Type
IDoFinally = interface
procedure DoFree(O : TObject);
end;
TDoFinally = class(TInterfacedObject, IDoFinally)
private
FreeObjectList : TObjectList;
public
procedure DoFree(O : TObject);
constructor Create;
destructor Destroy; override;
end;
//...
procedure TDoFinally.DoFree(O : TObject);
begin
FreeObjectList.Add(O);
end;
constructor TDoFinally.Create;
begin
FreeObjectList := TObjectList.Create(True);
end;
destructor TDoFinally.Destroy;
begin
FreeObjectList.Free;
inherited;
end;
Tak, że poprzedni blok kodu staje się
procedure DoSomething;
var
T1, T2, T3 : TTestObject;
DoFinally : IDoFinally;
begin
DoFinally := TDoFinally.Create;
T1 := TTestObject.Create('One');
DoFinally.DoFree(T1);
T2 := TTestObject.Create('Two');
DoFinally.DoFree(T2);
T3 := TTestObject.Create('Three');
DoFinally.DoFree(T3);
// A Bunch of code;
end;
Moje pytanie brzmi: czy to działa, czy coś przeoczyłem?
Dla mnie wygląda to całkiem fajnie i sprawia, że kod jest nieco łatwiejszy do odczytania przy zmniejszonej ilości zagnieżdżania. Można go również rozszerzyć o przechowywanie listy anonimowych metod uruchamiania, takich jak zamykanie plików, zapytania itp.