Abstraktion
Abstraktion bedeutet, Einzelheiten zu verallgemeinern beziehungsweise komplexe Sachverhalte auf das Wesentliche zu vereinfachen. Entwurfsmuster wären ein relativ fortgeschrittenes Beispiel für Abstraktion in der Software-Entwicklung. Abstrakte Kunst wäre ein eher fluffiges Beispiel; ein Abbild der Natur auf wenige Farben und einfache geometrische Figuren reduzieren, ist aber vermutlich auch nicht jedermanns Sache. Also meine jedenfalls nicht.
Im Alltag ist Geld ein sehr gutes Beispiel für eine Abstraktion über Tauschgeschäfte. Wer beispielsweise Holz gegen Kartoffeln tauscht, kann die Frage "wie viel ist das in Fischen?" nur schwer beantworten. 10 EUR Holz entsprechen 10 EUR Kartoffeln und das entspricht 10 EUR Fisch. Unser Leben ist dank Geld so viel einfacher geworden! (Wenn es nicht dadurch auch ungleich komplizierter geworden wäre, aber das würde jetzt zu weit führen).
Bedienoberflächen als Abstraktion
Werden wir technischer. Die Bedienoberfläche jedes Geräts ist eine Abstraktion, meist sogar eine sehr gute. Wer weiß schon, was im Automotor passiert, wenn wir auf das Gaspedal treten?
Das gilt natürlich nicht nur für die Bedienoberflächen von Hardware, sondern auch für Software. Hinter der Bedienoberfläche arbeitet vermutlich eine in einer Hochsprache wie PHP geschriebene Software. Die Runtime von PHP ist in C geschrieben und wurde in Maschinensprache übersetzt. Diese arbeitet direkt auf dem Mikroprozessor und funktioniert verwendet Speicherzugriffe, Register und Recheneinheiten der CPU. Die CPU besteht aus Schaltkreisen wie beispielsweise NAND-Gattern, die wiederum aus Transistoren aufgebaut sind. Die nächsten beiden uns noch bekannten Abstraktionsebenen darunter sind die Festkörperphysik und dann die Quantenmechanik.
(Wer weiß schon, wie viele Ebenen es darunter noch gibt, man dachte ja lange Zeit, Atome wären unteilbar, und dann glaubte man eine ganze Zeit daran, dass Elektronen, Protonen und Neutronen die kleinsten Bausteine sind.)
Abstraktionsebenen in der Programmiersprache
Ein PHP-Framework ist im Wesentlichen eine Abstraktion über HTTP-Requests und HTTP-Responses, oder sagen wir mal generell über die Verarbeitung einer HTTP-Anfrage. Ein objektrelationaler Mapper (ORM) wie Doctrine ist eine "Wer braucht schon SQL?"-Abstraktion über Datenbankzugriffe.
Aber auch die Programmiersprache PHP selbst bietet uns verschiedene Abstraktionsebenen.
Ich kann eine Datei entweder sehr einfach mit file_get_contents()
laden oder ich verwende fopen()
, um einen File Handle zu bekommen, lese dann mit fread()
, fgets()
, fgetc()
oder ähnlichen Funktionen.
Danach schließe ich die Datei mit fclose()
.
Es gibt Anwendungsfälle, in denen wir uns beim Dateizugriff auf die Ebene des Byte-Gefrickels begeben müssen, beispielsweise wenn wir aus sehr großen Dateien blockweise lesen oder Daten gezielt überschreiben wollen.
Im Allgemeinen wird eine Geschäftsanwendung aber mit der höheren Abstraktionsstufe file_get_contents()
beziehungsweise file_put_contents()
auskommen.
Wenn wir auf eine MySQL-Datenbank zugreifen wollen, dann können wir das mit den Funktionen der mysqli
-Extension tun oder PDO
verwenden.
Letzteres ist eine Abstraktion, die es uns ermöglicht, über einheitlichen PHP-Code auf verschiedene Datenbanken zuzugreifen.
Das ändert nichts an der Tatsache, dass jede Datenbank ihre Eigenheiten hat und teilweise unterschiedliche SQL-Dialekte spricht, ist aber trotzdem eine Abstraktion.
Ein Betriebssystem ist übrigens eine Abstraktion über der Hardware, die es überhaupt erst möglich macht, in einer Programmiersprache portable Anwendungen zu schreiben, die auf verschiedenen Rechnern trotz Unterschieden in der Hardware funktionieren.
Fachliche Abstraktionen
Für Anwendungsentwickler am interessantesten sind die fachlichen Abstraktionen. Das ist typischerweise der Code, den wir selbst schreiben müssen, weil wir ihn eben nicht mehr einfach aus dem Internet herunterladen können. Also die Verträge, Kundenbeziehungen, Rechnungen, Bestellungen, Auftragsbestätigungen oder was auch immer Deine Geschäftslogik an Abstraktionen in Form von Services, Entitäten, Aggregates oder einfach nur Plain Old PHP Objects braucht. Auch hier können wir verschiedene Abstraktionsebenen unterschieden. Die kleinsten Bausteine unserer Domäne sollten Wertobjekte sein. Darauf bauen Entitäten oder Aggregates auf, die dann möglicherweise in Collections gruppiert, die wiederum von Services verwendet werden.
Das Spannende an fachlicher Abstraktion ist, dass es darüber deutlich weniger Konsens gibt - und geben kann - als über technische(re) Abstraktionen. Datenbankzugriff ist nicht Dateisystemzugriff und das ist nicht Geschäftslogik. Das ist vermutlich jedem Entwickler klar und es herrscht Einigkeit darüber. Welche Abstraktionen aber fachlich für ein Unternehmen sinnvoll sind, ist je nach Anwendungsfall verschieden. Das macht den Austausch zwischen Entwicklern verschiedener Unternehmen schwer, weil Erkenntnisse aus einem Unternehmen im Allgemeinen nicht auf andere Unternehmen übertragbar sind.
Von Leaky Abstractions sprechen wir, wenn eine Abstraktion Komplexität nicht vollständig verbergen kann und Implementierungsdetails sichtbar bleiben beziehungsweise werden.
Schau Dir das Single Level of Abstraction-Prinzip an, es kann Dir dabei helfen, Methoden zu kürzen und ein besseres Gespür für verschiedene Abstraktionsebenen zu entwickeln.