Couche d'abstraction et 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'appel de fichier ou de méthode, alors 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.
Fréquemment, les concepts vont de pair et que l’on 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 d'abstractions et leur confère une intégrité conceptuelle et une cohérence d'utilisation. CreateProcess est le nom de l'API win32 pour un groupe de code qui construit et exécute un processus. Le "nom" est significatif pour ce contexte car si nous appelions la fonction par quelque chose comme DoAllocMemThenMakeEnvThenFindEntryPoint ... ce ne serait vraiment pas très abstrait. Une couche telle que l'API Win32 constitue une barrière sur laquelle un programmeur peut être avisé de ne pas s'aventurer. Il supprime la complexité du point de vue de l'appelant au détriment de la consommation d'énergie (flexibilité, performances, etc.). Ce compromis est mis en évidence par les discussions fréquentes sur les abstractions présentant des fuites: nous aurons peut-être encore besoin de passer des appels SQL directs lorsque nous utilisons Hibernate ou de faire des appels Win32 avec .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 l'indique la section INPUT-OUTPUT de COBOL avant l'arche. Lors de l'accès à une ressource telle qu'une base de données, il est possible que l'intégration d'une chaîne de connexion JDBC dans le code soit indirectionnelle de niveau 0, une connexion JNDI (qui délègue le choix de la ressource à un conteneur d'application) en tant que niveau 1 et une construction Spring mappant l'identificateur JNDI de l'application à l'une des nombreuses ressources de conteneur de niveau 2. Plusieurs niveaux permettent à un nombre de parties externes à la relation (dans ce cas, une relation entre le code en cours d'exécution et une base de données) de manipuler cette relation. Ceci s'applique également aux composants de programme internes tels que les interfaces et les événements.
Nous voyons que, quelles que soient leurs autres qualités, l’abstraction réduit la complexité alors que l’indirection l’augmente. L'abstraction réduit le pouvoir alors que l'indirection 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.