Strato di astrazione e livello di indiretta sono concetti distinti. L'astrazione è l'aggregazione e la denominazione significativa di un numero di elementi come pezzi di dati o istruzioni di programma, ad esempio il concetto di un file o una chiamata di metodo, mentre l'irregolazione è 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 dell'applicazione.
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 durante l'apprendimento o la documentazione di un'API; la sua proprietà di riferimento indiretto è importante quando si aggiunge estensibilità o si creano test per un'applicazione.
Uno strato di astrazione è l'aggregazione delle astrazioni e dà loro un'integrità concettuale e la 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 davvero molto astratto. Un livello come l'API Win32 fornisce una barriera attraverso la quale un programmatore può essere consigliato di non avventurarsi. Elimina la complessità dal punto di vista del chiamante a costo di potenza ridotta (flessibilità, prestazioni, ecc.). Questo compromesso è evidenziato dalla frequente discussione di astrazioni che perdono: potrebbe essere ancora necessario effettuare chiamate SQL dirette quando si utilizza Hibernate o effettuare chiamate Win32 quando si utilizza .NET.
Riguardo all'indirizzamento indiretto, la maggior parte dei programmi non banali opera con una qualche forma di indiretto codificato dall'utente, come testimonia la sezione INPUT-OUTPUT di COBOL prima dell'arca. Quando si accede a una risorsa come un database, è possibile che nel codice venga incorporata una stringa di connessione JDBC come indiretta di 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 molte risorse del contenitore come Livello 2. Livelli multipli consentono a un numero di parti esterne alla relazione (in questo caso una relazione tra l'esecuzione di codice e un database) di manipolare tale relazione. Questo vale anche per i componenti interni del programma come interfacce ed eventi.
Vediamo che, qualunque siano le loro altre qualità, l'astrazione riduce la complessità mentre la direzione indiretta la aumenta. L'astrazione riduce il potere mentre l'indirizzamento indiretto lo aumenta. La indiretta può essere utilizzata per ripristinare la potenza dell'astrazione consentendo di ignorare il comportamento predefinito mediante callback personalizzati.