Pourquoi devrais-je me soucier de RTTI à Delphi?

j'ai beaucoup entendu parler de la nouvelle/améliorée capacités RTTI de Delphi 2010 , mais je dois admettre mon ignorance...Je ne comprends pas. Je sais que chaque version de Delphi a pris en charge RTTI...et je sais que RTTI (Runtime Type Information) me permet d'accéder aux informations de type pendant que mon application est en cours d'exécution.

mais qu'est-ce que signifie exactement ? Est Delphi 2010 RTTI soutenir la même chose que réflexion in .NET ?

Quelqu'un pourrait-il expliquer pourquoi le RTTI est utile? Fais comme si j'étais ton patron aux cheveux pointus et aide-moi à comprendre pourquoi RTTI est cool. Comment pourrais-je l'utiliser dans une application réelle?

41
demandé sur Mick 2010-02-07 17:32:37

7 réponses

RTTI dans Delphi n'est toujours pas tout à fait aussi complet que la réflexion dans .NET ou d'autres langues gérées, parce qu'il fonctionne sur du code compilé, pas un langage intermédiaire (bytecode). Cependant, c'est un concept très similaire, et le nouveau système RTTI dans Delphi 2010 lui apporte un lot plus proche de la réflexion, exposant une API orientée objet entier.

avant D2010, la RTTI était assez limitée. La seule chose que je n'oubliez jamais de le faire était de convertir un type énuméré à une chaîne de caractères (ou vice versa ) pour utilisation dans les listes déroulantes. Je l'ai peut-être utilisé à un moment donné pour persistance témoin .

avec la nouvelle RTTI en D2010 vous pouvez faire beaucoup plus de choses:

  • la Sérialisation XML

  • Attribut à base de métadonnées ( TCustomAttribute ). Les cas d'utilisation typiques seraient la validation automatique des propriétés et les vérifications d'autorisation automatisées, deux choses pour lesquelles vous devez normalement écrire beaucoup de code.

  • ajout de Active Scripting support (i.e. using the Windows script control)

  • construire un système plug-in; vous pourriez le faire avant, mais là beaucoup de maux de tête. Je n'ai pas pu trouver un très bon exemple de quelqu'un faisant cela de haut en bas, mais toutes les fonctions nécessaires sont disponibles maintenant.

  • il semble que quelqu'un essaie même de mettre en œuvre printemps (di framework) pour Delphi 2010.

donc c'est certainement très utile, bien que je ne suis pas sûr comment vous seriez en mesure de l'expliquer à un PHB; la plupart des son utilité va probablement être réalisée à travers des bibliothèques et des cadres tiers, à peu près de la même manière qu'il fonctionne dans la communauté.net aujourd'hui-il est rare de voir le code de réflexion assis dans la logique d'affaires, mais une application typique fera usage de plusieurs composants de réflexion - basés comme un objet-Mapper relationnel ou un conteneur CIO.

ai-je répondu à la question?

37
répondu Aaronaught 2010-02-07 15:31:59

la plupart des gens ne l'utiliseront probablement pas dans une application réelle.

les gens qui l'utiliseront sont les constructeurs du cadre. Les cadres tels que DUnit utilisent largement RTTI.

avec les nouvelles capacités RTTI, nous devrions nous attendre à voir apparaître des cadres et des outils plus avancés, semblables à ce qui est disponible pour .NET. Ces cadres révolutionneront davantage votre développement que la RTTI elle-même.

12
répondu LachlanG 2010-02-07 19:31:23

la RTTI étendue de D2010 ressemble beaucoup à la réflexion de C#. Il vous donne la possibilité d'obtenir à tout champ d'un objet, ou d'inspecter ses méthodes. Cela a toutes sortes d'utilisations potentielles. Par exemple, si vous pouvez lire n'importe quel champ d'un objet, vous pouvez écrire le code de sérialisation qui peut fonctionner avec n'importe quel objet. Et la capacité d'inspecter les méthodes et d'obtenir leur nom et leur signature rend une classe beaucoup plus facile à enregistrer avec un moteur de script.

pour moi, c'est la première avantage de RTTI étendu: la capacité d'écrire du code qui fonctionne avec n'importe quelle classe en examinant ses membres, au lieu d'écrire des versions différentes du même code encore et encore, adapté à chaque classe individuelle.

11
répondu Mason Wheeler 2010-02-07 15:11:44

RTTI in Delphi a toujours été important depuis la version 1.0. Les caractéristiques classiques de RTTI comprennent la section des propriétés" publiées " des Classes, ce qui a permis à L'Inspecteur D'objets et aux caractéristiques de designtime des composants de fonctionner. Pour mes besoins, j'utiliserais souvent des propriétés de classe publiées pour permettre l'énumération de ces propriétés à l'exécution. Pour stocker des choses de mes objets au disque, pour la persistance.

le Delphi 2010 RTTI étend cette RTTI classique massivement, tellement pour que vous puissiez être pardonné de penser Delphi N'a même pas eu RTTI jusqu'à delphi 2010.

je dirais que les applications #1 les plus utiles de "la nouvelle RTTI" sont (comme plusieurs autres réponses l'indiquent déjà) va être dans les cadres écrits par les gourous, que:

  1. Gérer la persistance de fichiers ou de bases de données. La base de données et la configuration ou les cadres de sauvegarde/chargement de documents et les composants utiliseraient ceci sous le capot.

  2. Poignée de décapage/ordonnancement/encodage/décodage et de divers formats électroniques, comme JSON, XML, EDI, etc.

  3. "151900920 de tests Unitaires, a été mentionné par quelqu'un d'autre (JUnit), mais je pense que peut-être les mêmes cadres pourrait être vraiment pratique pour le débogage et l'erreur d'outils de reporting. Étant donné qu'un objet est passé comme paramètre, sur la pile, pourquoi ne pas avoir des rapports de bogue qui peuvent vider toutes les données qui a été transmis à une fonction qui a échoué, et pas seulement une liste de fonctions?

comme vous pouvez le voir, certaines personnes créatives sont susceptibles de penser à encore plus d'utilisations pour cela. Vous pourriez dire que, bien qu'il n'apporte pas la parité à la réflexion.net (dont une autre réponse parle plus), il apporte beaucoup de fonctionnalités de "langage dynamique" (pensez à Perl, Python, JavaScript) à un monde de systèmes statiques de Delphi autrement fortement tapé.

2
répondu Warren P 2010-02-08 18:22:12

pour moi, personnellement, RTTI étendu A donné une possibilité de récupérer la Convention d'appel à partir du pointeur de méthode. Toutefois, à l'heure actuelle, ce code fait l'objet d'une directive conditionnelle, parce que je n'en suis pas satisfait.

(Critiques et suggestions sur workarond avec base RTTI sont les bienvenus, tho)

0
répondu Free Consulting 2010-11-14 19:42:17

cherchez TMS Aurelius et vous verrez que les attributs RTTI sont très utiles en termes de création d'un cadre de base de données ORM et XML sérialisation dans les objets purs et le contraire aussi.

0
répondu PSyLoCKe 2013-07-27 13:05:48

Vous êtes censé soins parce qu'ils l'ont mis sur la boîte. Ils pensent clairement que certaines personnes s'en soucieront.

Si vous avez réellement une utilité, il est entièrement dépendant de la nature de vos projets. Puisque vous ne l'aviez pas avant et ne comprenez pas pourquoi l'avoir maintenant est un avantage, cela me suggérerait que vous n'avez pas une utilisation pour elle. C'est ensuite à vous de décider de passer du temps des recherches sur le sujet afin de découvrir si vous pourriez être en mesure de 151930920" trouver une utilisation pour elle.

que ce soit l'utilisation la plus productive de votre temps en relation avec vos projets, encore une fois, c'est quelque chose que vous seul pouvez savoir.

-3
répondu Deltics 2010-02-07 20:02:18