Ver Mensaje Individual
  #1  
Antiguo 02-08-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Duda sobre OOP y capas

A ver, se aceptan sugerencias:

Estoy haciendo un proyecto y quiero seguir al pie de la letra OOP y capas por lo que me olvidé por el momento de controles data-aware y demás. Uso como motor MySQL.

Ya hice un pequeño control de datos de empresas. De manera que definí las siguientes clases:

TCatalogoEmpresas y TEmpresa. Hasta aqui se ve obvio como se trabaja. TCatalogoEmpresas se encarga de gestionar las n TEmpresas que pueda haber. Digamos que estas dos clases pertenecen a la capa de negocio. La capa de Datos la manejo por medio de un datamodule y sus correspondientes querys y demás.

TCatalogoEmpresas tiene los siguentes metodos:

Function GetListaEmpresas:TZQuery;
Devuelve una tabla que muestra las empresas que hay en la BD. Solo para efectos de visualización ya que no permite su edición. Este query se lo pide a la capa de datos.

Function GetEmpresa(aIDEmpresa:String):TEmpresa;
Devuelve la TEmpresa cuyo ID sea el indicado, genera una excepción si el ID no se encuentra.

Function NewEmpresa:TEmpresa;
Construye una nueva empresa para trabajarla.

Procedure InsertEmpresa(aEmpresa:TEmpresa)
Inserta aEmpresa como nueva empresa.

Hasta aqui todo funciona excelente pero hay cosas que no me gusta como se ven, por ejemplo para editar una empresa hago esto:

Código Delphi [-]
      FViewEmpresa := TFViewEmpresa.Create(nil);
   try
      try
        EmpresaAnterior := CatalogoEmpresas.GetEmpresa(  GridViewEmpresasRFC.EditValue);
        EmpresaEditada  := CatalogoEmpresas.GetEmpresa(  GridViewEmpresasRFC.EditValue);
        If FViewEmpresa.EditaEmpresa( EmpresaEditada ) Then
           CatalogoEmpresas.UpDateEmpresa( EmpresaAnterior, EmpresaEditada );
           GridViewEmpresas.DataController.DataSource.DataSet.Refresh;
      Finally
         EmpresaEditada.Free;
         EmpresaAnterior.Free;
      end;
   finally
     FViewEmpresa.Free;
   end;
Lo que no me gusta es eso de UpdateEmpresa, bastaría con pasarle una TEmpresa y que esta se actualzara pero resulta que en la capa de datos las cosas son diferntes a los objetos ya que cad TEmpresa es en realidad un registro de una tabla y se actaulizan por medio de un UPDATE TABLE de SQL hay que indicarle a ese query cual es la clave del registro a modificar: "update table empresas set.... where clave=laclave"
Hasta aqui no pasaria nada pues con los datos de tempresa de puede hacer el query sin problemas pero...que pasa si en TEMpresa se le editó el campo clave?? Entonces ya no podriamos editarlo en la tabla porque aunque tenemos los nuevos valores no tenemos forma de localizar el registro anterior.

Alguna sugerencia para y que el codigo quede mas simple?

Ahora otra mas.
Tenemos nuestra TEmpresa que contienen los datos de la empresa y algunas cosas mas. Tenemos una Forma TFViewEmpresa que muestra los datos de la empresa. Como les decia, no uso componentes dataaware para poder seguir el esquema completo de capas, pero por ejemplo para llenar los campos de la forma con los datos de la clase tengo que hacer una serie de asignaciones y para guardar es lo mismo...hay alguna otra forma'?
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita