¿Por qué debería importarme RTTI en Delphi?


He escuchado mucho sobre las nuevas/mejoradas capacidades RTTI de Delphi 2010, pero debo admitir mi ignorancia...No lo entiendo. Sé que todas las versiones de Delphi han soportado RTTI...y sé que RTTI (Runtime Type Information) me permite acceder a la información de tipo mientras mi aplicación se está ejecutando.

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

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

Author: Mick, 2010-02-07

7 answers

RTTI en Delphi todavía no es bastante 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 un lote a la reflexión, exponiendo toda una API orientada a objetos.

Antes de D2010, el RTTI era bastante limitado. Sobre la única cosa que recuerdo haber hecho con él fue convertir un tipo enumerado a una cadena (o viceversa) para su uso en listas desplegables. Puede que lo haya usado en algún momento para persistencia de control.

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

  • Serialización XML

  • Metadatos basados en el atributo (TCustomAttribute). Los casos de uso típicos serían la validación automática de propiedades y comprobaciones de permisos automatizadas, dos cosas que normalmente tiene que escribir mucho código para.

  • Adición de Active Scripting soporte (es decir, usando el control de script de Windows)

  • Construir un sistema de plug-in; se podía hacer esto antes, pero había un montón de 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á intentando implementar Spring (DI framework) para Delphi 2010.

Así que definitivamente es muy útil, aunque no estoy seguro de lo bien que sería capaz de explicarlo a un PHB; la mayor parte de su utilidad probablemente se va a 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 código de reflexión sentado en la lógica de negocio, pero una aplicación típica hará uso de varios componentes basados en la reflexión como un Mapeador de Objetos Relacionales o Contenedor IoC.

Tengo ¿respondiste la pregunta?

 37
Author: Aaronaught,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-07 15:31:59

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

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

Con las nuevas capacidades de RTTI, deberíamos esperar que aparezcan marcos y herramientas más avanzados, similares a los disponibles para .NET. Estos marcos revolucionarán su desarrollo más de lo que RTTI lo hará por sí solo.

 12
Author: LachlanG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-07 19:31:23

El RTTI extendido de D2010 es muy parecido 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 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 extendido RTTI: La capacidad de escribir código que funciona con cualquier clase examinando sus miembros, en lugar de escribir diferentes versiones del mismo código una y otra vez, adaptadas a cada clase individual.

 11
Author: Mason Wheeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-07 15:11:44

RTTI en Delphi siempre ha sido importante desde la versión 1.0. Las características clásicas de RTTI incluyen la sección de propiedades" publicadas " de las Clases, que permitió que funcionaran las características Object Inspector y component designtime. Para mis propósitos, a menudo usaría 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 extiende este RTTI clásico masivamente, tanto es así que podría ser perdonado por pensar que Delphi ni siquiera tenía RTTI hasta delphi 2010.

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

  1. Maneje la persistencia en archivos o bases de datos. Los frameworks y componentes de base de datos y configuración o de almacenamiento/carga de documentos usarían esto bajo el capó.

  2. Manejar el decapado/clasificación/codificación / decodificación a y de varios formatos over-the-wire, como JSON, XML, EDI y otras cosas.

  3. Las 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 puedan volcar todos los datos que se pasaron a una función que falló, y no solo una lista de funciones?

Como se puede ver, algunos creativos es probable que la gente piense en aún más usos para esto. Se podría decir que, aunque no trae paridad a la reflexión. NET (de la que otra respuesta habla más), sí trae muchas características de "lenguaje dinámico" (Piense en Perl, Python, JavaScript) a un mundo de sistemas de tipo estático fuertemente tipado de Delphi.

 2
Author: Warren P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-08 18:22:12

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

(Críticas y sugerencias sobre workarond con RTTI básico son bienvenidas, tho)

 0
Author: Free Consulting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-14 19:42:17

Busque TMS Aurelius y verá que los atributos RTTI son muy útiles en términos de crear un Marco de base de datos ORM y XML Serialización en objetos puros y lo opuesto también.

 0
Author: PSyLoCKe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 13:05:48

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 ello depende completamente de la naturaleza de sus proyectos. Ya que no lo tenía antes y no entiende por qué tenerlo ahora es un beneficio, esto me sugeriría que no tiene un uso para él. Entonces depende de usted si pasar el tiempo investigando el tema más a fondo con el fin de descubrir si usted podría ser capaz de encuentra un uso para ello.

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

 -3
Author: Deltics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-07 20:02:18