Question

Un grand nombre de langages de programmation et de frameworks permettent / autorisent / requièrent quelque chose dont je n'arrive pas à trouver le nom, même s’il en existe probablement un en informatique. Ce qu’ils font essentiellement, c’est lier à une variable / objet / classe / fonction par son nom.

exemple de Flex (" selectAll () &);

<mx:Button click="selectAll()" label="Select All"/>

exemple Mate ("prix"):

<Injectors target="{QuotePanel}">
  <PropertyInjector targetKey="price" source="{QuoteManager}" sourceKey="currentPrice" />
</Injectors>

Exemple Java ("Foo"):

Class.forName("Foo")

Il existe de nombreux autres exemples. Vous avez eu l'idée. Ce qui me dérange, c'est qu'il n'y a pratiquement aucun moyen de vérifier cela au moment de la compilation, et que l'EDI ne peut pas faire grand chose pour aider en termes de complétion de code, de navigation et de refactoring. Mais c’est d’autre part le point.

Ma question est la suivante: comment s'appelle-t-il? Je ne pense pas que ce soit l'un de ceux-ci: liaison dynamique , nom obligatoire , réflexion

Mettre à jour : Non, ce n'est pas un questionnaire, désolé si cela en a l'air. C’est tout simplement une question de "nommer cette chanson". pour la programmation.

Mettre à jour : les réponses qui ont aidé:

  • De Tim Lesher: Cela s'appelle "liaison tardive", "liaison dynamique" ou "liaison à l'exécution". Le fait qu'il soit lié par une chaîne n'est qu'un détail de la mise en œuvre ...
  • De Konrad Rudolph: ... il s’agit simplement d’une entrée pour un interprète .

Mise à jour : comme certains l'ont souligné à juste titre, certains exemples de liaison tardive, d'autres de réflexion, d'autres d'évaluation, d'exécution (interprétation), etc. Cependant, je conclus qu'il n'y a probablement pas nom qui les décrit tous. Ce ne sont que quelques exemples qui ont quelque chose en commun, mais pas assez pour lui donner un nom. J'ai aimé le "tout est une chaîne". répondre, mais même si c'est drôle, il ne fait pas pleinement justice non plus.

Était-ce utile?

La solution

Il est appelé "liaison tardive", "liaison dynamique" ou "liaison à l'exécution". Le fait qu'il soit lié par une chaîne n'est qu'un détail d'implémentation, même si cela implique que le mappage chaîne-symbole existe à l'exécution (ce que certains langages, tels que c ++, ne fournissent pas).

" Introspection " ou "réflexion", d’autre part, font référence à la possibilité de savoir quelles interfaces, méthodes ou attributs un objet implémente au moment de l’exécution.

Il est vrai que les symboles liés de manière dynamique ne peuvent pas être vérifiés avant leur exécution. c'est ce qui les rend différents des symboles liés statiquement.

Autres conseils

Liaison tardive

Qu'est-ce qui vous fait penser que Class.forName n'est pas une réflexion?

Réflexion

La fonction flex peut être qualifiée de liaison tardive, si elle fonctionne comme du code HTML normal. Tant que l'utilisateur ne clique pas sur le bouton, le moteur d'exécution ne cherche pas à savoir si la fonction existe ou non. La deuxième chose est l'injection de dépendance, qui implique des pointeurs de fonction (par le biais d'interfaces) et une réflexion. Le java est certainement le reflet.

Je pense que vous n’êtes peut-être pas capable de formuler votre question correctement ou que vous avez choisi de mauvais exemples pour illustrer votre pensée.

Liaison tardive?

Les deuxième et troisième exemples sont des exemples de réflexion ou de liaison tardive, mais le premier exemple ne l’est pas.

<mx:Button click="selectAll()" label="Select All"/>

Est réécrit au format ActionScript avant la compilation, la partie selectAll () étant insérée dans une fonction de gestionnaire d'événements. Quelque chose comme ça (on peut vérifier exactement comment cela se fait en ajoutant -keep-généré-actionscript aux drapeaux du compilateur):

_button1 = new Button();
_button1.label = "Select All";
_button1.addEventListener("click", function( event : Event ) : void {
    selectAll();
});

Le compilateur détermine si les attributs sont des événements, des styles ou des propriétés, mais comme cela est fait au moment de la compilation, ce n'est pas une réflexion. La réflexion, par définition, est effectuée au moment de l'exécution.

Je pense que l'on pourrait affirmer que les deuxième et troisième exemples sont un reflet, mais aussi qu'ils sont des exemples de liaison tardive. Aucun d'entre eux ne détermine réellement les capacités des objets sur lesquels ils travaillent. Ils ne sont donc pas réfléchissants. Cependant, je dirais que le terme "réflexion" est très souvent utilisé au sens large pour désigner tout ce qui appelle des méthodes dont les noms sont déterminés lors de l'exécution, ou crée des objets à partir de classes nommées uniquement lors de l'exécution. Si vous voulez être précis, "liaison tardive". est probablement la réponse la plus correcte, mais je pense que "réflexion" est assez bon.

" introspection " ?

En passant, je suppose que le code Flex que vous nous avez montré utilise simplement une invocation ActionScript, auquel cas l'attribut click serait simplement eval 'par l'interpréteur du document Flex. Ainsi, il n'y a pas de magie particulière derrière ce genre de code, c'est simplement une entrée pour un interprète.

Je pense que l'exemple Flex n'est pas tout à fait le même que celui de Java (je ne connais pas les autres éléments). L’exemple Java est clairement quelque chose que j’appellerais liaison tardive , car le chargeur de classes résout le nom de la classe au moment de l’exécution, dernier délai possible pour le faire.

Flex MXML est principalement une autre syntaxe, qui est finalement compilée pour quelque chose que vous auriez aussi pu écrire dans ActionScript. Autant que je sache, mx: Button et la fonction selectAll () sont résolus à la compilation . Au moins mxmlc donne des erreurs si vous utilisez un symbole non défini ici.

Il existe un scénario dans lequel le compilateur peut aider ceci ... Génération de code.

Si le type de variable n'est pas connu avant l'exécution, il s'agit d'une liaison tardive. Si le type de variable est connu au moment de la compilation, il s'agit d'une liaison précoce.

Intellisense, la complétion de code et toutes les autres fonctionnalités de l'EDI dont vous parlez ne sont disponibles que sur les premières variables liées.

Ça sent le pointeur d'une fonction sur moi.

L'exemple Java que vous avez donné s'appelle Dynamic Class Loading. Je ne suis pas sûr si les autres exemples sont la même chose. Mais ceci est utile dans la réflexion. Peut-être recherchez-vous le modèle de conception appelé Inversion de contrôle.

Dans le monde .NET, nous appelons cette liaison de données, qui s’est gérée à l’aide de la réflexion.

Cela me rappelle également fortement l’injection de dépendance.

Le premier exemple montre comment un xml à espace de noms peut prendre le sens de la compilation, La seconde est à la fois une injection de liaison de données / dépendance Le troisième exemple est Reflection. Si je devais étiqueter tous ces 3 exemples avec un nom, je pense que je choisirais "Syntaxe"

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top