Begriff
Abstraction
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Dein Handy ist ein Wunderwerk der Technik (CPU, GPU, Modem). Aber für dich ist es ein schwarzes Rechteck mit bunten Icons. Das Betriebssystem abstrahiert die Hardware. Du musst nicht wissen, wie man Elektronen durch Transistoren schiebt, um Angry Birds zu spielen. Du nutzt eine vereinfachte Oberfläche. Programmieren ist die Kunst, Schichten von Abstraktion zu bauen. Je höher die Abstraktion, desto weniger Datenmüll hast du im Kopf.
Merksatz: Das Reduzieren von Komplexität, indem man sich auf das Wesentliche konzentriert und unwichtige Details verbirgt.
Interface:
interface Kaffeemaschine { kochen(); }
Es ist mir egal, wie sie kocht (Filter, Pad, Bohne).
Ich will nur, dass Kaffee rauskommt.
Das Interface ist die Abstraktion. Die Klasse Senseo ist die konkrete Implementierung.
1. Leaky Abstraction
Jede Abstraktion hat Löcher. TCP abstrahiert das unzuverlässige Netzwerk ("Daten kommen immer an"). Aber wenn das Kabel durchschnitten wird, merkst du es doch (Timeout). Du musst wissen, was unter der Haube passiert, um Fehler zu verstehen. "Wer SQL nicht versteht, schreibt schlechte ORM-Abfragen."
2. Abstraction Layers
- Hardware (Transistoren).
- Maschinencode.
- Betriebssystem (Kernel).
- C-Standardbibliothek.
- Python Interpreter.
- Django Framework.
- Deine App. Jede Schicht verlässt sich darauf, dass die Schicht darunter funktioniert.
3. Premature Abstraction
Gefahr!
"Ich baue eine AnimalControllerBaseFactoryManagerImpl".
Du abstrahiert Dinge, die gar nicht komplex sind.
Das macht den Code schwerer zu lesen ("Over-Engineering").
Regel: Abstrahiere erst, wenn du dich zum dritten Mal wiederholst (Rule of Three).
1. Inversion of Control (IoC) und Dependency Injection
Wenn man stark abstrahiert, entsteht ein Problem: Wer entscheidet, welche konkrete Implementierung genutzt wird?
Hier kommt IoC ins Spiel. Statt dass eine Klasse ihre Abhängigkeiten selbst erschafft (db = new MySQL()), bekommt sie ein Interface übergeben (Dependency Injection):
// Konstruktor fordert nur eine Abstraktion, kein konkretes Objekt
public UserService(DatabaseInterface db) {
this.db = db;
}
Ein IoC-Container (wie Spring Boot) kümmert sich beim Start darum, das echte MySQL-Objekt in diese Abstraktion hineinzureichen. Das macht den Code extrem testbar, da man für Unit-Tests einfach ein Fake-Objekt übergeben kann.
2. Duck Typing (Polymorphismus ohne Interface)
In statisch getypten Sprachen (Java) erzwingt man Abstraktion über harte interfaces.
In dynamischen Sprachen (Python, JS) nutzt man oft Duck Typing: "If it walks like a duck and quacks like a duck, it must be a duck."
def koche_wasser(wasserkocher):
wasserkocher.kochen() # Python ist das Interface egal, Hauptsache die Methode existiert!
Das ist Abstraktion auf Zeilenebene. Es reduziert den Boilerplate-Code enorm, erhöht aber die Gefahr für Laufzeitfehler, wenn das übergebene Objekt am Ende gar keine kochen() Methode hat.
3. OSI-Modell als ultimative Netz-Abstraktion
Das OSI-Modell ist ein Lehrbeispiel für perfekte Abstraktion. Der Application Layer (OSI Layer 7) (HTTP) weiß absolut nichts von Kupferkabeln oder Funkwellen (Layer 1). Er übergibt den Text nur an TCP (Transmission Control Protocol) (Layer 4). TCP garantiert, dass alles ankommt, abstrahiert aber die Frage, welchen Weg das Paket nimmt (das macht IP auf Layer 3). Jede Schicht interagiert nur mit der direkt darunterliegenden Schicht über klar definierte Interfaces. Fällt das Ethernet-Kabel aus und man wechselt auf WLAN, merkt der HTTP-Web Server davon nichts.
Quick-Check
High-Level vs Low-Level?
High-Level (Python): Viel Abstraktion (Memory Management automatisch). Low-Level (C/Assembler): Wenig Abstraktion (du kontrollierst jedes Bit).DSL (Domain Specific Language)?
Eine Sprache, die speziell für ein Problem gebaut ist (z. B. SQL für Daten, CSS für Styles). Sie abstrahiert alles andere weg.Black Box?
Das Ziel der Abstraktion. Input rein -> Output raus. Was drinnen passiert, ist "Magic".