Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #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
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:49:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi