Cita:
Empezado por jachguate
¿hay algo malo en mi forma de traducir los términos?
|
Me refería a
esto
-------------------
Normalmente no es buena idea hacer funciones que regresen objetos creados por ellas mismas precisamente porque es difícil dar seguimiento a cuando deben destruirse.
Sin embargo, si esto es absolutamente necesario yo optaría por el uso de interfaces para que la liberación de memoria sea automática.
La idea sería algo así:
Código Delphi
[-]
type
IQueryHolder = interface
function GetQuery: TQuery;
property Query: TQuery read GetQuery;
end;
TQueryHolder = class(TInterfacedObject, IQueryCreator)
var
FQuery: TQuery;
public
constructor Create(AQuery: TQuery);
destructor Destroy; override;
function GetQuery: TQuery;
end;
implementation
constructor TQueryHolder.Create(AQuery: TQuery);
begin
FQuery := AQuery;
end;
destructor TQueryHolder.Destroy;
begin
FQuery.Free;
inherited;
end;
function TQueryHolder.GetQuery: TQuery;
begin
Result := FQuery;
end;
end.
La interfaz IQueryHolder simplemente mantiene una referencia a un objeto Query. La clase TQueryHolder implementa esta interfaz. Dado que desciende de TInterfacedObject, su destructor será llamado en cuanto se pierda la última referencia a la interfaz y este destructor se encarga de liberar al objeto Query.
Para usar esta interfaz, la función UnQuery descrita por
jachguate se debe modificar así:
Código Delphi
[-]
function UnQuery(parámetros): IQueryHolder;
var
Query: TQuery;
begin
Query := TQuery.Create(nil);
Result := TQueryHolder.Create(Query);
end;
Y para usar el resultado se haría así:
Código Delphi
[-]
var
QueryHolder: IQueryHolder;
begin
QueryHolder := UnQuery(parámetros);
QueryHolder.Query.Open;
end;
Como dije antes, Sin importar dónde esté declarada la variable QueryHolder, el objeto Query que contiene se liberará en cuanto se pierda la última referencia.
// Saludos