La implementación de conjuntos de objetos


En este artículo sigo con mi mirada a la implementación de conjuntos de objetos.
Concisa Personalizado Constructores
En mi último artículo I establece los principios generales que detrás de la aplicación de los conjuntos de objetos con un problema de dominio de clase orientado a actuar como un contenedor de los objetos del negocio en sí. Este se basó en un extendido de gestión de datos de la clase que podría apoyo a la navegación a través de una base de datos dependiente de cursor de algún tipo. Este mes llega a la conclusión de la presente investigación, a través de más detalles de la implementación y vemos que una vez que la aplicación independiente de marco ha sido siempre, el código real que se requiere para un sistema real es muy pequeña.
ya Hemos visto la interfaz propuesta para nuestra clase que controla el conjunto de objetos de negocios, TPDList. Esto ha clásico de Primero, segundo y IsLast métodos que delegar el trabajo a un privado la gestión de datos de objeto, el cual es construido de acuerdo a las necesidades de la lista en cuestión. Este es el código de nuestra base TPDList constructor:
constructor TPDList.Crear (ListDMObject: TDMObject)
begin
& nbsp & nbsp heredado Crear / Estándar/ constructor
& nbsp & nbsp DMObject := ListDMobject // Privado de referencia
fin
Este código muestra que el constructor espera pasar de una gestión de datos de objeto como parámetro. Se espera que este sea del tipo correcto para apoyar a la lista de operaciones para la clase en cuestión, y será proporcionado por la aplicación específica de la lista de constructor. Una vez que esta gestión de datos de objeto se ha pasado a nuestra lista asume toda la responsabilidad de ello y por lo tanto debe liberar en el destructor. De esta forma se rompe una costumbre buena regla del pulgar donde una clase debe ser destruido en el alcance y el contexto en el que fue creado, pero no permite que algunas de ellas particularmente concisa de codificación que facilita la carga cuando la aplicación de estas clases en una aplicación.
Listado 1 muestra la implementación real de un TCustomerList clase que tiene un número de constructores. Como puede verse cada constructor personalizado simplemente llama a la norma heredada constructor, de forma dinámica la construcción de la gestión de datos de objeto requerido. Un punto en particular es que los parámetros se pasan sin cambios para el segundo constructor, mantener la interfaz entre la lógica de negocio y persistencia de las clases de base de datos-neutral. Aparte de la propiedad que devuelve el 'actual' problema objeto de dominio en la lista de convertir a uno de un tipo adecuado, todo esto es la implementación de la lógica de negocio de necesidades para cada nuevo tipo de lista que se requiere. Como puede verse, esta es una muy pequeña cantidad de código, ya que la mayoría de los trabajos que está sucediendo en nuestra aplicación independiente de las clases base.
la Encapsulación de Acceso de Base de datos
la razón por La que nuestra lógica de negocio para el manejo de estas listas es tan ligero, es porque ellos delegar la totalidad de la obra con sus respectivos datos de gestión de objetos. Dependiendo de la base de datos particular que se utiliza para persistir los datos de objeto, la cantidad de trabajo necesario aquí pueden variar enormemente. Afortunadamente, la gran mayoría de los sistemas de estos días almacenar sus datos en un RDBMS, o al menos tener acceso a los datos a través de un lenguaje de consulta, en cuyo caso la aplicación es simple.
Nuestros datos de gestión de la clase tendrá un privado cursor de algún tipo a la base de datos. Estoy asumiendo que este cursor (en este caso) tiene la capacidad para ejecutar una consulta SQL, y recuperar los datos. Este cursor, por supuesto, ser completamente de la base de datos-dependiente, en general, me escoger el más rápido, más conveniente y más fácil de implementar opción para una determinada base de datos. Esto podría ser una API genérica tales como ODBC o ADO, o más generalmente utilizo un enfoque específico, tales como una interfaz para un cliente de la API, tal vez usando un envoltorio (como IBExpress para Interbase acceso). Algunos podrían preguntarse por qué no construir la base de datos completamente la capa de alrededor de una base de datos independiente de la API de ODBC. No hay nada que decir que esta no es una solución viable, pero manteniendo la interfaz a la capa de base de datos totalmente neutral (y objeto) tiene el beneficio de permitir que todos los dichos de la API para ser utilizado, en su caso. La implementación real de la capa de base de datos es, por supuesto, libre de usar cualquier API así lo decide, incluyendo los genéricos, tales como ADO, ODBC o BDE. Cabe destacar que la provisión de nuestra propia base de datos-neutro de la interfaz para la persistencia de objetos no está re-inventando la rueda de nuestra interfaz es muy ligero, de contenedor (generalmente implementados como el patrón de Fachada) en torno a una más funcional de la API a la que el grueso de la obra se delega. La clave es que nuestro contenedor que encapsula la funcionalidad requerida, y facilita la selección de una alternativa de la API de base de datos debe cambiar los requisitos o necesidades lo exijan.
El FirstRecord método en nuestra clase (llamada por el Primer método en el TPDList) simplemente cancela cualquier ejecución de la consulta dentro de la clase y problemas de la correspondiente consulta de selección. El NextRecord será asignada a un método adecuado en la base de datos del cursor, como se la IsLast de la propiedad. Como cada registro en el cursor está en el acceso, la gestión de datos de la clase debe estar preparado para crear y rellenar un negocio adecuado se esperaba un objeto que realiza la llamada TPDList. La población de esta clase a partir de la base de datos del cursor de los campos debe ser compartida con la población de un solo objeto a través del método de Carga, y se logra mejor mediante una llamada a un método abstracto, pasando por la base de datos del cursor y el objeto a ser poblada. Este método debe ser reemplazado por nuestra aplicación específica de gestión de datos de objetos para la actualización de las propiedades conocidas de un negocio específico objeto de campos nombrados en el cursor.
ya Hemos dicho que nuestra gestión de datos las clases serán los constructores que coinciden con los de su dominio del problema de la lista de equivalentes. Suponiendo que nuestra base de datos soporta consultas, todos estos constructores necesita hacer es definir una cadena de consulta que selecciona los registros necesarios de la tabla, de forma dinámica la construcción de la consulta de los parámetros pasados. Para las consultas que se ejecutan con mucha frecuencia, o donde el rendimiento es de suma importancia, es por supuesto posible que este constructor para llamar a un procedimiento almacenado personalizado en la base de datos, paso de parámetros a través de algún formulario práctico (tales como la sustitución de ID de objeto es para hacer referencia a objetos que se pasa como parámetro). El FirstRecord método en nuestra clase va a ser en realidad el responsable de iniciar la ejecución de la consulta (o llamar a un procedimiento almacenado) esta es una buena práctica, ya que mantiene el constructor de una clase ligera. Listado 2 muestra la correspondiente constructores para la CustomerDM (gestión de datos) objeto.
Jerarquías de responsabilidad

que debo pasar finalmente comentario en la jerarquía de clases que intervienen en la gestión de datos secundarios. Nuestra base TDMObject debe mantenerse base de datos independiente, pero debe proporcionar una interfaz en la que el dominio del problema las clases pueden utilizar. Esto se logra proporcionando un número de métodos abstractos de la clase base. Real de la base de datos de las dependencias se introdujo en la costumbre de los descendientes de TDMObject (como TSQLServerDMObject, o TOracleDMObject) que implementar los métodos abstractos, prestar los servicios necesarios para apoyar el acceso de base de datos en contra de su plataforma de destino, y puede proporcionar más métodos abstractos que deben ser implementadas por los descendientes.
de Estas bases de datos específicas de los descendientes son perfectamente derecho a establecer dependencias en otras clases que necesitan para comunicarse con su base de datos elegida el uso adecuado de la API. Normalmente, se dispondrá de una cantidad razonable de la funcionalidad de apoyo a cuestiones tales como el establecimiento de una conexión para el motor, la selección de una base de datos específica, iniciar sesión como un usuario con nombre y así sucesivamente. Cómo lograr tales necesidades es enteramente bajo su propio control: recuerde que nuestra base de TDMObject interfaz es un contrato puramente para los servicios requeridos por el TPDObject y TPDList, y no dicta ninguna de detalles tales como una base de datos de contexto. Esto también significa que nuestra base de datos los objetos específicos puede tomar ventaja de todas las características de la base de datos elegida o API para maximizar la facilidad de uso o el rendimiento, mientras que en reposo fácil en el conocimiento de que una mudanza a otra base de datos todavía es posible sin grandes cambios en el cuerpo principal del código de la aplicación. De hecho, estas clases son independientes de la aplicación, es posible que una base de datos de expertos para incorporar posibles altos niveles de complejidad (para extraer el máximo rendimiento de la API), mientras que la exposición de una sencilla interfaz para la aplicación específica de los usuarios de estas clases.
Uno de los efectos secundarios de esta jerarquía es que nuestra aplicación de gestión de datos de objetos estará fuertemente ligado a la funcionalidad de una base de datos específica de la capa, y por lo tanto un cambio de base de datos requieren una re-implementación de la gestión de datos de objetos. Este impacto puede ser reducido o incluso eliminado completamente, si todas las bases de datos específicas de las clases están diseñadas con idénticos servicios de la experiencia sugiere que, si bien este enfoque es práctico para similar API de base de datos, proporcionando un completo de base de datos independiente de la jerarquía de clases de los límites de las oportunidades para tomar ventaja de una plataforma específica. Por supuesto que es perfectamente posible introducir sub-jerarquías con las mismas interfaces, siendo los más comunes de un conjunto de objetos de base de datos que usan SQL como su principal medio de comunicación. Esto se presta a las jerarquías como la siguiente, donde las tres primeras clases se encuentran dentro del marco (e incluyen la mayor parte del código), y las dos últimas clases son específicos de la aplicación:
TDMObject & #8594 TSQL_DMObject & #8594 TOracleDMObject & #8594 TMyAppDMObject & #8594 TCustomerDM
el Último artículo de la pregunta
me preguntó cómo podemos utilizar nuestra nueva lista de clases para representar el objeto de la relación de 1 a muchos. Un clásico ejemplo de este tipo de relación sería Cliente.Los pedidos, que representa el conjunto de órdenes de compra realizada por un cliente. Como con el resto de nuestra 1-1 y muchos-1 relaciones, lo que los expone como una propiedad de la clase relacionado es agradable y natural manera de hacerlo. La primera pregunta es, ¿cómo pueden ser implementados? La respuesta a esto es muy sencillo, vamos a utilizar el estándar perezoso técnicas de construcción en nuestra propiedad función de descriptor de acceso sólo para crear la lista de la primera vez que es necesario. La lista real a construirse será la correspondiente lista, basada en la relación que se expresan, en este caso queremos construir la lista de Pedidos de un Cliente. El listado 3 muestra una implementación completa de esa relación. El más elocuente característica es el uso de 'ser' para elaborar una lista de los Pedidos de un Cliente específico de la instancia.
La segunda parte de la pregunta era: ¿se puede manejar estas operaciones de forma genérica como hacemos con la más simple de las relaciones (recuerde que hemos implementado un genérico método GetObject en nuestra base TPDObject de clase)? En la cara de ella podría ser capaz de implementar un genérico GetList método, pero en una inspección más cercana, este no es el caso. La razón de esta incapacidad para manejar listas de forma genérica es que queremos llamar a un determinado constructor con parámetros particulares en la lista necesario. Esto requeriría algún tipo de referencia a un constructor de tipo y no hay manera concisa de expresar esta manteniendo control de parámetros de simple. Así que, mientras se puede manejar solo objeto relaciones, genéricamente, no podemos hacer similar para el conjunto de objetos y relaciones, de cada uno de ellos debe ser manejado de forma explícita como se ve en el Listado 1. Como puede verse, la cantidad de código es mínima y por lo tanto no demasiado onerosa tarea.
((( Listado 1 - Personalizado constructores para TCustomerList)))
constructor TCustomerList.CreateAll
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateAll)
fin
constructor TCustomerList.CreateByName (const Nombre: String)
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateByName (Nombre))
fin
constructor TCustomerList.CreateByStockOrder (Elemento: TStockItem)
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateByStockOrder (Elemento))
fin
((( Fin del Listado 1 )))
((( Listado 2 - la Coincidencia de los constructores para la Gestión de Datos de Clientes objeto)))
constructor TCustomerDM.CreateAll
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Clientes ORDER BY Nombre'
fin
constructor TCustomerDM.CreateByName (const Nombre: String)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Cliente where Name LIKE '' Nombre '%'
fin
constructor TCustomerDM.CreateByStockOrder (Elemento: TStockItem)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Cliente DONDE ItemID=' IDToStr (Elemento.ID)
fin
((( Fin del Listado 2 )))
& nbsp ((( Listado 3 - la Aplicación de 1-muchas relaciones )))
tipo
& nbsp & nbsp TCustomer = clase (TPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FOrders: TOrderList
& nbsp & nbsp & nbsp & nbsp función GetOrders: TOrderList
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp propiedad Órdenes: TOrderList leer GetOrders
& nbsp & nbsp final
destructor TCustomer.Destruir
begin
& nbsp & nbsp FOrders.Libre
& nbsp & nbsp heredado
fin
función TCustomer.GetOrders: TOrderList
begin
& nbsp & nbsp si FOrders = nil entonces FOrders := TOrderList.CreateByCustomer (Auto)
& nbsp & nbsp Resultado := FOrders
fin
((( Fin del Listado 3 )))









La implementacion de conjuntos de objetos


La implementacion de conjuntos de objetos : Multi-millones de consejos para hacer su vida mas facil.


En este articulo sigo con mi mirada a la implementacion de conjuntos de objetos.
Concisa Personalizado Constructores
En mi ultimo articulo I establece los principios generales que detras de la aplicacion de los conjuntos de objetos con un problema de dominio de clase orientado a actuar como un contenedor de los objetos del negocio en si. Este se baso en un extendido de gestion de datos de la clase que podria apoyo a la navegacion a traves de una base de datos dependiente de cursor de algun tipo. Este mes llega a la conclusion de la presente investigacion, a traves de mas detalles de la implementacion y vemos que una vez que la aplicacion independiente de marco ha sido siempre, el codigo real que se requiere para un sistema real es muy pequeña.
ya Hemos visto la interfaz propuesta para nuestra clase que controla el conjunto de objetos de negocios, TPDList. Esto ha clasico de Primero, segundo y IsLast metodos que delegar el trabajo a un privado la gestion de datos de objeto, el cual es construido de acuerdo a las necesidades de la lista en cuestion. Este es el codigo de nuestra base TPDList constructor:
constructor TPDList.Crear (ListDMObject: TDMObject)
begin
& nbsp & nbsp heredado Crear / Estandar/ constructor
& nbsp & nbsp DMObject := ListDMobject // Privado de referencia
fin
Este codigo muestra que el constructor espera pasar de una gestion de datos de objeto como parametro. Se espera que este sea del tipo correcto para apoyar a la lista de operaciones para la clase en cuestion, y sera proporcionado por la aplicacion especifica de la lista de constructor. Una vez que esta gestion de datos de objeto se ha pasado a nuestra lista asume toda la responsabilidad de ello y por lo tanto debe liberar en el destructor. De esta forma se rompe una costumbre buena regla del pulgar donde una clase debe ser destruido en el alcance y el contexto en el que fue creado, pero no permite que algunas de ellas particularmente concisa de codificacion que facilita la carga cuando la aplicacion de estas clases en una aplicacion.
Listado 1 muestra la implementacion real de un TCustomerList clase que tiene un numero de constructores. Como puede verse cada constructor personalizado simplemente llama a la norma heredada constructor, de forma dinamica la construccion de la gestion de datos de objeto requerido. Un punto en particular es que los parametros se pasan sin cambios para el segundo constructor, mantener la interfaz entre la logica de negocio y persistencia de las clases de base de datos-neutral. Aparte de la propiedad que devuelve el 'actual' problema objeto de dominio en la lista de convertir a uno de un tipo adecuado, todo esto es la implementacion de la logica de negocio de necesidades para cada nuevo tipo de lista que se requiere. Como puede verse, esta es una muy pequeña cantidad de codigo, ya que la mayoria de los trabajos que esta sucediendo en nuestra aplicacion independiente de las clases base.
la Encapsulacion de Acceso de Base de datos
la razon por La que nuestra logica de negocio para el manejo de estas listas es tan ligero, es porque ellos delegar la totalidad de la obra con sus respectivos datos de gestion de objetos. Dependiendo de la base de datos particular que se utiliza para persistir los datos de objeto, la cantidad de trabajo necesario aqui pueden variar enormemente. Afortunadamente, la gran mayoria de los sistemas de estos dias almacenar sus datos en un RDBMS, o al menos tener acceso a los datos a traves de un lenguaje de consulta, en cuyo caso la aplicacion es simple.
Nuestros datos de gestion de la clase tendra un privado cursor de algun tipo a la base de datos. Estoy asumiendo que este cursor (en este caso) tiene la capacidad para ejecutar una consulta SQL, y recuperar los datos. Este cursor, por supuesto, ser completamente de la base de datos-dependiente, en general, me escoger el mas rapido, mas conveniente y mas facil de implementar opcion para una determinada base de datos. Esto podria ser una API generica tales como ODBC o ADO, o mas generalmente utilizo un enfoque especifico, tales como una interfaz para un cliente de la API, tal vez usando un envoltorio (como IBExpress para Interbase acceso). Algunos podrian preguntarse por que no construir la base de datos completamente la capa de alrededor de una base de datos independiente de la API de ODBC. No hay nada que decir que esta no es una solucion viable, pero manteniendo la interfaz a la capa de base de datos totalmente neutral (y objeto) tiene el beneficio de permitir que todos los dichos de la API para ser utilizado, en su caso. La implementacion real de la capa de base de datos es, por supuesto, libre de usar cualquier API asi lo decide, incluyendo los genericos, tales como ADO, ODBC o BDE. Cabe destacar que la provision de nuestra propia base de datos-neutro de la interfaz para la persistencia de objetos no esta re-inventando la rueda de nuestra interfaz es muy ligero, de contenedor (generalmente implementados como el patron de Fachada) en torno a una mas funcional de la API a la que el grueso de la obra se delega. La clave es que nuestro contenedor que encapsula la funcionalidad requerida, y facilita la seleccion de una alternativa de la API de base de datos debe cambiar los requisitos o necesidades lo exijan.
El FirstRecord metodo en nuestra clase (llamada por el Primer metodo en el TPDList) simplemente cancela cualquier ejecucion de la consulta dentro de la clase y problemas de la correspondiente consulta de seleccion. El NextRecord sera asignada a un metodo adecuado en la base de datos del cursor, como se la IsLast de la propiedad. Como cada registro en el cursor esta en el acceso, la gestion de datos de la clase debe estar preparado para crear y rellenar un negocio adecuado se esperaba un objeto que realiza la llamada TPDList. La poblacion de esta clase a partir de la base de datos del cursor de los campos debe ser compartida con la poblacion de un solo objeto a traves del metodo de Carga, y se logra mejor mediante una llamada a un metodo abstracto, pasando por la base de datos del cursor y el objeto a ser poblada. Este metodo debe ser reemplazado por nuestra aplicacion especifica de gestion de datos de objetos para la actualizacion de las propiedades conocidas de un negocio especifico objeto de campos nombrados en el cursor.
ya Hemos dicho que nuestra gestion de datos las clases seran los constructores que coinciden con los de su dominio del problema de la lista de equivalentes. Suponiendo que nuestra base de datos soporta consultas, todos estos constructores necesita hacer es definir una cadena de consulta que selecciona los registros necesarios de la tabla, de forma dinamica la construccion de la consulta de los parametros pasados. Para las consultas que se ejecutan con mucha frecuencia, o donde el rendimiento es de suma importancia, es por supuesto posible que este constructor para llamar a un procedimiento almacenado personalizado en la base de datos, paso de parametros a traves de algun formulario practico (tales como la sustitucion de ID de objeto es para hacer referencia a objetos que se pasa como parametro). El FirstRecord metodo en nuestra clase va a ser en realidad el responsable de iniciar la ejecucion de la consulta (o llamar a un procedimiento almacenado) esta es una buena practica, ya que mantiene el constructor de una clase ligera. Listado 2 muestra la correspondiente constructores para la CustomerDM (gestion de datos) objeto.
Jerarquias de responsabilidad

que debo pasar finalmente comentario en la jerarquia de clases que intervienen en la gestion de datos secundarios. Nuestra base TDMObject debe mantenerse base de datos independiente, pero debe proporcionar una interfaz en la que el dominio del problema las clases pueden utilizar. Esto se logra proporcionando un numero de metodos abstractos de la clase base. Real de la base de datos de las dependencias se introdujo en la costumbre de los descendientes de TDMObject (como TSQLServerDMObject, o TOracleDMObject) que implementar los metodos abstractos, prestar los servicios necesarios para apoyar el acceso de base de datos en contra de su plataforma de destino, y puede proporcionar mas metodos abstractos que deben ser implementadas por los descendientes.
de Estas bases de datos especificas de los descendientes son perfectamente derecho a establecer dependencias en otras clases que necesitan para comunicarse con su base de datos elegida el uso adecuado de la API. Normalmente, se dispondra de una cantidad razonable de la funcionalidad de apoyo a cuestiones tales como el establecimiento de una conexion para el motor, la seleccion de una base de datos especifica, iniciar sesion como un usuario con nombre y asi sucesivamente. Como lograr tales necesidades es enteramente bajo su propio control: recuerde que nuestra base de TDMObject interfaz es un contrato puramente para los servicios requeridos por el TPDObject y TPDList, y no dicta ninguna de detalles tales como una base de datos de contexto. Esto tambien significa que nuestra base de datos los objetos especificos puede tomar ventaja de todas las caracteristicas de la base de datos elegida o API para maximizar la facilidad de uso o el rendimiento, mientras que en reposo facil en el conocimiento de que una mudanza a otra base de datos todavia es posible sin grandes cambios en el cuerpo principal del codigo de la aplicacion. De hecho, estas clases son independientes de la aplicacion, es posible que una base de datos de expertos para incorporar posibles altos niveles de complejidad (para extraer el maximo rendimiento de la API), mientras que la exposicion de una sencilla interfaz para la aplicacion especifica de los usuarios de estas clases.
Uno de los efectos secundarios de esta jerarquia es que nuestra aplicacion de gestion de datos de objetos estara fuertemente ligado a la funcionalidad de una base de datos especifica de la capa, y por lo tanto un cambio de base de datos requieren una re-implementacion de la gestion de datos de objetos. Este impacto puede ser reducido o incluso eliminado completamente, si todas las bases de datos especificas de las clases estan diseñadas con identicos servicios de la experiencia sugiere que, si bien este enfoque es practico para similar API de base de datos, proporcionando un completo de base de datos independiente de la jerarquia de clases de los limites de las oportunidades para tomar ventaja de una plataforma especifica. Por supuesto que es perfectamente posible introducir sub-jerarquias con las mismas interfaces, siendo los mas comunes de un conjunto de objetos de base de datos que usan SQL como su principal medio de comunicacion. Esto se presta a las jerarquias como la siguiente, donde las tres primeras clases se encuentran dentro del marco (e incluyen la mayor parte del codigo), y las dos ultimas clases son especificos de la aplicacion:
TDMObject & #8594 TSQL_DMObject & #8594 TOracleDMObject & #8594 TMyAppDMObject & #8594 TCustomerDM
el Ultimo articulo de la pregunta
me pregunto como podemos utilizar nuestra nueva lista de clases para representar el objeto de la relacion de 1 a muchos. Un clasico ejemplo de este tipo de relacion seria Cliente.Los pedidos, que representa el conjunto de ordenes de compra realizada por un cliente. Como con el resto de nuestra 1-1 y muchos-1 relaciones, lo que los expone como una propiedad de la clase relacionado es agradable y natural manera de hacerlo. La primera pregunta es, ¿como pueden ser implementados? La respuesta a esto es muy sencillo, vamos a utilizar el estandar perezoso tecnicas de construccion en nuestra propiedad funcion de descriptor de acceso solo para crear la lista de la primera vez que es necesario. La lista real a construirse sera la correspondiente lista, basada en la relacion que se expresan, en este caso queremos construir la lista de Pedidos de un Cliente. El listado 3 muestra una implementacion completa de esa relacion. El mas elocuente caracteristica es el uso de 'ser' para elaborar una lista de los Pedidos de un Cliente especifico de la instancia.
La segunda parte de la pregunta era: ¿se puede manejar estas operaciones de forma generica como hacemos con la mas simple de las relaciones (recuerde que hemos implementado un generico metodo GetObject en nuestra base TPDObject de clase)? En la cara de ella podria ser capaz de implementar un generico GetList metodo, pero en una inspeccion mas cercana, este no es el caso. La razon de esta incapacidad para manejar listas de forma generica es que queremos llamar a un determinado constructor con parametros particulares en la lista necesario. Esto requeriria algun tipo de referencia a un constructor de tipo y no hay manera concisa de expresar esta manteniendo control de parametros de simple. Asi que, mientras se puede manejar solo objeto relaciones, genericamente, no podemos hacer similar para el conjunto de objetos y relaciones, de cada uno de ellos debe ser manejado de forma explicita como se ve en el Listado 1. Como puede verse, la cantidad de codigo es minima y por lo tanto no demasiado onerosa tarea.
((( Listado 1 - Personalizado constructores para TCustomerList)))
constructor TCustomerList.CreateAll
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateAll)
fin
constructor TCustomerList.CreateByName (const Nombre: String)
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateByName (Nombre))
fin
constructor TCustomerList.CreateByStockOrder (Elemento: TStockItem)
begin
& nbsp & nbsp heredado Crear (TCustomerDM.CreateByStockOrder (Elemento))
fin
((( Fin del Listado 1 )))
((( Listado 2 - la Coincidencia de los constructores para la Gestion de Datos de Clientes objeto)))
constructor TCustomerDM.CreateAll
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Clientes ORDER BY Nombre'
fin
constructor TCustomerDM.CreateByName (const Nombre: String)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Cliente where Name LIKE '' Nombre '%'
fin
constructor TCustomerDM.CreateByStockOrder (Elemento: TStockItem)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Consulta := 'SELECT * FROM Cliente DONDE ItemID=' IDToStr (Elemento.ID)
fin
((( Fin del Listado 2 )))
& nbsp ((( Listado 3 - la Aplicacion de 1-muchas relaciones )))
tipo
& nbsp & nbsp TCustomer = clase (TPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FOrders: TOrderList
& nbsp & nbsp & nbsp & nbsp funcion GetOrders: TOrderList
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp propiedad Ordenes: TOrderList leer GetOrders
& nbsp & nbsp final
destructor TCustomer.Destruir
begin
& nbsp & nbsp FOrders.Libre
& nbsp & nbsp heredado
fin
funcion TCustomer.GetOrders: TOrderList
begin
& nbsp & nbsp si FOrders = nil entonces FOrders := TOrderList.CreateByCustomer (Auto)
& nbsp & nbsp Resultado := FOrders
fin
((( Fin del Listado 3 )))


La implementación de conjuntos de objetos

La implementación de conjuntos de objetos : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación