Ver Mensaje Individual
  #2  
Antiguo 31-08-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
Hola, he visto (muy por encima) el código que adjuntas y te pongo una sugerencia.

Para no alargar me enfoco sólo en una parte que aquí resumo:

Código Delphi [-]
type
{$if defined (ZEOS)}
  TMiQuery = TZQuery;
  ...
{$elseif defined(BDE)}
  ...
{$endif}

...

procedure ParamAsDate(Qry: TMiQuery; Nombre: String; Valor: TDateTime);
begin
{$if defiined(ZEOS)}
  Qry.ParamByName(Nombre).AsDate := Valor;
{$elseif defined(BDE)}
  ..
{$endif}
end;

Es decir, la manera en que enfocas el problema es discerniendo el tipo de componente a usar mediante directivas de compilación y programando procedimientos generales que harán uso de los tipos realmente compilados.

Otra forma de enfocar esto es "convirtiendo" estos procedimientos generales en métodos de una clase genérica:

Código Delphi [-]
type
  TQueryGenerico = class
  public
    procedure ParamAsDate(Nombre: String; Valor: TDateTime); virtual; abstract;
  end;

Para cada motor que desees manejar derivas una clase:


Código Delphi [-]
type
  TQueryZeos = class(TQueryGenerico)
  private
    FQuery: TZQuery; // componente 'real'

  public
    constructor Create; // aquí construyes FQuery
    destructor Destroy; override; // aquí destruyes FQuery;

    procedure ParamAsDate(Nombre: String; Valor: TDateTime); override;
    {
      FQuery.ParamByName(Nombre).AsDate := Valor;
    }
  end;

La clase base no implementa los métodos, sólo los define (virtual y abstract) de manera que tu aplicación pueda hacer uso de ellos indistintamente de cuál descendiente es el que realmente se crea.

Al comienzo de tu aplicación, suponiendo que decides usar Zeos, construyes un objeto TQueryZeos:

Código Delphi [-]
QueryGenerica := TQueryZeos.Create;

donde QueryGenerica es de tipo TQueryGenerica. El resto de tu aplicación no dependerá de si usaste TQueryZeos o TQueryBde ya que únicamente hace uso de los métodos declarados en TQueryGenerica. El polimorfismo hace que se llamen los métodos de la clase adecuada.

Esto te permite no depender de directivas de compilación. Cuando desees agregar soporte para un nuevo motor simplemente creas el correspondiente descendiente sin tocar el resto del código ni tener que recompilar la aplicación principal excepto por la parte que toca a la construcción del descendiente específico de TQueryGenerico.

Esto último se puede facilitar mediante el uso de una fábrica de la cual puedo hablar al rato porque ya me tengo que ir.

// Saludos
Responder Con Cita