web-dev-qa-db-fra.com

Quelle est la différence entre l'introspection et la réflexion?

Quelqu'un peut-il expliquer d'un point de vue agnostique langue/environnement la différence entre ces deux notions?

Existe-t-il également un ensemble de conditions que les langages de programmation doivent remplir pour être réfléchissants et/ou introspectifs?

Et s'il y en a, quelles sont ces conditions?

35
U r s u s

L'article de Wikipedia présente un résumé assez correct:

En informatique, l'introspection de types est l'aptitude d'un programme à examiner le type ou les propriétés d'un objet au moment de l'exécution. Certains langages de programmation possèdent cette capacité.

L'introspection ne doit pas être confondue avec la réflexion, ce qui va encore plus loin et permet à un programme de manipuler les valeurs, les métadonnées, les propriétés et/ou les fonctions d'un objet au moment de l'exécution. Certains langages de programmation, par exemple Java possède également cette capacité.

Prenez un programme compilé statiquement typé:

SomeType function foo(int i) {
    return new SomeType(i);
}

Tous les types sont connus et appliqués lors de la compilation, le programme ne devrait même pas compiler s'il ne satisfait pas ses propres contraintes de type explicites. Les langages de programmation dynamiques ne présentent généralement pas ce type de rigidité, les types de variables n'étant pas nécessairement connus au moment de la compilation. Ils peuvent ressembler davantage à ceci:

function foo(i) {
    return new SomeType(i);
}

La fonction ne peut pas garantir ce que i est exactement, c'est juste le transmettre. Cela peut ou peut ne pas causer de problèmes quelque part, le système de types ne peut pas aider ici. Ce type de vérification d'erreur est ensuite généralement relégué au code utilisateur, pour lequel ce code nécessite des fonctionnalités d'introspection:

function foo(i) {
    if (!is_int(i)) {
        throw new InvalidArgumentException;
    }
    return new SomeType(i);
}

La distinction exacte entre introspection et réflexion est un peu discutable. On peut dire que l'introspection est tout ce qui permet au code de tester ce que quelque chose est ("Qu'est-ce que je suis?"), Alors que la réflexion est la capacité de manipuler la structure même du programme. Par exemple, un exemple PHP:

$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();

Le code ci-dessus contourne l'exécution du constructeur de la classe Foo lors de la création d'une nouvelle instance de celle-ci. C'est la manipulation de code au moment de l'exécution. En pratique cependant, l'API de réflexion dans PHP contient également des fonctionnalités d'introspection. Certaines de ces capacités font double emploi avec ce que l’on peut faire avec des capacités d’introspection «inférieures». Par exemple.:

$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...

if ($obj instanceof Foo) ...

Les deux extraits font essentiellement la même chose, mais l'un utilise la réflexion et l'autre ce que l'on appelle l'introspection. Comme vous le voyez, la ligne de démarcation n’est guère claire. Cependant, la réflexion est généralement plus puissante que l'introspection. Par exemple, dans PHP, vous devez utiliser l'API de réflexion pour obtenir des informations sur les types d'arguments acceptés par une fonction. C'est juste une introspection "passive", mais qui appartient à l'API de réflexion. C’est surtout une question de mise en œuvre pratique.

En bref, selon la définition générale, pour être introspectif, un programme doit pouvoir examiner certaines parties de lui-même au moment de l'exécution et exécuter un code différent en fonction de ces informations. Au-delà de cela, un programme de réflexion peut modifier ses propres règles d'exécution de code lors de l'exécution, par exemple en choisissant de ne pas appeler de constructeur, qui est par ailleurs une opération obligatoire telle que définie par le langage.

31
deceze

Reflection est un mécanisme composé de deux techniques:

  1. Introspection

    La capacité d'un programme à s'examiner

  2. Intercession

    La capacité d'un programme à se modifier (son comportement ou son état)

Réf. https://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique)#Introspection_et_intercession

Ma référence est une page française car la page anglaise ne fait pas directement référence au terme intercession.

2
csblo

Type d'introspection:

Capacité d'un langage de programmation à examiner le type ou les propriétés d'un objet lors de l'exécution.

Exemple (Java):

String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
    System.out.println("This is an example of type interospection");
}


Réflexion:

Capacité d'un langage de programmation à réaliser des tâches inférieures à l'exécution.

  • Tapez introspect (comme on le voit ci-dessus) 
  • Examiner et modifier un objet. 
  • et beaucoup plus
1
dheeran