Simple objeto de las relaciones
los objetos de Negocio como para exponer a sí mismos y a sus relaciones. En este artículo te mostrará cómo.
Simple Objeto de las Relaciones
En el último artículo vimos cómo el clásico de Stock, Orden y requerimientos del Cliente podría ser modelado como tres objetos de negocio, cada uno exponiendo su estado a través de propiedades definidas. Aunque estos objetos pueden ahora usarse como está (aunque de manera muy limitada - todavía no hemos definido cómo hacer que su información persistente!), carecen de cualquier concepto de las relaciones. En otras palabras, ¿cómo sabemos que el Cliente coloca un Pedido, y para que StockItem?
está iluminando en esta etapa para hacer una pausa y pensar acerca de cómo esto tradicionalmente se manejan en un no-OO, centrado en los datos de la moda. Normalmente, un registro de base de datos que representa el Orden expondría a los otros dos campos, uno almacenar una clave externa a la tabla de Clientes, y otro para el StockItem tabla. Una de las deficiencias de este enfoque ya ha sido demostrado: todos los campos de base de datos están expuestos en el mismo grado, no existe el concepto de un campo de los que más 'privado' que otro. Por supuesto, es posible expresar esto en cierta medida con una vista de base de datos, pero en los datos en bruto a nivel de campos no pueden ser distinguidos en términos de visibilidad o de papel, excepto por el nombre, y de esa manera locura mentiras.
veamos ahora cómo podríamos acceder a la información sobre el cliente que colocó una orden dado en este modelo tradicional. Suponiendo que tenemos la información acerca de la orden en algún tipo de conjunto de datos (tal vez un TQuery), podemos inspeccionar el valor del cliente de campo de clave externa, la construcción de una nueva consulta de selección de la tabla de Cliente basado en este valor y, a continuación, inspeccione los datos devueltos. Tenga en cuenta que esta es realmente una gran cantidad de código a escribir, que requieren por lo menos un objeto local (el cliente del conjunto de datos) para ser construido, y dicho código prolifera rápidamente si necesitamos acceder a la stock u otros datos relacionados con los elementos. Una alternativa a este enfoque es seleccionar todos los datos en una sola consulta con un multi-tabla de unión. Esto supera la cantidad de código escrito, pero introduce otro tema - el duro de codificación de los datos de las relaciones dentro de la cadena de consulta. En otra cosa que una aplicación trivial tales expresiones se repiten en diferentes lugares a través de la fuente - y vale la pena señalar que el compilador no puede hacer nada para ayudar en la corrección de dichas consultas. Si el cambio de la base de datos fundamentales (tal vez cambiar el nombre o el tipo de campo de clave externa de una tabla), entonces es necesario recurrir a la aplicación de búsqueda y reemplazo técnicas para encontrar las ocurrencias que puede ser que necesite actualizar. En esta situación es muy posible que algunos accede con poca frecuencia formulario se caen a través de la red y tendrán una fecha de salida de una referencia a un campo que ya no existe. Este es un error de tiempo de ejecución esperando a suceder. Es posible que tal estas consultas en un sistema centralizado módulo de datos, pero eso es sólo la geografía, y requiere cuidado para que las dos partes separadas de la aplicación no intenta utilizar la misma consulta simultáneamente.
de Vuelta en el ordenado mundo de bien construidos los objetos de negocio de exponer el equivalente de una clave externa (en la forma de nuestra TObjectID) como una propiedad pública es anatema. Listado 1 muestra cómo se vería y un vistazo rápido muestra que hemos adulterado nuestra interfaz pública con detalles que preferimos no arriesgar. Después de todo, si tales propiedades se hizo público entonces todo el mundo puede asumir que ellos tienen el derecho a uso de ellos.
Hacerlo con objetos
la orientación a Objetos nos ofrece una manera mucho más natural de expresar estas relaciones, más que a través implícito de clave externa campos - en realidad podemos exponer el objeto relacionado como una propiedad. Esto nos permite el uso de tales construcciones como el Orden.El cliente y el Orden.StockItem para acceder a los objetos de nuestra orden. Tenga en cuenta que esta es una forma natural y concisa la forma de expresar las relaciones y totalmente oculta los detalles de implementación. Si nuestro secundaria objetos de exponer las relaciones (como la empresa de un cliente), a continuación, encontrar el despacho de dirección, una orden puede ser tan simple como usar el Orden.Cliente.De la empresa.Dirección, una muy potente construir. Vale la pena señalar que si más tarde decide quitar la Compañía de relación (o, de hecho, cambiar la forma en que se implementa, entonces el compilador detectará cada instancia lo largo de la aplicación donde se utiliza incorrectamente, y la compilación fallará hasta que todos los problemas se abordan. Ya la orientación a objetos ha colaborado con nosotros para ayudar a ofrecer una más fiable de la aplicación: podemos hacer afirmaciones sobre el hecho de que todos los cambios se han hecho.
Suponiendo que vamos a exponer a nuestros objetos relacionados como propiedades, cómo va a ser esta implementado? Obviamente, vamos a necesitar a un privado 'marcador de posición' campo para almacenar una referencia al objeto relacionado. Un enfoque simplista sería crear este objeto relacionado en el constructor y simplemente tienen la propiedad señalando el campo privado. Este enfoque tiene dos problemas principales - uno indeseables y la otra catastrófica. El indeseables problema es que vamos a incurrir en la carga de la construcción de este objeto relacionado cada vez que construimos el padre. Suponiendo que rellenar las propiedades del objeto relacionado de almacenamiento persistente, que nos han impactado en el rendimiento en tiempo de ejecución de nuestra aplicación con la sobrecarga de la construcción de una nueva instancia y hacer una base de datos de access. En general, vale la pena tomar un poco de cuidado para mantener el constructor tan ligero como sea posible. La ampliación de esta situación, se puede observar que si la construcción de Un objeto hace que la creación de instancias de objeto B, cuyo propio constructor hace que la creación de instancias del mismo objeto, a continuación, vamos a entrar en el mundo de la recursividad infinita y la primera cosa que un usuario va a ver es un mensaje de error de memoria. Esta situación no es más que la muy común 1-1 de relaciones de la entidad.
La solución a este problema es una técnica conocida como construir en la demanda, o perezoso de la construcción. Este utiliza la idea de retrasar la construcción del objeto hasta justo antes de la primera vez es necesario. Para futuros accesos a la ya objeto instanciado es devuelta. Esto retrasa las costosas operaciones hasta el último momento posible, mientras que los restantes transparente para todos los usuarios de nuestra clase. Listado 2 muestra cómo esto puede ser implementado. Por el momento, vamos a suponer que todos nuestros TPDObjects ofrecer un método de Carga que rellena las propiedades del objeto de algún tipo de almacenamiento persistente, dado un relevante único ID del objeto.
Aprovechando el poder de los objetos
Este aparece para resolver nuestro problema de la cascada de la construcción, y es una técnica que puede ser utilizado con gran efecto con la propiedad (no sólo de los objetos de negocio) que es potencialmente costoso para la construcción. Sin embargo, vamos a pensar acerca de lo que va a suceder cuando se aplica esta técnica a otros objetos de negocio. ¿Cuál será el código para la función de descriptor de acceso de Orden.StockItem aspecto, o, de hecho, el caso general de X. Y? El resultado será muy similar a la Lista 2, sustituyendo nuevas referencias para los campos privados y, fundamentalmente, del tipo de la clase que se está construyendo. En lugar de repetir el código similar (y correr el riesgo de no aplicación de todas esas funciones de descriptor de acceso de forma idéntica), ¿hay alguna forma en que podemos usar el poder de nuestra jerarquía de objetos para reducir esta codificación de la carga? Como era de esperar, la respuesta es un rotundo sí.
Lo que nos gustaría hacer es proporcionar algún tipo de función de utilidad en nuestra base TPDObject clase (parte de nuestra aplicación independiente de marco) que realiza la misma función pero se puede parametrizar de alguna manera. Los aspectos más destacados que tendremos que pasar como parámetros son el marcador de posición para el objeto que se construye, el número de IDENTIFICACIÓN que deben ser cargados, y de alguna manera de la construcción de la clase correcta. Para lograr este último parámetro se utilizará un constructo denominado una referencia de la clase, que es una variable que contiene un tipo específico, como parte de una jerarquía de clases. En Delphi, esto se define con la clase de palabra clave. El listado 3 muestra los cambios en nuestro Marco de trabajo de la unidad para proporcionar esta funcionalidad. Tenga en cuenta que la instancia del objeto realmente será actualizado en la rutina y este es, por tanto, una de las pocas ocasiones en las que un objeto debe ser pasado como parámetro var.
otro elemento de la nota es que el constructor TPDObject ahora ha sido definida como virtual. Sin esta nuestra rutina genérica no sería capaz de llamar a un determinado constructor de la clase, y siempre construir clases de tipo TPDObject. Este es el mismo enfoque que se utiliza para los componentes en Delphi, y la consecuencia es la misma: todos nuestros constructores de nuestro TPDObject descendientes debe usar ahora el reemplazar palabra clave.
¿Cómo va nuestro descriptor de acceso de las funciones de nuestros objetos de negocio ahora el uso de este método? Sus interfaces debe seguir siendo la misma, sin parámetros. Sin embargo, podemos implementar la llamada en una sola línea de código como se muestra en el Listado 4. Dos factores que deben ser resaltadas: el resultado de la llamada debe ser encasillado a TCustomer como se devuelve un tipo TPDObject, aunque la instancia real será del tipo correcto. En segundo lugar, el privado FCustomer campo se debe cambiar el tipo de TPDObject. Esto es debido a que Delphi insiste en que el var parámetros son exactamente el tipo esperado. En ambos casos se trata de la seguridad de las operaciones como son los detalles privado y que están garantizados para ser devueltos una clase del tipo esperado, incluso si el antepasado de la clase no tiene conocimiento de ellos. Ahora somos capaces de ejecutar todas esas relaciones en una sola línea de código, mediante un sistema centralizado independiente de la aplicación de rutina. Los beneficios de un verdadero OO de desarrollo están empezando a darse a conocer. Habiendo construido estos relacionados con los objetos de negocio, debemos asegurarnos de que ellos son destruidos. Un enfoque simple es colocar estándar de llamadas de conexión en el destructor: la protección de la Libre voluntad de asegurarse de que nada malo va a pasar si el objeto no ha sido construido (Libre en un objeto nil es un margen de operación).
el Último artículo del problema
Anteriormente me he referido a el conjunto de clases que no debe ser utilizado en un 'verdadero' OO aplicación. Figura 1 en la columna del mes pasado muestra que los elementos de la interfaz no puede interactuar con la capa de persistencia, sólo el dominio del problema. Datos de componentes para romper esta regla, el envío de los cambios directamente a la conexión de base de datos, y por lo tanto (polémico) no debe ser utilizado. Hay muchos, mejor, alternativas y estos se investigó en futuras columnas.
((( Listado 1 - Adulterar una clase con propiedades para que las relaciones de apoyo)))
tipo
& nbsp & nbsp TOrder = clase (TMyAppPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FCustomerID: TObjectID
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp propiedad Idcliente: TObjectID leer FCustomerID
& nbsp & nbsp & nbsp & nbsp ... // Otras propiedades de seguir...
& nbsp & nbsp final
((( Fin del Listado 1 )))
((( Listado 2 - el Uso de perezoso construcción de objetos relacionados)))
tipo
& nbsp & nbsp TOrder = clase (TMyAppPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FCustomerID: TObjectID
& nbsp & nbsp & nbsp & nbsp FCustomer: TCustomer
& nbsp & nbsp & nbsp & nbsp función GetCustomer: TCustomer
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp propiedad del Cliente: TCustomer leer GetCustomer
& nbsp & nbsp & nbsp & nbsp ... // Otras propiedades de seguir...
& nbsp & nbsp final
función TOrder.GetCustomer: TCustomer
begin
& nbsp & nbsp si FCustomer = nil then begin
& nbsp & nbsp & nbsp & nbsp FCustomer := TCustomer.Crear
& nbsp & nbsp & nbsp & nbsp FCustomer.De carga (FCustomerID)
& nbsp & nbsp final
& nbsp & nbsp Resultado := FCustomer
fin
((( Fin del Listado 2 )))
((( Listado 3 - Genérico perezoso construcción de objetos relacionados)))
tipo
& nbsp & nbsp TPDClass = clase de TPDObject
& nbsp & nbsp TPDObject = clase
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp función GetObject (const ClassType: TPDClass var PDObject: TPDObject const ID: TObjectID): TPDObject
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp constructor Create virtual
& nbsp & nbsp & nbsp & nbsp procedimiento de Carga (ID: TObjectID)
& nbsp & nbsp final
función TPDObject.GetObject (const ClassType: TPDClass var PDObject: TPDObject const ID: TObjectID): TPDObject
begin
& nbsp & nbsp si PDObject = nil then begin
& nbsp & nbsp & nbsp & nbsp PDObject := ClassType.Crear
& nbsp & nbsp & nbsp & nbsp si ID <> NotAssigned luego PDObject.De carga (ID)
& nbsp & nbsp final
& nbsp & nbsp Resultado := PDObject
fin
& nbsp ((( Fin del Listado 3 )))
((( Listado 4 - Nuestro nuevo TOrder.Cliente descriptor de acceso a la función)))
función TOrder.GetCustomer: TCustomer
begin
& nbsp & nbsp Resultado := TCustomer (GetObject (TCustomer, FCustomer, FCustomerID))
fin
((( Final Listado 4 )))
el Siguiente en la serie
Simple objeto de las relaciones
Simple objeto de las relaciones : Multi-millones de consejos para hacer su vida mas facil.
los objetos de Negocio como para exponer a si mismos y a sus relaciones. En este articulo te mostrara como.
Simple Objeto de las Relaciones
En el ultimo articulo vimos como el clasico de Stock, Orden y requerimientos del Cliente podria ser modelado como tres objetos de negocio, cada uno exponiendo su estado a traves de propiedades definidas. Aunque estos objetos pueden ahora usarse como esta (aunque de manera muy limitada - todavia no hemos definido como hacer que su informacion persistente!), carecen de cualquier concepto de las relaciones. En otras palabras, ¿como sabemos que el Cliente coloca un Pedido, y para que StockItem?
esta iluminando en esta etapa para hacer una pausa y pensar acerca de como esto tradicionalmente se manejan en un no-OO, centrado en los datos de la moda. Normalmente, un registro de base de datos que representa el Orden expondria a los otros dos campos, uno almacenar una clave externa a la tabla de Clientes, y otro para el StockItem tabla. Una de las deficiencias de este enfoque ya ha sido demostrado: todos los campos de base de datos estan expuestos en el mismo grado, no existe el concepto de un campo de los que mas 'privado' que otro. Por supuesto, es posible expresar esto en cierta medida con una vista de base de datos, pero en los datos en bruto a nivel de campos no pueden ser distinguidos en terminos de visibilidad o de papel, excepto por el nombre, y de esa manera locura mentiras.
veamos ahora como podriamos acceder a la informacion sobre el cliente que coloco una orden dado en este modelo tradicional. Suponiendo que tenemos la informacion acerca de la orden en algun tipo de conjunto de datos (tal vez un TQuery), podemos inspeccionar el valor del cliente de campo de clave externa, la construccion de una nueva consulta de seleccion de la tabla de Cliente basado en este valor y, a continuacion, inspeccione los datos devueltos. Tenga en cuenta que esta es realmente una gran cantidad de codigo a escribir, que requieren por lo menos un objeto local (el cliente del conjunto de datos) para ser construido, y dicho codigo prolifera rapidamente si necesitamos acceder a la stock u otros datos relacionados con los elementos. Una alternativa a este enfoque es seleccionar todos los datos en una sola consulta con un multi-tabla de union. Esto supera la cantidad de codigo escrito, pero introduce otro tema - el duro de codificacion de los datos de las relaciones dentro de la cadena de consulta. En otra cosa que una aplicacion trivial tales expresiones se repiten en diferentes lugares a traves de la fuente - y vale la pena señalar que el compilador no puede hacer nada para ayudar en la correccion de dichas consultas. Si el cambio de la base de datos fundamentales (tal vez cambiar el nombre o el tipo de campo de clave externa de una tabla), entonces es necesario recurrir a la aplicacion de busqueda y reemplazo tecnicas para encontrar las ocurrencias que puede ser que necesite actualizar. En esta situacion es muy posible que algunos accede con poca frecuencia formulario se caen a traves de la red y tendran una fecha de salida de una referencia a un campo que ya no existe. Este es un error de tiempo de ejecucion esperando a suceder. Es posible que tal estas consultas en un sistema centralizado modulo de datos, pero eso es solo la geografia, y requiere cuidado para que las dos partes separadas de la aplicacion no intenta utilizar la misma consulta simultaneamente.
de Vuelta en el ordenado mundo de bien construidos los objetos de negocio de exponer el equivalente de una clave externa (en la forma de nuestra TObjectID) como una propiedad publica es anatema. Listado 1 muestra como se veria y un vistazo rapido muestra que hemos adulterado nuestra interfaz publica con detalles que preferimos no arriesgar. Despues de todo, si tales propiedades se hizo publico entonces todo el mundo puede asumir que ellos tienen el derecho a uso de ellos.
Hacerlo con objetos
la orientacion a Objetos nos ofrece una manera mucho mas natural de expresar estas relaciones, mas que a traves implicito de clave externa campos - en realidad podemos exponer el objeto relacionado como una propiedad. Esto nos permite el uso de tales construcciones como el Orden.El cliente y el Orden.StockItem para acceder a los objetos de nuestra orden. Tenga en cuenta que esta es una forma natural y concisa la forma de expresar las relaciones y totalmente oculta los detalles de implementacion. Si nuestro secundaria objetos de exponer las relaciones (como la empresa de un cliente), a continuacion, encontrar el despacho de direccion, una orden puede ser tan simple como usar el Orden.Cliente.De la empresa.Direccion, una muy potente construir. Vale la pena señalar que si mas tarde decide quitar la Compañia de relacion (o, de hecho, cambiar la forma en que se implementa, entonces el compilador detectara cada instancia lo largo de la aplicacion donde se utiliza incorrectamente, y la compilacion fallara hasta que todos los problemas se abordan. Ya la orientacion a objetos ha colaborado con nosotros para ayudar a ofrecer una mas fiable de la aplicacion: podemos hacer afirmaciones sobre el hecho de que todos los cambios se han hecho.
Suponiendo que vamos a exponer a nuestros objetos relacionados como propiedades, como va a ser esta implementado? Obviamente, vamos a necesitar a un privado 'marcador de posicion' campo para almacenar una referencia al objeto relacionado. Un enfoque simplista seria crear este objeto relacionado en el constructor y simplemente tienen la propiedad señalando el campo privado. Este enfoque tiene dos problemas principales - uno indeseables y la otra catastrofica. El indeseables problema es que vamos a incurrir en la carga de la construccion de este objeto relacionado cada vez que construimos el padre. Suponiendo que rellenar las propiedades del objeto relacionado de almacenamiento persistente, que nos han impactado en el rendimiento en tiempo de ejecucion de nuestra aplicacion con la sobrecarga de la construccion de una nueva instancia y hacer una base de datos de access. En general, vale la pena tomar un poco de cuidado para mantener el constructor tan ligero como sea posible. La ampliacion de esta situacion, se puede observar que si la construccion de Un objeto hace que la creacion de instancias de objeto B, cuyo propio constructor hace que la creacion de instancias del mismo objeto, a continuacion, vamos a entrar en el mundo de la recursividad infinita y la primera cosa que un usuario va a ver es un mensaje de error de memoria. Esta situacion no es mas que la muy comun 1-1 de relaciones de la entidad.
La solucion a este problema es una tecnica conocida como construir en la demanda, o perezoso de la construccion. Este utiliza la idea de retrasar la construccion del objeto hasta justo antes de la primera vez es necesario. Para futuros accesos a la ya objeto instanciado es devuelta. Esto retrasa las costosas operaciones hasta el ultimo momento posible, mientras que los restantes transparente para todos los usuarios de nuestra clase. Listado 2 muestra como esto puede ser implementado. Por el momento, vamos a suponer que todos nuestros TPDObjects ofrecer un metodo de Carga que rellena las propiedades del objeto de algun tipo de almacenamiento persistente, dado un relevante unico ID del objeto.
Aprovechando el poder de los objetos
Este aparece para resolver nuestro problema de la cascada de la construccion, y es una tecnica que puede ser utilizado con gran efecto con la propiedad (no solo de los objetos de negocio) que es potencialmente costoso para la construccion. Sin embargo, vamos a pensar acerca de lo que va a suceder cuando se aplica esta tecnica a otros objetos de negocio. ¿Cual sera el codigo para la funcion de descriptor de acceso de Orden.StockItem aspecto, o, de hecho, el caso general de X. Y? El resultado sera muy similar a la Lista 2, sustituyendo nuevas referencias para los campos privados y, fundamentalmente, del tipo de la clase que se esta construyendo. En lugar de repetir el codigo similar (y correr el riesgo de no aplicacion de todas esas funciones de descriptor de acceso de forma identica), ¿hay alguna forma en que podemos usar el poder de nuestra jerarquia de objetos para reducir esta codificacion de la carga? Como era de esperar, la respuesta es un rotundo si.
Lo que nos gustaria hacer es proporcionar algun tipo de funcion de utilidad en nuestra base TPDObject clase (parte de nuestra aplicacion independiente de marco) que realiza la misma funcion pero se puede parametrizar de alguna manera. Los aspectos mas destacados que tendremos que pasar como parametros son el marcador de posicion para el objeto que se construye, el numero de IDENTIFICACION que deben ser cargados, y de alguna manera de la construccion de la clase correcta. Para lograr este ultimo parametro se utilizara un constructo denominado una referencia de la clase, que es una variable que contiene un tipo especifico, como parte de una jerarquia de clases. En Delphi, esto se define con la clase de palabra clave. El listado 3 muestra los cambios en nuestro Marco de trabajo de la unidad para proporcionar esta funcionalidad. Tenga en cuenta que la instancia del objeto realmente sera actualizado en la rutina y este es, por tanto, una de las pocas ocasiones en las que un objeto debe ser pasado como parametro var.
otro elemento de la nota es que el constructor TPDObject ahora ha sido definida como virtual. Sin esta nuestra rutina generica no seria capaz de llamar a un determinado constructor de la clase, y siempre construir clases de tipo TPDObject. Este es el mismo enfoque que se utiliza para los componentes en Delphi, y la consecuencia es la misma: todos nuestros constructores de nuestro TPDObject descendientes debe usar ahora el reemplazar palabra clave.
¿Como va nuestro descriptor de acceso de las funciones de nuestros objetos de negocio ahora el uso de este metodo? Sus interfaces debe seguir siendo la misma, sin parametros. Sin embargo, podemos implementar la llamada en una sola linea de codigo como se muestra en el Listado 4. Dos factores que deben ser resaltadas: el resultado de la llamada debe ser encasillado a TCustomer como se devuelve un tipo TPDObject, aunque la instancia real sera del tipo correcto. En segundo lugar, el privado FCustomer campo se debe cambiar el tipo de TPDObject. Esto es debido a que Delphi insiste en que el var parametros son exactamente el tipo esperado. En ambos casos se trata de la seguridad de las operaciones como son los detalles privado y que estan garantizados para ser devueltos una clase del tipo esperado, incluso si el antepasado de la clase no tiene conocimiento de ellos. Ahora somos capaces de ejecutar todas esas relaciones en una sola linea de codigo, mediante un sistema centralizado independiente de la aplicacion de rutina. Los beneficios de un verdadero OO de desarrollo estan empezando a darse a conocer. Habiendo construido estos relacionados con los objetos de negocio, debemos asegurarnos de que ellos son destruidos. Un enfoque simple es colocar estandar de llamadas de conexion en el destructor: la proteccion de la Libre voluntad de asegurarse de que nada malo va a pasar si el objeto no ha sido construido (Libre en un objeto nil es un margen de operacion).
el Ultimo articulo del problema
Anteriormente me he referido a el conjunto de clases que no debe ser utilizado en un 'verdadero' OO aplicacion. Figura 1 en la columna del mes pasado muestra que los elementos de la interfaz no puede interactuar con la capa de persistencia, solo el dominio del problema. Datos de componentes para romper esta regla, el envio de los cambios directamente a la conexion de base de datos, y por lo tanto (polemico) no debe ser utilizado. Hay muchos, mejor, alternativas y estos se investigo en futuras columnas.
((( Listado 1 - Adulterar una clase con propiedades para que las relaciones de apoyo)))
tipo
& nbsp & nbsp TOrder = clase (TMyAppPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FCustomerID: TObjectID
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp propiedad Idcliente: TObjectID leer FCustomerID
& nbsp & nbsp & nbsp & nbsp ... // Otras propiedades de seguir...
& nbsp & nbsp final
((( Fin del Listado 1 )))
((( Listado 2 - el Uso de perezoso construccion de objetos relacionados)))
tipo
& nbsp & nbsp TOrder = clase (TMyAppPDObject)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FCustomerID: TObjectID
& nbsp & nbsp & nbsp & nbsp FCustomer: TCustomer
& nbsp & nbsp & nbsp & nbsp funcion GetCustomer: TCustomer
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp propiedad del Cliente: TCustomer leer GetCustomer
& nbsp & nbsp & nbsp & nbsp ... // Otras propiedades de seguir...
& nbsp & nbsp final
funcion TOrder.GetCustomer: TCustomer
begin
& nbsp & nbsp si FCustomer = nil then begin
& nbsp & nbsp & nbsp & nbsp FCustomer := TCustomer.Crear
& nbsp & nbsp & nbsp & nbsp FCustomer.De carga (FCustomerID)
& nbsp & nbsp final
& nbsp & nbsp Resultado := FCustomer
fin
((( Fin del Listado 2 )))
((( Listado 3 - Generico perezoso construccion de objetos relacionados)))
tipo
& nbsp & nbsp TPDClass = clase de TPDObject
& nbsp & nbsp TPDObject = clase
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp funcion GetObject (const ClassType: TPDClass var PDObject: TPDObject const ID: TObjectID): TPDObject
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp constructor Create virtual
& nbsp & nbsp & nbsp & nbsp procedimiento de Carga (ID: TObjectID)
& nbsp & nbsp final
funcion TPDObject.GetObject (const ClassType: TPDClass var PDObject: TPDObject const ID: TObjectID): TPDObject
begin
& nbsp & nbsp si PDObject = nil then begin
& nbsp & nbsp & nbsp & nbsp PDObject := ClassType.Crear
& nbsp & nbsp & nbsp & nbsp si ID <> NotAssigned luego PDObject.De carga (ID)
& nbsp & nbsp final
& nbsp & nbsp Resultado := PDObject
fin
& nbsp ((( Fin del Listado 3 )))
((( Listado 4 - Nuestro nuevo TOrder.Cliente descriptor de acceso a la funcion)))
funcion TOrder.GetCustomer: TCustomer
begin
& nbsp & nbsp Resultado := TCustomer (GetObject (TCustomer, FCustomer, FCustomerID))
fin
((( Final Listado 4 )))
el Siguiente en la serie
Simple objeto de las relaciones
By Consejos Y Trucos
Simple objeto de las relaciones : Multi-millones de consejos para hacer su vida más fácil.