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.'
computer-science
terminology
Theo Lenndorff
quelle
quelle
Antworten:
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.
quelle
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.
quelle
Versuchen wir zunächst die richtigen Definitionen für die Begriffe:
Abstraktionsschicht bedeutet:
Indirektion bedeutet andererseits:
Beide Dinge können dasselbe bedeuten, solange Sie Folgendes verwenden:
quelle
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.
quelle
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.
quelle
Ein Zeiger auf einen Zeiger auf einen Zeiger auf einen Zeiger auf einen Zeiger auf int hat sechs Indirektionsebenen, aber keinerlei Abstraktionsebenen.
quelle
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.
quelle
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.
quelle