Was ist der Unterschied zwischen "Abstraktionsebene" und "Indirektionsebene"?

38

Ich bin nicht sicher, ob beide Begriffe synonym verwendet werden können. Vielleicht gibt es eine akademische Unterscheidung in der Informatik, die für die tägliche Programmierung nicht relevant ist? Oder kann ich beide Begriffe austauschbar verwenden, ohne mich zu irren? Vielleicht kommt es auf den Kontext an, in dem ich beide Begriffe verwende?

Bearbeiten: Auf Grund, warum ich beide Begriffe möglicherweise austauschbar finde, ist ein Wikipedia-Eintrag über Abstraktionsschicht . Dort finden Sie David Wheelers Zitat 'Alle Probleme in der Informatik können durch eine andere Indirektionsebene gelöst werden.'

Theo Lenndorff
quelle
7
... außer dem Problem zu vieler Indirektionsebenen!
Mason Wheeler
@ MasonWheeler: Sie könnten eine weitere, weniger indirekte Ebene der Indirektion hinzufügen ...
Jon Purdy
Mit C ++ können Sie eine Abstraktionsebene ohne Indirektionsebene hinzufügen, sodass sie nicht dasselbe bedeuten können.
Fredoverflow

Antworten:

30

Abstraktion befasst sich mit Vereinfachung, Indirektion befasst sich mit Standort.

  • Abstraktionist ein Mechanismus, der komplizierte Details eines Objekts im Sinne von einfacheren, einfacher zu manipulierenden Begriffen "verbirgt". Ein gutes Beispiel für die Programmierung ist der Detailunterschied zwischen Maschinencode und den verschiedenen Tools zum Erstellen von Anwendungen, die letztendlich auf Maschinencode basieren. Ziehen Sie in Betracht, eine Windows Form-Anwendung mit der Visual Studio-IDE zu erstellen. Mit der IDE können Sie sich die Anwendung in Bezug auf leicht zu manipulierende Elemente auf eine Art und Weise vorstellen, wie Sie sehen, was Sie erhalten. Die Position eines Bildschirmwidgets wird zu einer visuellen Position in einem Frame abstrahiert, die Sie durch Ziehen des Widgets ändern können. Intern bearbeitet die IDE das Widget mithilfe einer anderen Abstraktionsebene, z. B. einer Hochsprache (z. B. C #). C # selbst wird nicht mit Maschinencode manipuliert, sondern mit einer "Common Runtime Environment".

  • Indirektion bedeutet , die Position eines Elements transparent zu machen. Wenn Sie den URI einer Webressource kennen, können Sie auf die Ressource zugreifen, ohne den genauen Speicherort zu kennen. Sie greifen nicht direkt auf die Ressource zu, sondern greifen über einen Kanal zu, der Ihre Anforderung über eine Reihe von Servern, Anwendungen und Routern weiterleitet. Indirektion kann als eine spezielle Art von Abstraktion angesehen werden, bei der der Ort abstrahiert wird.

Jay Elston
quelle
2
+1 beste Antwort bisher! Ich wollte gerade einen schreiben, aber dieser ist nah genug an dem, was ich mir vorgestellt habe.
Newtopian
27

Abstraktionen werden unter Verwendung von Indirektion implementiert.

Zum Beispiel virtueller Speicher: Die Abstraktion ist ein zusammenhängender Adressraum, der Ihnen vollständig zur Verfügung steht. Diese Abstraktion wird durch Indirektion über eine Seitentabelle implementiert. Anstatt direkt auf physikalische Speicheradressen zuzugreifen, werden sie von einer virtuellen Adresse in eine physikalische Adresse übersetzt.

Um eine Abstraktionsebene hinzuzufügen, müssen Sie eine Indirektionsebene hinzufügen. Das Hinzufügen von Indirektion gibt Ihnen jedoch nicht unbedingt eine Abstraktion. Zum Beispiel ist es eine Indirektionsebene, Get- und Setter für jede einzelne Variable zu haben. Wenn sie jedoch nur einfache Werte abrufen und festlegen, gibt es keine Abstraktion.

Austin
quelle
2
Tatsächlich ist das letzte Beispiel nicht sehr gut. Einfache Getter und Setter fügen Abstraktion hinzu. Das Einzige, das weiß, dass sie klar sind, ist die Klasse, die sie deklariert. Wenn Sie die Implementierung ändern, ist der für die Abstraktion erstellte Code nicht betroffen.
back2dos
Kannst du ein besseres Beispiel geben, das Indirektion, aber nicht Abastraktion ist?
Mr Coder
1
definitiv ein falsches Beispiel
Morg.
3
Wer hat etwas über den Unterricht gesagt? Ich habe auch nichts über das Ändern der Sichtbarkeit einer Variablen gesagt. Nichts hindert Sie daran, direkt darauf zuzugreifen. Es ist eine Variable. Sie können dies jedoch auch mit einer Indirektionsebene über den Getter und Setter tun. Da die Semantik der Verwendung von Getter und Setter mit dem direkten Zugriff auf die Variable identisch ist, gibt es keine Abstraktion.
Austin
2
Abgesehen davon, dass der Getter und der Setter nicht unbedingt "nur" auf die Variable zugreifen müssen. Wenn Sie einen Getter und Setter verwenden, fügen Sie eine Abstraktion hinzu, da Sie diese ändern können, um eine andere Variable zu verwenden, ohne dass sich der Benutzer dessen bewusst ist. Daher handelt es sich um eine Abstraktion.
Dominique McDonnell
9

Versuchen wir zunächst die richtigen Definitionen für die Begriffe:

  1. Abstraktionsschicht bedeutet:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Indirektion bedeutet andererseits:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Beide Dinge können dasselbe bedeuten, solange Sie Folgendes verwenden:

  a) step = going from simple code to complex code. 
tp1
quelle
7

Nach meinem Verständnis bezieht sich Abstraktion hauptsächlich auf Funktionen und Indirektion hauptsächlich auf Daten. Mit anderen Worten, die Abstraktionsebene gibt an, wie tief Ihr Stack-Trace wird, und die Indirektionsebene gibt an, wie viele Zeiger Sie dereferenzieren müssen. Zumindest verwende ich die Begriffe so.

Karl Bielefeldt
quelle
mit virtuellen Funktionen als Zeiger auf Funktionen modelliert werden?
Caleth
7

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.

Mikemay
quelle
1

Ein Zeiger auf einen Zeiger auf einen Zeiger auf einen Zeiger auf einen Zeiger auf int hat sechs Indirektionsebenen, aber keinerlei Abstraktionsebenen.

gnasher729
quelle
0

Ein gutes Beispiel für die Abstraktion ist der Aufruf einer einzelnen Methode zum Speichern eines Elements in einer Datenbank. Die Methode abstrahiert die Details zum Verbinden und Aufrufen der Datenbank. Ein Beispiel für eine Indirektion ist die Verwendung einer Struktur für den Zugriff auf Interrupts. Sie greifen weiterhin auf den Interrupt zu, wenn Sie Werte in der Struktur festlegen. Dies geschieht nur indirekt über die Struktur, indem Strukturmitgliedernamen für bestimmte Punkte im Speicher vergeben werden.

Die Abstraktion verbirgt also Details der Implementierung, bei denen die Indirektion lediglich eine "indirekte" Schnittstelle bietet, über die auf etwas zugegriffen werden kann.

Abstraktion ist, wenn Sie nicht verstehen müssen, was verborgen wird, wohin Sie es mit Indirektion tun.

Charles Lambert
quelle
-1

Das Hinzufügen einer Abstraktionsebene (oder Abstraktionsebene) und das Hinzufügen einer Indirektionsebene sind zwei einfache Möglichkeiten, um dasselbe auszudrücken. Wenn Sie ein Problem lösen, versuchen Sie normalerweise eine direkte Lösung. Manchmal ist das nicht möglich, deshalb versuchen Sie es mit einer indirekten Lösung. Dies erfordert eine gewisse Abstraktion, um das Problem zu vereinfachen - da das Problem komplex ist, kann es nicht direkt gelöst werden. Nachdem das Problem durch den indirekten Ansatz gelöst wurde, gibt es keinen Grund, das Problem nicht erneut zu lösen, sondern allgemeiner. Dies beinhaltet die Einführung einer weiteren höheren Abstraktionsebene. Und diese neue, allgemeinere Lösung ist noch indirekter als die ursprüngliche indirekte Lösung - dh, es wurde eine andere Indirektionsebene eingeführt.

ChrisC
quelle
3
Dies scheint nichts Wesentliches über die in den vorherigen 7 Antworten gemachten und erklärten Punkte hinzuzufügen
Mücke
Danke, Mücke. Ich nehme Ihren Standpunkt an und es ist schade, dass diese interessante Frage viel Spam anzieht!
ChrisC