Camada de Abstração e Nível de Indirecionamento são conceitos distintos. Abstração é a agregação e a nomeação significativa de vários elementos, como dados ou instruções de programas, por exemplo, o conceito de chamada de arquivo ou método, enquanto indireto é a dissociação de entidades para facilitar o adiamento da realização de seu relacionamento, por exemplo, o uso de JNDI para separar a identificação de um recurso dentro de um programa do recurso real que pode eventualmente ser fornecido por um contêiner de aplicativo.
Freqüentemente, os conceitos andam de mãos dadas e qual deles se aplica a um construto específico depende de qual exercício ou discussão está em andamento. Por exemplo, a natureza abstrata de uma interface é importante ao aprender ou documentar uma API; sua propriedade de indireção é importante ao adicionar extensibilidade ou criar testes para um aplicativo.
Uma camada de abstração é a agregação de abstrações e oferece a elas uma integridade conceitual e consistência de uso. CreateProcess é o nome da API do win32 para um monte de código que cria e executa um processo. O "nome" é significativo para esse contexto, porque se chamarmos a função de algo como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente não seria muito abstrato. Uma camada como a API Win32 fornece uma barreira através da qual um programador pode ser aconselhado a não se aventurar. Ele remove a complexidade do ponto de vista do chamador ao custo de energia reduzida (flexibilidade, desempenho, etc.). Esse trade-off é destacado pela discussão frequente de abstrações com vazamentos: ainda podemos precisar fazer chamadas SQL diretas ao usar o Hibernate ou fazer chamadas Win32 ao usar o .NET.
Em relação à indireção, a maioria dos programas não triviais opera com alguma forma de indireção codificada pelo usuário, testemunha a seção INPUT-OUTPUT do COBOL antes da arca. Ao acessar um recurso, como um banco de dados, podemos ver a incorporação de uma cadeia de conexão JDBC no código como nível 0, uma conexão JNDI (que delega a escolha do recurso para um contêiner de aplicativo) como Nível 1 e algumas construções Spring que mapeiam o identificador JNDI do aplicativo para um dos muitos recursos do contêiner como Nível 2. Vários níveis permitem que várias partes externas ao relacionamento (nesse caso, um relacionamento entre a execução de código e um banco de dados) manipulem esse relacionamento. Isso se aplica igualmente aos componentes internos do programa, como interfaces e eventos.
Vemos que, não importa quais sejam suas outras qualidades, a abstração reduz a complexidade, enquanto a indução a aumenta. A abstração reduz o poder, enquanto a indução aumenta. O indireto pode ser usado para restaurar o poder da abstração, permitindo que o comportamento padrão seja substituído por retornos de chamada personalizados.