Eine Software-Schnittstelle kann sich auf eine Vielzahl verschiedener Arten von Schnittstellen auf verschiedenen „Ebenen“ beziehen: Ein Betriebssystem kann mit Hardwareteilen verbunden sein. Anwendungen oder Programme, die auf dem Betriebssystem ausgeführt werden, müssen möglicherweise über Datenströme, Filter und Pipelines interagieren. und in objektorientierten Programmen müssen Objekte innerhalb einer Anwendung möglicherweise über Methoden interagieren.
In der Praxisbearbeiten
Ein Schlüsselprinzip des Designs besteht darin, den Zugriff auf alle Ressourcen standardmäßig zu verbieten und den Zugriff nur über genau definierte Einstiegspunkte, d. H. Schnittstellen, zu ermöglichen. Softwareschnittstellen bieten Zugriff auf Computerressourcen (z. B. Speicher, CPU, Speicher usw.) des zugrunde liegenden Computersystems; Der direkte Zugriff (d. h. nicht über gut gestaltete Schnittstellen) auf solche Ressourcen durch Software kann erhebliche – manchmal katastrophale — Auswirkungen auf die Funktionalität und Stabilität haben.
Schnittstellen zwischen Softwarekomponenten können Konstanten, Datentypen, Prozedurtypen, Ausnahmespezifikationen und Methodensignaturen bereitstellen. Manchmal werden öffentliche Variablen auch als Teil einer Schnittstelle definiert.
Die Schnittstelle eines Softwaremoduls A wird bewusst getrennt von der Implementierung dieses Moduls definiert. Letzteres enthält den eigentlichen Code der in der Schnittstelle beschriebenen Prozeduren und Methoden sowie andere „private“ Variablen, Prozeduren usw. Ein anderes Softwaremodul B, beispielsweise der Client zu A, das mit A interagiert, wird dazu nur über die veröffentlichte Schnittstelle gezwungen. Ein praktischer Vorteil dieser Anordnung besteht darin, dass das Ersetzen der Implementierung von A durch eine andere Implementierung derselben Schnittstelle nicht dazu führen sollte, dass B fehlschlägt — wie A intern die Anforderungen der Schnittstelle erfüllt, ist für B nicht relevant, was nur die Spezifikationen der Schnittstelle betrifft. (Siehe auch Liskov-Substitutionsprinzip.)
In objektorientierten SprachenBearbeiten
In einigen objektorientierten Sprachen, insbesondere solchen ohne vollständige Mehrfachvererbung, wird der Begriff Schnittstelle verwendet, um einen abstrakten Typ zu definieren, der keine Daten enthält, sondern Verhaltensweisen als Methodensignaturen definiert. Eine Klasse, die Code und Daten für alle Methoden enthält, die dieser Schnittstelle entsprechen, und dies deklariert, soll diese Schnittstelle implementieren. Darüber hinaus kann man selbst in Single-Inheritance-Sprachen mehrere Schnittstellen implementieren und somit gleichzeitig von verschiedenen Typen sein.Überall dort, wo ein Objekt ausgetauscht werden kann (z. B. in einem Funktions- oder Methodenaufruf), kann der Typ des auszutauschenden Objekts in Bezug auf eine seiner implementierten Schnittstellen oder Basisklassen definiert werden, anstatt die spezifische Klasse anzugeben. Dieser Ansatz bedeutet, dass jede Klasse, die diese Schnittstelle implementiert, verwendet werden kann. Beispielsweise kann eine Dummy-Implementierung verwendet werden, um den Fortschritt der Entwicklung zu ermöglichen, bevor die endgültige Implementierung verfügbar ist. In einem anderen Fall kann eine gefälschte oder Scheinimplementierung während des Tests ersetzt werden. Solche Stub-Implementierungen werden später im Entwicklungsprozess durch echten Code ersetzt.Normalerweise enthält eine in einer Schnittstelle definierte Methode keinen Code und kann daher nicht selbst aufgerufen werden. Eine Schnittstelle namens „Stack
“ kann zwei Methoden definieren: push()
und pop()
. Es kann auf verschiedene Arten implementiert werden, z. B. FastStack
und GenericStack
— die erste ist schnell und arbeitet mit einer Datenstruktur fester Größe und die zweite mit einer Datenstruktur, deren Größe geändert werden kann, jedoch auf Kosten einer etwas geringeren Geschwindigkeit.
Obwohl Schnittstellen viele Methoden enthalten können, können sie nur eine oder gar keine enthalten. Zum Beispiel definiert die Java-Sprache die Schnittstelle Readable
, die die einzelne read()
-Methode hat; verschiedene Implementierungen werden für verschiedene Zwecke verwendet, einschließlich BufferedReader
FileReader
InputStreamReader
PipedReader
und StringReader
. Markerschnittstellen wie Serializable
enthalten überhaupt keine Methoden und dienen dazu, Laufzeitinformationen für die generische Verarbeitung mithilfe von Reflektion bereitzustellen.
Programmierung zur Schnittstelleedit
Die Verwendung von Schnittstellen ermöglicht einen Programmierstil, der als Programmierung zur Schnittstelle bezeichnet wird. Die Idee hinter diesem Ansatz besteht darin, die Programmierlogik auf den Schnittstellen der verwendeten Objekte und nicht auf internen Implementierungsdetails zu basieren. Die Programmierung der Schnittstelle reduziert die Abhängigkeit von Implementierungsspezifikationen und macht Code wiederverwendbarer.
Wenn man diese Idee auf die Spitze treibt, lässt die Inversion of control den Kontext, um den Code mit den spezifischen Implementierungen der Schnittstelle zu injizieren, die verwendet werden, um die Arbeit auszuführen.