Abstraktionsebene und Indirektionsebene sind unterschiedliche Konzepte. Abstraktion ist die Zusammenfassung und sinnvolle Benennung einer Reihe von Elementen wie Daten oder Programmanweisungen, beispielsweise das Konzept eines Datei- oder Methodenaufrufs, wohingegen Indirektion die Entkopplung von Entitäten ist, um die Verschiebung der Verwirklichung ihrer Beziehung zu erleichtern. Zum Beispiel die Verwendung von JNDI, um die Identifikation einer Ressource innerhalb eines Programms von der tatsächlichen Ressource zu trennen, die eventuell von einem Anwendungscontainer bereitgestellt wird.
Häufig gehen die Konzepte Hand in Hand und welche man für ein bestimmtes Konstrukt anwendet, hängt davon ab, welche Übung oder Diskussion gerade läuft. Zum Beispiel ist die abstrakte Natur einer Schnittstelle wichtig, wenn eine API erlernt oder dokumentiert wird. Die Indirektionseigenschaft ist wichtig, wenn Erweiterbarkeit zu einer Anwendung hinzugefügt oder Tests für eine Anwendung erstellt werden.
Eine Abstraktionsebene ist die Aggregation von Abstraktionen, um ihnen eine konzeptionelle Integrität und Konsistenz der Verwendung zu verleihen. CreateProcess ist der Win32-API-Name für eine Reihe von Code, der einen Prozess erstellt und ausführt. Der "Name" ist in diesem Zusammenhang von Bedeutung, denn wenn wir die Funktion so etwas wie DoAllocMemThenMakeEnvThenFindEntryPoint aufrufen würden ... wäre sie wirklich nicht sehr abstrakt. Eine Schicht wie die Win32-API stellt eine Barriere dar, über die ein Programmierer möglicherweise angewiesen wird, sich nicht zu wagen. Dadurch wird die Komplexität aus Sicht des Anrufers auf Kosten der reduzierten Leistung (Flexibilität, Leistung usw.) verringert. Dieser Kompromiss wird durch die häufige Diskussion undichter Abstraktionen unterstrichen: Möglicherweise müssen Sie im Ruhezustand noch direkte SQL-Aufrufe ausführen oder in .NET Win32-Aufrufe ausführen.
In Bezug auf die Indirektion arbeiten die meisten nicht-trivialen Programme mit einer Form der benutzerkodierten Indirektion, wie der Abschnitt INPUT-OUTPUT von COBOL vor der Arche zeigt. Beim Zugriff auf eine Ressource wie eine Datenbank wird möglicherweise die Einbettung einer JDBC-Verbindungszeichenfolge in den Code als Indirektion der Ebene 0, eine JNDI-Verbindung (die die Auswahl der Ressource an einen Anwendungscontainer delegiert) als Ebene 1 und ein zugeordnetes Spring-Konstrukt angezeigt Die JNDI-Kennung der Anwendung für eine von vielen Containerressourcen als Ebene 2. Auf mehreren Ebenen können mehrere Parteien außerhalb der Beziehung (in diesem Fall eine Beziehung zwischen ausführendem Code und einer Datenbank) diese Beziehung bearbeiten. Dies gilt gleichermaßen für interne Programmkomponenten wie Schnittstellen und Ereignisse.
Wir sehen, dass Abstraktion unabhängig von ihren anderen Qualitäten die Komplexität reduziert, während Indirektion sie erhöht. Die Abstraktion reduziert die Macht, während die Indirektion sie erhöht. Indirection kann verwendet werden, um die Abstraktionskraft wiederherzustellen, indem das Standardverhalten durch benutzerdefinierte Rückrufe überschrieben wird.