Il livello di astrazione e il livello di Indirection sono concetti distinti. L'astrazione è l'aggregazione e la denominazione significativa di un numero di elementi come pezzi di dati o istruzioni del programma, ad esempio il concetto di un file o di un metodo, mentre l'indirezione è il disaccoppiamento delle entità per facilitare il rinvio della realizzazione della loro relazione, ad esempio, l'uso di JNDI per separare l'identificazione di una risorsa all'interno di un programma dalla risorsa effettiva che può eventualmente essere fornita da un contenitore di applicazioni.
Spesso i concetti vanno di pari passo e quale si applica a un particolare costrutto dipende da quale esercizio o discussione è in corso. Ad esempio, la natura astratta di un'interfaccia è importante quando si apprende o si documenta un'API; la sua proprietà di riferimento indiretto è importante quando si aggiunge l'estensibilità o si creano test per un'applicazione.
Uno strato di astrazione è l'aggregazione di astrazioni e dà loro un'integrità concettuale e coerenza di utilizzo. CreateProcess è il nome dell'API win32 per un gruppo di codice che crea ed esegue un processo. Il "nome" è significativo in questo contesto perché se chiamassimo la funzione qualcosa come DoAllocMemThenMakeEnvThenFindEntryPoint ... non sarebbe molto astratto. Un livello come l'API Win32 fornisce una barriera attraverso la quale un programmatore può essere consigliato di non avventurarsi. Rimuove la complessità dal punto di vista del chiamante al costo di una potenza ridotta (flessibilità, prestazioni, ecc.). Questo trade-off è evidenziato dalla frequente discussione sulle astrazioni che perdono: potremmo ancora aver bisogno di effettuare chiamate SQL dirette quando usiamo Hibernate o facciamo chiamate a Win32 quando usiamo .NET.
Per quanto riguarda l'indirizzamento indiretto, la maggior parte dei programmi non banali opera con una qualche forma di indirizzamento indiretto codificato dall'utente, la sezione INPUT-OUTPUT del testimone COBOL da prima dell'arca. Quando accediamo a una risorsa come un database potremmo vedere l'incorporamento di una stringa di connessione JDBC nel codice come riferimento a livello 0, una connessione JNDI (che delega la scelta della risorsa a un contenitore di applicazioni) come Livello 1 e un costrutto Spring che mappa l'identificatore JNDI dell'applicazione a una delle numerose risorse contenitore del Livello 2. Più livelli consentono a un numero di parti esterne alla relazione (in questo caso una relazione tra codice in esecuzione e un database) di manipolare tale relazione. Questo vale anche per i componenti interni del programma come interfacce ed eventi.
Vediamo che, a prescindere dalle loro altre qualità, l'astrazione riduce la complessità mentre l'induzione indiretta lo aumenta. L'astrazione riduce il potere mentre indiretta lo aumenta. L'indirizzamento può essere utilizzato per ripristinare la potenza dell'astrazione, consentendo al comportamento predefinito di essere sovrascritto da callback personalizzati.