La capa de abstracción y el nivel de indirección son conceptos distintos. La abstracción es la agregación y la designación significativa de una serie de elementos, como datos o instrucciones del programa, por ejemplo, el concepto de una llamada a un archivo o método, mientras que la indirección es el desacoplamiento de entidades para facilitar el aplazamiento de la realización de su relación, por ejemplo, el uso de JNDI para separar la identificación de un recurso dentro de un programa del recurso real que eventualmente puede proporcionar un contenedor de aplicaciones.
Con frecuencia, los conceptos van de la mano y cuál se aplica a una construcción particular depende de qué ejercicio o discusión esté en progreso. Por ejemplo, la naturaleza abstracta de una interfaz es importante al aprender o documentar una API; su propiedad de indirección es importante al agregar extensibilidad o crear pruebas para una aplicación.
Una capa de abstracción es la agregación de abstracciones y darles una integridad conceptual y consistencia de uso. CreateProcess es el nombre de la API win32 para un montón de código que crea y ejecuta un proceso. El "nombre" es significativo para este contexto porque si llamamos a la función algo así como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente no sería muy abstracto. Una capa como la API Win32 proporciona una barrera a través de la cual se puede aconsejar a un programador que no se aventure. Elimina la complejidad desde el punto de vista de la persona que llama a costa de una potencia reducida (flexibilidad, rendimiento, etc.). Esta compensación se destaca por la discusión frecuente de abstracciones con fugas: es posible que aún necesitemos hacer llamadas SQL directas cuando usamos Hibernate o hacer llamadas Win32 cuando usamos .NET.
Con respecto a la indirección, la mayoría de los programas no triviales operan con alguna forma de indirección codificada por el usuario, testigo de la sección ENTRADA-SALIDA de COBOL antes del arca. Al acceder a un recurso, como una base de datos, podemos ver la incrustación de una cadena de conexión JDBC en el código como indirección de Nivel 0, una conexión JNDI (que delega la elección del recurso a un contenedor de aplicaciones) como Nivel 1 y alguna construcción Spring que se asigna el identificador JNDI de la aplicación a uno de los muchos recursos del contenedor como Nivel 2. Varios niveles permiten que varias partes externas a la relación (en este caso, una relación entre el código de ejecución y una base de datos) manipulen esa relación. Esto se aplica igualmente a los componentes internos del programa, como las interfaces y los eventos.
Vemos que, no importa cuáles sean sus otras cualidades, la abstracción reduce la complejidad, mientras que la indirección la aumenta. La abstracción reduce el poder, mientras que la indirección lo aumenta. La indirecta se puede utilizar para restaurar el poder de la abstracción al permitir que las devoluciones de llamada personalizadas anulen el comportamiento predeterminado.