Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-06-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 14
giulichajari Va por buen camino
Bueno... en todo sistema existen especificaciones.

Por un lado tienes el modelo relacional de los datos, aunque tambien existen bd orientadas a objetos.
Y la programacion en algun lenguaje es para los procesos, y en esto la orientacion a objetos es superior y provee ventajas como la rusabilidad extensibilidad, etc...
Y los objetos tambien quedan en la memoria mientras la aplicacion funciona luego se pierden.
Este tema me hace acordar a un curso de PHP, por el uso del Active Record, es un patrón de diseño que define una forma de acceder a los datos de una base de datos relacional y convertir las filas de una tabla en objetos.
Y para la consulta final debes acceder a los atributos de los objetos en cuestion, y con los getters y setters podras manejar consultas.
Saludos
Responder Con Cita
  #2  
Antiguo 17-06-2015
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Si estás estudiando una carrera, y más si estás por recibirte, me extraña que no hayas siquiera haber escuchado al voleo lo que se conoce como framework de persistencia y el mapeo objeto-relacional (conocido más en la jerga como Mapping O-R o también como ORM). No te pido que te lo sepas como el padre nuestro, puesto que por lo general no está incorporado en los programas de estudio. Pero de forma burda y elemental si tienes que haberte sido dado y mencionado. El primer indicio de esto tiene que haberte llegado cuando se te dieron el concepto de diseño en 3 capas: interfaz-lógica-datos. El 2do indicio cuando te empiezan a martillar con POO y patrones y descubres la diferencia entre un objeto y la descripción del mismo. El 3er indicio, a puro golpe, llega repasas que la Cohesión te dice que no es sano mezclar en las clases potenciales de un modelo de dominio métodos dedicados a la capa de dominio con la de presentación o la base...
Y listo, así es como uno abre los ojitos y se da con que la teoría que tenía tiene que volver a ser leída otra vez... y así hasta que entrena la cabecita a encontrar la teoría de persistencia.

Allí tienes tu respuesta.

Para adentrarte recomiendo la lectura de los últimos capítulos de UML y Patrones de Craig Larman. Si no me falla la memoria desde el capítulo 33, de la 4ta edición (si, creo que era la 4ta la que tengo), expone de manera introductoria y superficial los conceptos más esenciales que dan forma luego a que junto con la práctica de otros patrones se llegue a un tener un framework.

Aviso que esto no es fácil de tragar. No es algo que se entienda ni con las primeras 20 leídas.

Recuerdo hace ya un buen tiempo que había llegado a unos muy buenos artículos que exponía desde algo más teórico sobre Maping O-R, y fue citado aquí en los foros. El compañero Neftali había dado ciertas orientaciones en su momento. Ahora no tengo las fuentes a mano. Date una búsquedas.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 17-06-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Necesitas agregar mas clases a tu dominio, clases encargadas de mapear objetos desde la base de datos a tu programa.

Yo suelo crear un DataModule con 1 componente conexion, y luego objetos publicos que se definen en otras units

un ejemplo de un DataModule:

Código Delphi [-]
unit Data.DataModule;

uses
  ...
  Data.Managers.Socios // --> unit en donde esta definida una clase que me permite guardar, leer, borrar, etc "Socios"!
  ...

    TDM = class(TDataModule)
        FDGUIxWaitCursor1: TFDGUIxWaitCursor;
        FDPhysFBDriverLink1: TFDPhysFBDriverLink;
        Connection: TFDConnection;
        procedure DataModuleCreate(Sender: TObject);
        procedure DataModuleDestroy(Sender: TObject);
        procedure ConnectionAfterConnect(Sender: TObject);
        procedure ConnectionBeforeConnect(Sender: TObject);
    private
        { Private declarations }
        procedure InitManagers;
        procedure FreeManagers;
    public
        { Public declarations }
        Socios: TSociosMgr;  --> Aca tenemos la instancia publica a la que hay que pedirle que opere con los socios
    end;

procedure TDM.ConnectionAfterConnect(Sender: TObject);
begin
    InitManagers;
end;

procedure TDM.DataModuleCreate(Sender: TObject);
begin
    Connection.Connected := True;
end;

procedure TDM.DataModuleDestroy(Sender: TObject);
begin
    FreeManagers;
end;


procedure TDM.FreeManagers;
begin
  if Assigned(Socios) then
    Socios.Free;
end;

procedure TDM.InitManagers;
begin
    Socios := TSociosMgr.Create(Connection); // --> Le pasamos la conexion para que pueda acceder la BD
end;

y un poco de la clase TSociosMgr..

Código Delphi [-]
    { Clase encargada de la comunicacion con la base de datos. Implementa operaciones CRUD }
    TSociosMgr = class(TBaseMgr)  --> TBaseMgr es una clase abstracta que define algunas cosas
    public
        constructor Create(Connection: TFDConnection);
        function Get(const Id: int64): TSocio; overload;
        function Get(const Apellido, Nombre: string): TSocio; overload;
        function Delete(const Id: int64): boolean;
        function Search(const FParams: TSocioParams): TSocioData; 
//--> TSocioParams es un tipo record que contiene los parametros de busqueda, 
// a partir de esto armo una sentencia SQL
        function GetAll: TSocioData;
// --> TSocioData es otra clase especial.. mas abajo la muestro.
// Basicamente ADAPTA el resultado de una consulta SQL a: TDataSet, TDataSource, 
'' TList, < T > (donde < T > en este caso particular es TSocio!)
    end;

Aca esta TSocioData

Código Delphi [-]
    { Contiene un TDataSet con el resltado de un query. Puede representar la informacion como TDataSet, TDataSource
      o TList }
    TSocioData= class(TBaseData) --> Otra clase abstracta mas 
    public
        function AsList: TSocioList; --> TObjectList< TSocio > con algunos agregados: Comparadores por ej
        function RowToObj< T >: TSocio;
// --> Soy muy original con los nombres lo se.
// RowToObj "transforma" una fila del query en un TSocio, de alli su nombre
    end;

TSocioData, al descender de TBaseData, tiene una variable de tipo TDataSet (privada)

Entonces se puede implementar algo como esto:

Código Delphi [-]
function TSocioData.AsList: TSocioList;
begin
   // le paso una funcion por parametro que le dice "como" hacer para adaptar una fila del dataset a un TSocio!
    Result := TSocioList(inherited AsList< TSocio >(RowToObj< TSocio >));
    // al invocar a inherited AsList, se ejecuta un metodo de TBaseData, el cual hace algo masomenos asi
   // while not(YourDataSet.Eof) do
   // begin
  //   Lista.Add(RowToObj< T >);
  //   Next;
 // end;
end;

function TSocioData.RowToObj< T >: TSocio;
begin
    Result := TSocio.Create;
    with YourDataSet do
    begin
        Result.Id := FieldByName('Id').AsLargeInt;
        Result.IdRubro := FieldByName('IdRubro').AsInteger;
        Result.Apellido := FieldByName('Apellido').AsString;
        Result.Nombre := FieldByName('Nombre').AsString;
        Result.Mail := FieldByName('Mail').AsString;
        Result.FechaNac := FieldByName('FechaNac').AsDateTime;
        Result.FechaAlta := FieldByName('FechaAlta').AsDateTime;
        Result.Sexo.FromInteger(FieldByName('Sexo').AsInteger);
        Result.Observaciones := FieldByName('Observaciones').AsString;
        Result.Imagen := TImageLoader.LoadFromField(FieldByName('Imagen'));
    end;
end;

Se que es tedioso y largo, y eso que solo puse "pedazos sueltos" porque meter todas las clases involucradas en un post es una locura. Pero masomenos te das una idea

La mejor forma que yo encontre de que los objetos puedan colaborar entre si, es esta: Tenes que tener las claves foraneas en tu objeto, y cuando necesitas mas informacion para trabajar, se la pedis a la clase encargada de la persistencia!

En tu caso:

Código Delphi [-]

implementation

uses
  Data.DataModule, // --> Para poder acceder al TProveedorMgr
  Entities.Proveedor; // --> Aca estaria definido TProveedor

procedure TProducto.MostrarNombreDeProveedor;
var
  AProveedor: TProveedor;
begin
  AProveedor := DataModule.Proveedores.Get(IdProveedor); // --> Clave foranea en tu objeto TProducto!
  try
    ShowMessage(AProveedor.Nombre);
    ...
  finally
    AProveedor.Free;
  end;
end;

Como ya te dijeron por arriba esto lleva TIEMPO, y cuesta digerirlo. Yo aun sigo aprendiendo, experimentando y mejorando, aun me falta muchisimo para dominarlo bien, pero es una forma de programar que realmente me apasiona

Definitivamente deberias pegarle una ojeada a la sesion del CodeRage7 de Malcom Groves, en donde muestra un ejemplo de implementacion MVVM en Delphi

http://www.malcolmgroves.com/blog/?p=1340


-----

OFFTOPIC: Por cierto, los a genericos hay que agregarles espacio o no salen en el post!

Última edición por AgustinOrtu fecha: 17-06-2015 a las 06:03:09. Razón: Para mejor visualizacion
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como sincronizar datos entre bases datos cliente a servidor (asincronicamente) Efren2006 OOP 6 29-03-2013 11:36:11
Insertar datos entre bases de datos diferentes franjero Firebird e Interbase 1 19-06-2012 08:32:42
Operaciones entre bases de datos subzero MS SQL Server 3 17-01-2008 21:55:57
Enlaces entre Bases de Datos!! Chik_Electronik C++ Builder 3 01-06-2006 05:00:37
Bases de datos orientadas a objetos AlbertoC Conexión con bases de datos 0 19-05-2005 14:44:18


La franja horaria es GMT +2. Ahora son las 15:52:15.


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