Ver Mensaje Individual
  #9  
Antiguo 29-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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);
  { pasar parámetros }
  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
Responder Con Cita