delphi reflection delphi-2010 rtti

¿Por qué debería preocuparme por RTTI en Delphi?



reflection delphi-2010 (7)

He oído mucho sobre las nuevas / mejoradas capacidades de RTTI de Delphi 2010 , pero debo admitir mi ignorancia ... No lo entiendo. Sé que cada versión de Delphi ha sido compatible con RTTI ... y sé que RTTI (información de tipo de tiempo de ejecución) me permite acceder a la información de tipo mientras mi aplicación se está ejecutando.

Pero, ¿qué significa eso exactamente? ¿El RTTI de Delphi 2010 admite lo mismo que la reflexión en .NET ?

¿Podría alguien explicar por qué RTTI es útil? Imagina que soy tu jefe puntiagudo y ayúdame a entender por qué RTTI es genial. ¿Cómo podría usarlo en una aplicación real?


Busque TMS Aurelius y verá que los atributos RTTI son muy útiles en términos de creación de un marco de base de datos ORM y serialización XML en objetos puros y al revés también.


El RTTI extendido de D2010 se parece mucho al reflejo de C #. Le da la capacidad de llegar a cualquier campo de un objeto, o inspeccionar sus métodos. Esto tiene todo tipo de usos potenciales. Por ejemplo, si puede leer cualquier campo de un objeto, puede escribir un código de serialización que pueda funcionar con cualquier objeto. Y la capacidad de inspeccionar métodos y obtener su nombre y firma hace que una clase sea mucho más fácil de registrar con un motor de scripting.

Para mí, esa es la principal ventaja de RTTI extendida: la capacidad de escribir código que funciona con cualquier clase examinando a sus miembros, en lugar de escribir diferentes versiones del mismo código una y otra vez, adaptado a cada clase individual.


La mayoría de las personas probablemente no lo usará en una aplicación real.

Las personas que lo usarán son los constructores del marco. Los marcos como DUnit hacen un uso extensivo de RTTI.

Con las nuevas capacidades de RTTI, deberíamos esperar comenzar a ver más frameworks y herramientas avanzadas que aparecen, similar a lo que está disponible para .NET. Estos marcos revolucionarán su desarrollo más de lo que RTTI lo hará por sí mismo.


Para mí, personalmente, RTTI ampliado dio la posibilidad de recuperar convenciones de llamadas desde el puntero del método. Sin embargo, actualmente, ese código está bajo directiva condicional, porque no estoy satisfecho con él.

(Los críticos y sugerencias sobre el trabajo con RTTI básico son bienvenidos, sin embargo)


RTTI en Delphi siempre ha sido importante desde la versión 1.0. Las funciones clásicas de RTTI incluyen la sección de propiedades "publicadas" de Classes, que permitió el funcionamiento de Object Inspector y las características del tiempo de diseño del componente. Para mis propósitos, solía utilizar las propiedades de clase publicadas para permitir la enumeración de esas propiedades en tiempo de ejecución. Para almacenar cosas de mis objetos en el disco, para la persistencia.

El RTTI Delphi 2010 amplía este clásico RTTI de forma masiva, hasta el punto de que podría perdonársele a usted por pensar que Delphi ni siquiera tenía RTTI hasta Delphi 2010.

Yo diría que las aplicaciones más útiles # 1 de "The New RTTI" son (como varias otras respuestas ya indican) que van a estar en Frameworks escritos por los gurús, que:

  1. Manejar la persistencia de archivos o bases de datos. Los marcos de trabajo y los componentes de la base de datos y la configuración o el almacenamiento / carga de documentos usarían esto debajo del capó.

  2. Maneje decapado / clasificación / codificación / decodificación hacia y desde varios formatos de conexión por cable, como JSON, XML, EDI y otras cosas.

  3. Pruebas unitarias fueron mencionadas por otra persona (JUnit), pero creo que quizás los mismos frameworks podrían ser realmente útiles para las herramientas de depuración y reporte de errores. Dado un objeto pasado como parámetro, en la pila, ¿por qué no tener informes de errores que pueden volcar todos los datos pasados ​​a una función que falló, y no solo una lista de funciones?

Como puede ver, es probable que algunas personas creativas piensen en más usos para esto. Se podría decir que aunque no refleja la paridad de la reflexión .NET (de lo que hablamos más en otra respuesta), trae muchas características de "lenguaje dinámico" (Piense en Perl, Python, JavaScript) a una estática fuertemente tipada. -type systems world of Delphi.


RTTI en Delphi todavía no es tan completo como Reflection en .NET u otros lenguajes administrados, porque está operando en código compilado, no en un lenguaje intermedio (bytecode). Sin embargo, es un concepto muy similar, y el nuevo sistema RTTI en Delphi 2010 lo acerca mucho más a la reflexión, exponiendo toda una API orientada a objetos.

Antes del D2010, el RTTI era bastante limitado. Lo único que recuerdo haber hecho con él fue convertir un tipo enumerado en una cadena (o viceversa ) para usar en listas desplegables. Puede que lo haya usado en un punto para la persistencia del control .

Con el nuevo RTTI en D2010 puedes hacer muchas más cosas:

  • Serialización XML

  • Metadatos basados ​​en atributos ( TCustomAttribute ). Los casos de uso típicos serían la validación automática de las propiedades y las verificaciones automáticas de permisos, dos cosas para las que normalmente debe escribir mucho código.

  • Agregar soporte de Active Scripting (es decir, usar el control de script de Windows)

  • Construyendo un sistema de plug-in; Podrías hacer esto antes, pero había muchos dolores de cabeza. No pude encontrar un buen ejemplo de alguien haciendo esto de arriba a abajo, pero todas las funciones necesarias están disponibles ahora.

  • Parece que alguien está tratando de implementar Spring (marco DI) para Delphi 2010.

Así que definitivamente es muy útil, aunque no estoy seguro de qué tan bien podrías explicarlo a un PHB; la mayor parte de su utilidad probablemente se realizará a través de bibliotecas y marcos de terceros, de la misma manera que funciona en la comunidad .NET hoy en día. Es raro ver el código reflejado en la lógica empresarial, pero una aplicación típica hará uso de varios componentes basados ​​en la reflexión como un Object Relational Mapper o IoC Container.

¿He respondido la pregunta?


Se supone que te importa porque lo ponen en la caja. Claramente piensan que a algunas personas les importará.

Si realmente tiene un uso para él depende completamente de la naturaleza de sus proyectos. Como no la tenía antes y no comprende por qué tenerla ahora es un beneficio, esto me sugeriría que no tiene un uso para ella. Depende de usted pasar más tiempo investigando el tema para descubrir si puede encontrarle un uso.

Si ese es el uso más productivo de su tiempo en relación con sus proyectos, nuevamente es algo que solo usted puede saber.