Je ne sais pas si les deux termes peuvent être utilisés de manière interchangeable. Peut-être existe-t-il une distinction académique en informatique qui n'est pas pertinente pour la programmation quotidienne? Ou puis-je utiliser les deux termes de manière interchangeable sans se tromper? Peut-être que cela dépend du contexte dans lequel j'utilise les deux termes?
Edit: La raison pour laquelle je trouve que les deux termes sont peut-être interchangeables est entrée Wikipedia sur la couche d'abstraction . Vous y trouverez David Wheelers quote 'Tous les problèmes en informatique peuvent être résolus par un autre niveau d'indirection.'
Abstraction traite de la simplification, indirection traite de l'emplacement.
Abstraction est un mécanisme qui "cache" les détails compliqués d'un objet en termes de termes plus simples et plus faciles à manipuler. En programmation, un bon exemple est la différence de détails entre le code machine et les différents outils pour créer des applications qui sont finalement basées sur le code machine. Envisagez de créer une application Windows Form avec l'IDE Visual Studio. Le IDE vous permet de penser à l'application en termes d'éléments faciles à manipuler de la manière que vous voyez, ce que vous obtenez. La position d'un widget d'écran est abstrait à un emplacement visuel dans un cadre que vous pouvez modifier en faisant glisser le widget autour. En interne, le IDE manipule le widget en utilisant une autre couche d'abstraction comme un langage de haut niveau (comme C # C # lui-même n'est pas manipulé à l'aide du code machine, il est manipulé à l'aide d'un "environnement d'exécution commun" qui lui-même est une abstraction d'un ordinateur et d'un système d'exploitation.
Indirection fait référence à la transparence de l'emplacement d'un élément. Si vous connaissez l'URI d'une ressource Web, vous pouvez accéder à la ressource sans connaître son emplacement précis. Vous n'accédez pas directement à la ressource, mais vous y accédez via un canal qui transmet votre demande via une série de serveurs, d'applications et de routeurs. L'indirection peut être considérée comme un type d'abstraction spécial où l'emplacement est abstrait.
Les abstractions sont implémentées en utilisant l'indirection.
Par exemple, la mémoire virtuelle: l'abstraction est un espace d'adressage contigu entièrement à votre disposition. Cette abstraction est implémentée en utilisant l'indirection via une table de pages. Au lieu d'accéder directement aux adresses de la mémoire physique, elles sont traduites d'une adresse virtuelle en une adresse physique.
Pour ajouter une couche d'abstraction, vous devez ajouter une couche d'indirection. Mais l'ajout d'indirection ne vous donne pas nécessairement une abstraction. Par exemple, avoir des getters et des setters sur chaque variable est une couche d'indirection, mais si tout ce qu'ils font est d'obtenir et de définir des valeurs simples, il n'y a pas d'abstraction.
Tout d'abord, essayons les définitions appropriées des termes:
La couche d'abstraction signifie:
a) there is large number of positions which use abstraction
(layer = all the positions together)
b) each position is hiding some complex stuff, but allows invoking it
using only simple code.
(abstraction == one-to-one mapping between simple code and complex code)
Par contre, le niveau d'indirection signifie:
a) you're counting levels
b) indirection==there are several steps before you can reach or access the data
c) level of indirection is just how many steps it takes to access the data
Ces deux choses peuvent signifier la même chose, tant que vous utilisez:
a) step = going from simple code to complex code.
La couche d'abstraction et le niveau d'indirection sont des concepts distincts. L'abstraction est l'agrégation et la dénomination significative d'un certain nombre d'éléments tels que des éléments de données ou des instructions de programme, par exemple le concept d'un appel de fichier ou de méthode, tandis que l'indirection est le découplage d'entités pour faciliter le report de la réalisation de leur relation, par exemple, l'utilisation de JNDI pour séparer l'identification d'une ressource dans un programme de la ressource réelle qui peut éventuellement être fournie par un conteneur d'application.
Souvent, les concepts vont de pair et celui qui s'applique à une construction particulière dépend de l'exercice ou de la discussion en cours. Par exemple, la nature abstraite d'une interface est importante lors de l'apprentissage ou de la documentation d'une API; sa propriété d'indirection est importante lors de l'ajout d'extensibilité ou de la création de tests pour une application.
Une couche d'abstraction est l'agrégation des abstractions et leur donne une intégrité conceptuelle et une cohérence d'utilisation. CreateProcess est le nom de l'API win32 pour un tas de code qui crée et exécute un processus. Le "nom" est significatif dans ce contexte parce que si nous appelions la fonction quelque chose comme DoAllocMemThenMakeEnvThenFindEntryPoint ... ce ne serait vraiment pas très abstrait. Une couche telle que l'API Win32 fournit une barrière à travers laquelle un programmeur peut être conseillé de ne pas s'aventurer. Il supprime la complexité du point de vue de l'appelant au prix d'une puissance réduite (flexibilité, performances, etc.). Ce compromis est mis en évidence par des discussions fréquentes sur les abstractions qui fuient: nous pouvons encore avoir besoin d'effectuer des appels SQL directs lors de l'utilisation d'Hibernate ou des appels Win32 lors de l'utilisation de .NET.
En ce qui concerne l'indirection, la plupart des programmes non triviaux fonctionnent avec une certaine forme d'indirection codée par l'utilisateur, comme en témoigne la section INPUT-OUTPUT de COBOL avant l'arche. Lors de l'accès à une ressource telle qu'une base de données, nous pouvons voir l'incorporation d'une chaîne de connexion JDBC dans le code comme une indirection de niveau 0, une connexion JNDI (qui délègue le choix de la ressource à un conteneur d'application) comme le niveau 1 et une construction Spring qui mappe l'identifiant JNDI de l'application à l'une des nombreuses ressources de conteneur en tant que niveau 2. Plusieurs niveaux permettent à un certain nombre de parties externes à la relation (dans ce cas, une relation entre l'exécution de code et une base de données) de manipuler cette relation. Cela s'applique également aux composants internes du programme tels que les interfaces et les événements.
On voit que, quelles que soient leurs autres qualités, l'abstraction réduit la complexité alors que l'indirection l'augmente. L'abstraction réduit la puissance tandis que l'indirection l'augmente. L'indirection peut être utilisée pour restaurer la puissance de l'abstraction en permettant au comportement par défaut d'être remplacé par des rappels personnalisés.
Ma compréhension est que l'abstraction se réfère principalement aux fonctions et l'indirection se réfère principalement aux données. En d'autres termes, le niveau d'abstraction est la profondeur de la trace de votre pile et le niveau d'indirection est le nombre de pointeurs que vous devez déréférencer. C'est du moins ainsi que j'utilise les termes.
Un pointeur vers un pointeur vers un pointeur vers un pointeur vers un pointeur vers un pointeur vers int a six niveaux d'indirection, mais aucune couche d'abstraction que ce soit.
Un bon exemple d'abstraction est d'appeler une seule méthode pour stocker un élément dans une base de données. La méthode résume les détails de la connexion et de l'appel de la base de données. Où un exemple d'indirection utilise une structure pour accéder aux interruptions. Vous accédez toujours à l'interruption lorsque vous définissez des valeurs dans la structure. c'est juste indirectement à travers la struct en donnant des noms de membres struct à des points spécifiques en mémoire.
L'abstraction cache donc les détails de l'implémentation où l'indirection fournit simplement une interface "indirecte" à travers laquelle accéder à quelque chose.
L'abstraction, c'est quand vous n'avez pas besoin de comprendre ce qui est caché, où avec l'indirection vous le faites.