Читать книгу Prinzipien des Softwaredesigns - John Ousterhout - Страница 23
Abstraktionen
ОглавлениеDer Begriff Abstraktion steht in einem engen Zusammenhang mit der Idee des modularen Designs. Eine Abstraktion ist eine vereinfachte Sicht einer Entität, die unwichtige Details auslässt. Abstraktionen sind nützlich, weil sie es uns erleichtern, über komplexe Dinge nachzudenken und sie zu verändern.
Bei der modularen Programmierung stellt jedes Modul eine Abstraktion in Form seiner Schnittstelle bereit. Diese dient als vereinfachte Sicht auf die Funktionalität des Moduls – die Details der Implementierung sind aus Sicht der Abstraktion unwichtig, daher werden sie in der Schnittstelle weggelassen.
Bei der Definition der Abstraktion ist das Wort »unwichtig« entscheidend. Je mehr unwichtige Details weggelassen werden, desto besser ist es. Aber ein Detail kann nur dann bei einer Abstraktion weggelassen werden, wenn es unwichtig ist. Eine Abstraktion kann auf zwei Arten fehlerhaft sein. Zum einen kann sie Details enthalten, die nicht wirklich wichtig sind – wenn das geschieht, wird die Abstraktion komplizierter als nötig, was die kognitive Last bei ihrem Einsatz erhöht. Der zweite Fehler ist, dass eine Abstraktion Details weglässt, die eigentlich wichtig sind. Das führt zu Unklarheiten: Schaut man sich nur die Abstraktion an, besitzt man nicht alle Informationen, die zum korrekten Einsatz notwendig sind. Eine Abstraktion, die wichtige Details weglässt, ist eine falsche Abstraktion: Sie scheint einfach zu sein, ist es aber in Wirklichkeit nicht. Der Schlüssel beim Designen von Abstraktionen ist, zu verstehen, was wichtig ist, und nach Designs Ausschau zu halten, die die Menge an wichtigen Informationen minimiert.
Stellen Sie sich zum Beispiel ein Dateisystem vor. Die von einem Dateisystem bereitgestellte Abstraktion lässt viele Details weg, zum Beispiel die Mechanismen zum Auswählen der Blöcke auf einem Storage-Device. Diese Details sind für das Einsetzen des Dateisystems unwichtig (solange das System eine ausreichende Leistung liefert). Aber manche der Implementierungsdetails eines Dateisystems sind wichtig. Die meisten Dateisysteme puffern Daten im Hauptspeicher und verzögern das Schreiben neuer Daten auf das Storage-Device, um die Performance zu verbessern. Manche Anwendungen – wie zum Beispiel Datenbanken – müssen genau wissen, wann Daten auf den Storage geschrieben werden, um sicherstellen zu können, dass diese auch nach einem Systemabsturz vorhanden sind. Daher müssen die Regeln zum Wegschreiben der Daten auf den Secondary Storage in der Schnittstelle des Dateisystems sichtbar sein.
Wir sind nicht nur beim Programmieren auf Abstraktionen angewiesen, um die Komplexität meistern zu können, sondern überall in unserem Alltag. Eine Mikrowelle enthält komplexe Elektronik, um Wechselstrom in Mikrowellenstrahlung umzuwandeln und diese dann im ganzen Garraum zu verteilen. Zum Glück findet man beim Kochen eine deutlich einfachere Abstraktion vor, die nur aus ein paar Knöpfen zum Steuern von Dauer und Intensität der Mikrowellen besteht. Autos bieten eine einfache Abstraktion, die es uns erlaubt, sie zu fahren, ohne die Mechanismen von Elektromotoren, Batteriemanagement, Antiblockiersystemen, Tempomat und so weiter verstehen zu müssen.