de datos de Objeto, en última instancia, debe ser almacenado en una base de datos. En este artículo se muestra cómo.
los Objetos Persistentes
En el último par de artículos que hemos introducido los objetos de negocio y muestra cómo las relaciones simples que puede ser representado. Las relaciones expresadas como propiedades de los objetos son más formal (y neutro) representación de las relaciones entre entidades de datos que puede ser implícita en el diseño de base de datos, o explícita dentro del esquema de base de datos. Alejándose de un centrada en los datos de la vista de las entidades y sus relaciones de una forma más estructurada, orientada a objetos de la exposición tiene muchos beneficios, pero la mayoría de los idiomas (incluyendo Delphi) atender sólo para un objeto en memoria de los objetos del modelo no tienen la persistencia del estado de capacidad a menos que uno sea siempre para ellos.
Hay muchas soluciones de diseño a este requisito, y ya hemos establecido que la empresa (dominio del problema) de los objetos en sí mismos no deben comunicarse directamente con la base de datos. Un diseño apropiado es tener otro conjunto de clases que existen meramente como un objeto de la interfaz a la base de datos, y será responsable de cargar y guardar problema objeto de dominio del estado. Nuestro problema objetos de dominio se sabe nada acerca de cómo su estado se almacena en disco, sólo que hay una clase particular que es el responsable de esta operación. Los objetos de negocio va a hacer una llamada a un método en un objeto y delegar el trabajo a él.
La primera decisión que se debe tomar es decidir cómo asignar objetos en un esquema de base de datos. Aunque un número de objetos de bases de datos existen, la mayoría de las empresas han estandarizado en un RDBMS con la que ellos se sientan cómodos y con experiencia. La promoción de un desarrollo de cambio a una más enfoque orientado a objetos es bastante difícil, sin exigir que el normalmente una gran inversión en un altamente evolucionada tecnología de base de datos se replican por una nueva, desconocida. Por lo tanto, este artículo se centrará en el mapeo de objetos a una basada en SQL RDBMS, ya que esto constituye la mayoría de instalado el desarrollo de sistemas. Debe, sin embargo, se subrayó que una de las ventajas de nuestro modelo de objetos es que es totalmente de arquitectura neutral y puede ser aplicado a un gran número de bases de datos diferentes topologías, incluyendo ISAM y basada en objetos.
Mapeo de objetos a bases de datos
es obvio y natural que existe una relativamente simple conceptual de la correspondencia entre un objeto y una base de datos tupla (registro). Por lo tanto, cuando se almacena el estado del objeto en un RDBMS un muy común y práctico, la solución es asignar un dominio de problema de clases a tablas, objetos a los registros y las propiedades de los campos. Tenga en cuenta que debido a nuestra base de datos va a almacenar el estado del objeto, debe ser una representación completa y por lo tanto es probable que habrá más campos en la tabla de base de datos de una clase dada tiene propiedades públicas. En algunos casos, la propiedad pública no puede tener directamente en el campo correspondiente, pero el principio general es el de asignar una propiedad en un campo de base de datos de similar tipo fundamental (carácter, numérico, fecha, etc.)
ahora Vamos a ampliar nuestro marco básico para las clases de apoyo de persistencia de objetos. Nuestro problema los objetos del dominio (TPDObject) necesitan el permiso de otras clases, para obligarlos a cargar o guardar su estado. Hay un número de formas alternativas de abordar esta situación es la fuerza de todos los objetos, implícitamente, guardar su estado antes de que sean destruidas. En la práctica, las aplicaciones que requieren un mayor grado de control sobre cuando el estado del objeto debe ser persistente y por lo tanto nuestro TPDObject ganará dos nuevos métodos públicos, Cargar y Guardar. El método Save es sin parámetros, pero nuestro método de Carga debe definir exactamente qué objeto es ser cargado desde el almacén persistente. Dentro de nuestro marco de trabajo, todos los objetos del dominio del problema que se han guardado se le ha asignado un IDENTIFICADOR único dentro de un contexto dado (esto podría ser dentro de los objetos de la misma clase, objetos de la misma ascendencia, la aplicación o universal). Vamos a utilizar este IDENTIFICADOR como parámetro para el método de Carga para generalizar el medio por el cual podemos establecer la identidad del objeto. Tenga en cuenta que este se utiliza siempre, incluso si una clase específica podría tener una alternativa adecuada 'clave principal' concepto. Estandarizar un único concepto de la identidad de los objetos es útil, como nuestro marco de trabajo que puede utilizar esta consistencia para tratar nuestro problema de dominio de los objetos en un genérico y polimórfica de la moda. Algunos podrían cuestionar la presencia de un público de la propiedad (aunque sólo lectura) que expone un tipo elegido por conveniencia para satisfacer las interioridades de nuestro marco de trabajo. En la práctica, la identificación de los objetos por ID es algo que se produce casi en su totalidad en el marco del código, y es que rara vez se encuentra dentro de la actual lógica de la aplicación en sí. Dentro de ese ámbito, los objetos son manipulados utilizando conceptos mucho más familiar para el usuario final, tales como 'el conjunto de clientes llamado Smith', en lugar de a través de desarrollador orientado a los resúmenes.
una vez definido el método público de la interfaz en nuestro TPDObject problema de dominio de la clase debemos ahora considerar la aplicación. De hecho, esto es muy simple. Ya hemos dicho que el objeto de negocio no sabe nada acerca de cómo se almacena, sólo que no es otro objeto responsable de esta tarea. Por lo tanto, la aplicación de nuestros métodos de persistencia en TPDObject simplemente delegar el trabajo directamente a otro objeto al que hace referencia dentro de un campo privado. Cada una de estas llamadas de método es parametrizar con el Auto, por lo que el delegado objeto sabe con qué instancia se trata. En efecto, cuando un problema objeto de dominio se encargó de guardar (o carga) en sí, simplemente indica otro objeto a 'sálvame'.
Administración de Datos
La tarea de guardar realmente el estado del objeto a una base de datos cae a un conjunto de clases en la gestión de datos de la capa. Como era de esperar, vamos a tener una jerarquía de clases que nos permite proporcionar una base de datos independiente de la funcionalidad. Todas nuestras clases responsable de la gestión de datos se descienden de un resumen TDMObject clase. Esta clase proporciona una base de objetos, base de datos independiente de la interfaz para operaciones de base de datos. Base de datos específica de apoyo es proporcionado por la creación de un hormigón descendiente de esta clase que proporciona una conexión a la base de datos de elección el uso de cualquier tecnología es apropiada, y, además, proporciona algunos servicios de base. Estos servicios serán totalmente personalizados en función de las características específicas de la base de datos de que se trate, y será utilizado por las aplicaciones que dependen de los descendientes personalizada para el manejo de un determinado TPDObject. Este diseño no dicta el medio por el cual el TDMObjects comunicarse con el motor de base de datos: cada capa de base de datos es libre de elegir el más adecuado (forma más fácil y más rápido), la tecnología disponible. Esto podría ser ADO para SQL Server 7, IBExpress para Interbase, el BDE para archivos de Paradox, un API personalizado o, de hecho, es posible interfaz para algo como ODBC o CORBA genéricos para el manejo. Mi preferencia es para optimizar la conexión con una base de datos dependiente de un conjunto de componentes, ya que estos son generalmente ofrecen el mayor funcionalidad y velocidad. Tenga en cuenta que la selección de una base de datos dependiente de la API de no restringir su aplicación a correr con esta base de datos, es posible sustituir una base de datos dependiente de la TDMObject capa para otro. La interfaz para el TDMObject es puramente objeto, de manera que se pueda garantizar que, siempre que nuestra base de datos de las capas de implementar los métodos concretos correctamente, la aplicación se ejecutará del mismo modo sin cambios.
La implementación real de cada base de datos específica de la capa dependerá de la base de datos de que se trate, pero en general para SQL-capaz de bases de datos es que vale la pena para proporcionar un genérico de Ejecutar el comando que tiene una validez de comandos SQL como un parámetro. Una vez que tenemos una TDMObject descendiente de una base de datos elegida se debe proporcionar un número de descendientes de esta clase, uno por cada TPDObject en nuestra aplicación. Estos se adaptarán a manejar un muy específica combinación de ahorro de una clase en particular en una determinada base de datos. Los detalles de estas clases dependen de las características proporcionadas por los datos de la clase de gestión de la base de datos en particular, sino una característica es de vital importancia: la operación de Guardar debe devolver el ID del objeto guardado. La razón de esto es que en nuestro modelo elegido, una TPDObject no tiene un ID hasta que la primera vez que se guarda. Una ventaja particular de este modelo es que es muy fácil para la gestión de datos de la capa de detectar si es necesario generar una INSERCIÓN o ACTUALIZACIÓN de base de datos tipo de acción. Normalmente, la asignación de la IDENTIFICACIÓN puede realizarse a través de otro objeto diseñado exclusivamente para este propósito, pero hay una muy beneficioso optimización que se pueden hacer si confiamos en nuestra gestión de datos de objeto para hacer esta tarea por nosotros. Recuerde que nuestro ID debe ser único en un contexto determinado si el contexto elegido es el de que los objetos de la misma clase tienen IDENTIFICADOR único, esto puede ser equiparada a la de los registros en la tabla de haber IDENTIFICADOR único. La mayoría de las bases de datos tienen cierta facilidad para la generación secuencial IDENTIFICADOR único para insertar registros, y que este valor disponible después de la actualización de base de datos. El uso de esta instalación en nuestra gestión de datos de la capa puede evitar replicar el esfuerzo para garantizar la unicidad, y en el mejor de los casos puede guardar en extrañas operaciones de base de datos para establecer la ID. Si la base de datos elegida carece de tales características, a continuación, una IDENTIFICACIÓN interna de asignación de esquema dentro de la gestión de los datos de la jerarquía puede ser utilizado.
Listado 1 muestra las extensiones a nuestro Marco de trabajo de la unidad de soporte de Carga y operaciones de Guardar, junto con el esquema de una clase para manejar los datos de acceso a una base de datos a través de ADO. Se supone que la conexión de ADO y se ha establecido que las rutinas de utilidad se proporcionan dentro de la clase para ejecutar comandos SQL y a manejar de vuelta los datos recibidos. En esta aplicación las clases descendientes son necesarios para reemplazar el método de Carga, y también para proporcionar una nueva Inserción y Actualización de la aplicación. Es bastante fácil ver que estos tres métodos se deben generar apropiado de código SQL y actualizar el objeto de que el conjunto de resultados (o viceversa). Con un poco más de esfuerzo, es posible colocar más de trabajo dentro de la genérica TADO_DMObject clase en sí misma, la imposición de una más rígida de la interfaz en las clases descendientes que requiere menos de implementación. Un ejemplo de esto podría ser el antepasado de la clase de la generación de comandos SQL de forma dinámica, dado un conjunto de nombres y valores de propiedades.
Nuestra clase específica de gestión de datos de objetos (tales como TCustomerDM, correspondiente a TCustomer) debe tener un profundo conocimiento sobre el funcionamiento interno de la DP objeto para el que es responsable. En este sentido se pueden considerar como 'amigo' de las clases del dominio del problema objeto, y en Delphi esto significa que las implementaciones deben estar en la misma unidad.
Este artículos del problema
Nuestro diseño requiere un TDMObject a ser proporcionada por cada TPDObject. Donde y cuando se puede de esta disposición? ¿Qué es este problema con este enfoque y, mediante el análisis del patrón de las llamadas de método a nuestro TDMObjects, ¿cómo puede evitarse?
((( Listado 1 - gestión de Datos de objetos e interfaces)))
Marco de unidad
interfaz
tipo
& nbsp & nbsp TDMObject = clase
& nbsp & nbsp TPDObject = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp DMObject: TDMObject
& nbsp & nbsp & nbsp & nbsp FID: TObjectID
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp procedimiento Load (const ID: TObjectID)
& nbsp & nbsp & nbsp & nbsp procedimiento de Guardar
& nbsp & nbsp final
& nbsp & nbsp TDMObject = clase
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp procedimiento de Carga (PDObject: TPDObject const ID: TObjectID) virtual resumen
& nbsp & nbsp & nbsp & nbsp función Guardar (PDObject: TPDObject): TObjectID virtual resumen
& nbsp & nbsp final
& nbsp & nbsp TADO_DMObject = clase (TDMObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FADO: TADOExpress
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp // Funciones para ayudar a los descendientes de interactuar con la base de datos
& nbsp & nbsp & nbsp & nbsp procedimiento Execute (SQL: String)
& nbsp & nbsp & nbsp & nbsp propiedad ADO: TADOExpress leer FADO
& nbsp & nbsp & nbsp & nbsp // Métodos que los descendientes debe proporcionar
& nbsp & nbsp & nbsp & nbsp función Insertar (const PDObject: TPDObject): TObjectID virtual resumen
& nbsp & nbsp & nbsp & nbsp procedimiento de Actualización (const PDObject: TPDObject) virtual resumen
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp función Guardar (PDObject: TPDObject): TObjectID reemplazar
& nbsp & nbsp final
aplicación
procedimiento TPDObject.Load (const ID: TObjectID)
begin
& nbsp & nbsp Assert (DMObject <> nil, 'No la Gestión de los Datos del objeto')
& nbsp & nbsp DMObject.De carga (Self, ID)
fin
procedimiento TDMObject.Guardar
begin
& nbsp & nbsp Assert (DMObject <> nil, 'No la Gestión de los Datos del objeto')
& nbsp & nbsp FID := DMObject.Guardar (Auto)
fin
función TADO_DMObject.Guardar (PDObject: TPDObject): TObjectID
begin
& nbsp & nbsp si PDObject.ID = NotAssigned, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp Resultado := Insertar (PDObject)
& nbsp & nbsp end else begin
& nbsp & nbsp & nbsp & nbsp Actualización (PDObject)
& nbsp & nbsp & nbsp & nbsp Resultado := PDObject.ID
& nbsp & nbsp final
fin
final.
((( Fin del Listado 1 )))
el Siguiente en la serie
Los objetos persistentes
Los objetos persistentes : Multi-millones de consejos para hacer su vida mas facil.
de datos de Objeto, en ultima instancia, debe ser almacenado en una base de datos. En este articulo se muestra como.
los Objetos Persistentes
En el ultimo par de articulos que hemos introducido los objetos de negocio y muestra como las relaciones simples que puede ser representado. Las relaciones expresadas como propiedades de los objetos son mas formal (y neutro) representacion de las relaciones entre entidades de datos que puede ser implicita en el diseño de base de datos, o explicita dentro del esquema de base de datos. Alejandose de un centrada en los datos de la vista de las entidades y sus relaciones de una forma mas estructurada, orientada a objetos de la exposicion tiene muchos beneficios, pero la mayoria de los idiomas (incluyendo Delphi) atender solo para un objeto en memoria de los objetos del modelo no tienen la persistencia del estado de capacidad a menos que uno sea siempre para ellos.
Hay muchas soluciones de diseño a este requisito, y ya hemos establecido que la empresa (dominio del problema) de los objetos en si mismos no deben comunicarse directamente con la base de datos. Un diseño apropiado es tener otro conjunto de clases que existen meramente como un objeto de la interfaz a la base de datos, y sera responsable de cargar y guardar problema objeto de dominio del estado. Nuestro problema objetos de dominio se sabe nada acerca de como su estado se almacena en disco, solo que hay una clase particular que es el responsable de esta operacion. Los objetos de negocio va a hacer una llamada a un metodo en un objeto y delegar el trabajo a el.
La primera decision que se debe tomar es decidir como asignar objetos en un esquema de base de datos. Aunque un numero de objetos de bases de datos existen, la mayoria de las empresas han estandarizado en un RDBMS con la que ellos se sientan comodos y con experiencia. La promocion de un desarrollo de cambio a una mas enfoque orientado a objetos es bastante dificil, sin exigir que el normalmente una gran inversion en un altamente evolucionada tecnologia de base de datos se replican por una nueva, desconocida. Por lo tanto, este articulo se centrara en el mapeo de objetos a una basada en SQL RDBMS, ya que esto constituye la mayoria de instalado el desarrollo de sistemas. Debe, sin embargo, se subrayo que una de las ventajas de nuestro modelo de objetos es que es totalmente de arquitectura neutral y puede ser aplicado a un gran numero de bases de datos diferentes topologias, incluyendo ISAM y basada en objetos.
Mapeo de objetos a bases de datos
es obvio y natural que existe una relativamente simple conceptual de la correspondencia entre un objeto y una base de datos tupla (registro). Por lo tanto, cuando se almacena el estado del objeto en un RDBMS un muy comun y practico, la solucion es asignar un dominio de problema de clases a tablas, objetos a los registros y las propiedades de los campos. Tenga en cuenta que debido a nuestra base de datos va a almacenar el estado del objeto, debe ser una representacion completa y por lo tanto es probable que habra mas campos en la tabla de base de datos de una clase dada tiene propiedades publicas. En algunos casos, la propiedad publica no puede tener directamente en el campo correspondiente, pero el principio general es el de asignar una propiedad en un campo de base de datos de similar tipo fundamental (caracter, numerico, fecha, etc.)
ahora Vamos a ampliar nuestro marco basico para las clases de apoyo de persistencia de objetos. Nuestro problema los objetos del dominio (TPDObject) necesitan el permiso de otras clases, para obligarlos a cargar o guardar su estado. Hay un numero de formas alternativas de abordar esta situacion es la fuerza de todos los objetos, implicitamente, guardar su estado antes de que sean destruidas. En la practica, las aplicaciones que requieren un mayor grado de control sobre cuando el estado del objeto debe ser persistente y por lo tanto nuestro TPDObject ganara dos nuevos metodos publicos, Cargar y Guardar. El metodo Save es sin parametros, pero nuestro metodo de Carga debe definir exactamente que objeto es ser cargado desde el almacen persistente. Dentro de nuestro marco de trabajo, todos los objetos del dominio del problema que se han guardado se le ha asignado un IDENTIFICADOR unico dentro de un contexto dado (esto podria ser dentro de los objetos de la misma clase, objetos de la misma ascendencia, la aplicacion o universal). Vamos a utilizar este IDENTIFICADOR como parametro para el metodo de Carga para generalizar el medio por el cual podemos establecer la identidad del objeto. Tenga en cuenta que este se utiliza siempre, incluso si una clase especifica podria tener una alternativa adecuada 'clave principal' concepto. Estandarizar un unico concepto de la identidad de los objetos es util, como nuestro marco de trabajo que puede utilizar esta consistencia para tratar nuestro problema de dominio de los objetos en un generico y polimorfica de la moda. Algunos podrian cuestionar la presencia de un publico de la propiedad (aunque solo lectura) que expone un tipo elegido por conveniencia para satisfacer las interioridades de nuestro marco de trabajo. En la practica, la identificacion de los objetos por ID es algo que se produce casi en su totalidad en el marco del codigo, y es que rara vez se encuentra dentro de la actual logica de la aplicacion en si. Dentro de ese ambito, los objetos son manipulados utilizando conceptos mucho mas familiar para el usuario final, tales como 'el conjunto de clientes llamado Smith', en lugar de a traves de desarrollador orientado a los resumenes.
una vez definido el metodo publico de la interfaz en nuestro TPDObject problema de dominio de la clase debemos ahora considerar la aplicacion. De hecho, esto es muy simple. Ya hemos dicho que el objeto de negocio no sabe nada acerca de como se almacena, solo que no es otro objeto responsable de esta tarea. Por lo tanto, la aplicacion de nuestros metodos de persistencia en TPDObject simplemente delegar el trabajo directamente a otro objeto al que hace referencia dentro de un campo privado. Cada una de estas llamadas de metodo es parametrizar con el Auto, por lo que el delegado objeto sabe con que instancia se trata. En efecto, cuando un problema objeto de dominio se encargo de guardar (o carga) en si, simplemente indica otro objeto a 'salvame'.
Administracion de Datos
La tarea de guardar realmente el estado del objeto a una base de datos cae a un conjunto de clases en la gestion de datos de la capa. Como era de esperar, vamos a tener una jerarquia de clases que nos permite proporcionar una base de datos independiente de la funcionalidad. Todas nuestras clases responsable de la gestion de datos se descienden de un resumen TDMObject clase. Esta clase proporciona una base de objetos, base de datos independiente de la interfaz para operaciones de base de datos. Base de datos especifica de apoyo es proporcionado por la creacion de un hormigon descendiente de esta clase que proporciona una conexion a la base de datos de eleccion el uso de cualquier tecnologia es apropiada, y, ademas, proporciona algunos servicios de base. Estos servicios seran totalmente personalizados en funcion de las caracteristicas especificas de la base de datos de que se trate, y sera utilizado por las aplicaciones que dependen de los descendientes personalizada para el manejo de un determinado TPDObject. Este diseño no dicta el medio por el cual el TDMObjects comunicarse con el motor de base de datos: cada capa de base de datos es libre de elegir el mas adecuado (forma mas facil y mas rapido), la tecnologia disponible. Esto podria ser ADO para SQL Server 7, IBExpress para Interbase, el BDE para archivos de Paradox, un API personalizado o, de hecho, es posible interfaz para algo como ODBC o CORBA genericos para el manejo. Mi preferencia es para optimizar la conexion con una base de datos dependiente de un conjunto de componentes, ya que estos son generalmente ofrecen el mayor funcionalidad y velocidad. Tenga en cuenta que la seleccion de una base de datos dependiente de la API de no restringir su aplicacion a correr con esta base de datos, es posible sustituir una base de datos dependiente de la TDMObject capa para otro. La interfaz para el TDMObject es puramente objeto, de manera que se pueda garantizar que, siempre que nuestra base de datos de las capas de implementar los metodos concretos correctamente, la aplicacion se ejecutara del mismo modo sin cambios.
La implementacion real de cada base de datos especifica de la capa dependera de la base de datos de que se trate, pero en general para SQL-capaz de bases de datos es que vale la pena para proporcionar un generico de Ejecutar el comando que tiene una validez de comandos SQL como un parametro. Una vez que tenemos una TDMObject descendiente de una base de datos elegida se debe proporcionar un numero de descendientes de esta clase, uno por cada TPDObject en nuestra aplicacion. Estos se adaptaran a manejar un muy especifica combinacion de ahorro de una clase en particular en una determinada base de datos. Los detalles de estas clases dependen de las caracteristicas proporcionadas por los datos de la clase de gestion de la base de datos en particular, sino una caracteristica es de vital importancia: la operacion de Guardar debe devolver el ID del objeto guardado. La razon de esto es que en nuestro modelo elegido, una TPDObject no tiene un ID hasta que la primera vez que se guarda. Una ventaja particular de este modelo es que es muy facil para la gestion de datos de la capa de detectar si es necesario generar una INSERCION o ACTUALIZACION de base de datos tipo de accion. Normalmente, la asignacion de la IDENTIFICACION puede realizarse a traves de otro objeto diseñado exclusivamente para este proposito, pero hay una muy beneficioso optimizacion que se pueden hacer si confiamos en nuestra gestion de datos de objeto para hacer esta tarea por nosotros. Recuerde que nuestro ID debe ser unico en un contexto determinado si el contexto elegido es el de que los objetos de la misma clase tienen IDENTIFICADOR unico, esto puede ser equiparada a la de los registros en la tabla de haber IDENTIFICADOR unico. La mayoria de las bases de datos tienen cierta facilidad para la generacion secuencial IDENTIFICADOR unico para insertar registros, y que este valor disponible despues de la actualizacion de base de datos. El uso de esta instalacion en nuestra gestion de datos de la capa puede evitar replicar el esfuerzo para garantizar la unicidad, y en el mejor de los casos puede guardar en extrañas operaciones de base de datos para establecer la ID. Si la base de datos elegida carece de tales caracteristicas, a continuacion, una IDENTIFICACION interna de asignacion de esquema dentro de la gestion de los datos de la jerarquia puede ser utilizado.
Listado 1 muestra las extensiones a nuestro Marco de trabajo de la unidad de soporte de Carga y operaciones de Guardar, junto con el esquema de una clase para manejar los datos de acceso a una base de datos a traves de ADO. Se supone que la conexion de ADO y se ha establecido que las rutinas de utilidad se proporcionan dentro de la clase para ejecutar comandos SQL y a manejar de vuelta los datos recibidos. En esta aplicacion las clases descendientes son necesarios para reemplazar el metodo de Carga, y tambien para proporcionar una nueva Insercion y Actualizacion de la aplicacion. Es bastante facil ver que estos tres metodos se deben generar apropiado de codigo SQL y actualizar el objeto de que el conjunto de resultados (o viceversa). Con un poco mas de esfuerzo, es posible colocar mas de trabajo dentro de la generica TADO_DMObject clase en si misma, la imposicion de una mas rigida de la interfaz en las clases descendientes que requiere menos de implementacion. Un ejemplo de esto podria ser el antepasado de la clase de la generacion de comandos SQL de forma dinamica, dado un conjunto de nombres y valores de propiedades.
Nuestra clase especifica de gestion de datos de objetos (tales como TCustomerDM, correspondiente a TCustomer) debe tener un profundo conocimiento sobre el funcionamiento interno de la DP objeto para el que es responsable. En este sentido se pueden considerar como 'amigo' de las clases del dominio del problema objeto, y en Delphi esto significa que las implementaciones deben estar en la misma unidad.
Este articulos del problema
Nuestro diseño requiere un TDMObject a ser proporcionada por cada TPDObject. Donde y cuando se puede de esta disposicion? ¿Que es este problema con este enfoque y, mediante el analisis del patron de las llamadas de metodo a nuestro TDMObjects, ¿como puede evitarse?
((( Listado 1 - gestion de Datos de objetos e interfaces)))
Marco de unidad
interfaz
tipo
& nbsp & nbsp TDMObject = clase
& nbsp & nbsp TPDObject = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp DMObject: TDMObject
& nbsp & nbsp & nbsp & nbsp FID: TObjectID
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp procedimiento Load (const ID: TObjectID)
& nbsp & nbsp & nbsp & nbsp procedimiento de Guardar
& nbsp & nbsp final
& nbsp & nbsp TDMObject = clase
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp procedimiento de Carga (PDObject: TPDObject const ID: TObjectID) virtual resumen
& nbsp & nbsp & nbsp & nbsp funcion Guardar (PDObject: TPDObject): TObjectID virtual resumen
& nbsp & nbsp final
& nbsp & nbsp TADO_DMObject = clase (TDMObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FADO: TADOExpress
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp // Funciones para ayudar a los descendientes de interactuar con la base de datos
& nbsp & nbsp & nbsp & nbsp procedimiento Execute (SQL: String)
& nbsp & nbsp & nbsp & nbsp propiedad ADO: TADOExpress leer FADO
& nbsp & nbsp & nbsp & nbsp // Metodos que los descendientes debe proporcionar
& nbsp & nbsp & nbsp & nbsp funcion Insertar (const PDObject: TPDObject): TObjectID virtual resumen
& nbsp & nbsp & nbsp & nbsp procedimiento de Actualizacion (const PDObject: TPDObject) virtual resumen
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp funcion Guardar (PDObject: TPDObject): TObjectID reemplazar
& nbsp & nbsp final
aplicacion
procedimiento TPDObject.Load (const ID: TObjectID)
begin
& nbsp & nbsp Assert (DMObject <> nil, 'No la Gestion de los Datos del objeto')
& nbsp & nbsp DMObject.De carga (Self, ID)
fin
procedimiento TDMObject.Guardar
begin
& nbsp & nbsp Assert (DMObject <> nil, 'No la Gestion de los Datos del objeto')
& nbsp & nbsp FID := DMObject.Guardar (Auto)
fin
funcion TADO_DMObject.Guardar (PDObject: TPDObject): TObjectID
begin
& nbsp & nbsp si PDObject.ID = NotAssigned, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp Resultado := Insertar (PDObject)
& nbsp & nbsp end else begin
& nbsp & nbsp & nbsp & nbsp Actualizacion (PDObject)
& nbsp & nbsp & nbsp & nbsp Resultado := PDObject.ID
& nbsp & nbsp final
fin
final.
((( Fin del Listado 1 )))
el Siguiente en la serie