- 1 Section
- 10 Lessons
- unbegrenzt
- Objektorientierte Programmierung (OOP)10
Prozedural vs. objektorientiert
Bevor wir uns auf Klassen, Vererbung und Interfaces stürzen, sollten wir verstehen warum es OOP überhaupt gibt. Programmiersprachen haben sich Jahrzehnte lang ohne Objekte ausgekommen – Pascal, C, Fortran sind allesamt klassische prozedurale Sprachen. Trotzdem hat sich OOP in den 90ern und 2000ern als dominantes Paradigma durchgesetzt. Was ist der Unterschied, und warum die Wende?
Diese Einstiegslektion zeigt beide Welten am gleichen Beispiel, damit der Kontrast sichtbar wird. Du lernst die fundamentalen Bauprinzipien beider Stile, ihre Stärken und Schwächen, und bekommst eine Übersicht der wichtigsten Paradigmen. Konkrete Klassen und Vererbung kommen in den nächsten Lektionen – hier geht's um das Mindset.
1) Was ist ein Paradigma?
Ein Programmierparadigma ist ein grundsätzlicher Stil, ein Denkmodell wie man Software baut. Es ist mehr als nur Syntax – es betrifft die Frage „wie strukturiere ich mein Programm?". Ähnlich wie es in der Architektur verschiedene Stile gibt (gotisch, modern, brutalistisch), gibt es in der Software verschiedene Paradigmen mit eigenen Stärken.
Die wichtigsten sind:
2) Das Beispielproblem
Um den Unterschied zwischen prozedural und OOP konkret zu zeigen, nehmen wir ein einfaches Problem: Mehrere Konten verwalten. Jedes Konto hat einen Kontoinhaber und einen Saldo, man kann einzahlen und abheben. Klingt banal, ist aber repräsentativ für tausende Geschäfts-Szenarien.
Wir implementieren das in beiden Stilen und vergleichen, was passiert wenn die Anforderungen wachsen.
3) Der prozedurale Weg
Prozedural heißt: Daten in Variablen, Logik in Funktionen, beides voneinander getrennt. Du schreibst Funktionen, die Daten als Parameter bekommen und sie verändern. Hier in Python als prozeduraler Stil:
Das funktioniert. Aber jedes Mal wenn du eine Operation machst, musst du explizit das passende Konto-Dict als ersten Parameter mitgeben. Die Datenstrukturen und die Funktionen sind nicht direkt verknüpft – die Logik steht im Programm-Code, die Daten in Variablen.
4) Der objektorientierte Weg
OOP-Idee: Daten und die zugehörigen Funktionen in ein gemeinsames „Objekt" packen. Eine Konto-Klasse bündelt beides. Jedes Konto ist ein Objekt mit eigenen Daten und eigenen Methoden:
Sieht erstmal länger aus. Aber bemerk den Unterschied: konto_anna.einzahlen(200) statt einzahlen(konto_anna, 200). Die Methode gehört zum Objekt. Du schickst dem Objekt eine „Nachricht" und es weiß was zu tun ist. Wenn du später hundert Methoden hast, ist die Klasse die natürliche Heimat – kein Suchen mehr im Code.
5) Animation: Datenstruktur-Evolution
Schauen wir uns Schritt für Schritt an, wie sich die Datenstruktur entwickelt. In der Animation siehst du wie aus verstreuten Variablen erst strukturierte Records werden, und am Ende echte Objekte:
saldo: 1000}
saldo: 500}
konto_anna.einzahlen(200) – das Objekt „weiß" was es kann. Klare Verantwortlichkeit.6) Die vier Säulen der OOP
OOP definiert sich nicht nur durch Klassen. Es gibt vier fundamentale Konzepte, die zusammen das Paradigma ausmachen. Jedes davon hat eine eigene Lektion in diesem Kurs:
- Kapselung (L4): Daten und Methoden in einer Einheit bündeln, interne Details vor außen verbergen.
- Vererbung (L5): Eine neue Klasse erbt Eigenschaften einer bestehenden, kann sie erweitern. Hierarchien!
- Polymorphismus (L6): Verschiedene Objekte reagieren auf die gleiche Nachricht unterschiedlich.
- Abstraktion (L7): Wesentliches herausheben, Details verstecken. Interfaces und abstrakte Klassen.
Manche Bücher zählen auch Assoziation, Komposition und andere Beziehungs-Typen als Säulen. Aber die vier oben sind der harte Kern.
7) Direkter Vergleich
Welche Aspekte werden in beiden Stilen wie gehandhabt? Hier eine Übersicht:
8) Code-Vergleich Side-by-Side
Bauen wir die Anforderung weiter aus. Neue Idee: Ein Sparbuch, das wie ein Konto funktioniert, aber zusätzlich Zinsen berechnet. Schau wie unterschiedlich die beiden Welten reagieren:
zinsen_zuschlagen für jedes Konto-Dict aufrufbar? Was wenn jemand es auf ein normales Konto anwendet, das keinen Zinssatz hat? → KeyError. Du brauchst extra Checks im Code, oder eine "type"-Spalte im Dict.Sparbuch erbt von Konto: alle bestehenden Methoden kommen umsonst mit. Nur das Neue (Zinsen) muss programmiert werden. Type-Safety ist eingebaut – sparbuch.zinsen() geht, normales_konto.zinsen() wäre ein Fehler.9) Wann was?
Die Wahl des Paradigmas hängt von Projekt-Größe, Team und Problem ab. Faustregeln:
Prozedural ist gut für:
- Kleine Skripte (unter 200 Zeilen)
- Datenverarbeitungs-Pipelines (CSV einlesen, transformieren, ausgeben)
- Mathematische Berechnungen und Algorithmen
- Einmalige Auswertungen, Wegwerf-Code
- Shell-Skripte und Systemverwaltung
OOP ist gut für:
- Große Anwendungen mit vielen Komponenten
- Software die jahrelang gewartet wird
- GUI-Anwendungen (Buttons, Fenster, Widgets passen perfekt zu Klassen)
- Geschäfts-Software mit komplexen Entitäten (Kunden, Bestellungen, Produkte)
- Frameworks und Libraries die andere Entwickler nutzen sollen
Funktional ist gut für:
- Datentransformationen (map, filter, reduce)
- Hochparallele Systeme (keine Seiteneffekte = einfaches Threading)
- Mathematische Probleme
10) Die Geschichte der OOP
Kurzer historischer Abriss, weil's hilft die Logik dahinter zu verstehen:
- 1967: Simula 67 in Norwegen führt das Klassen-Konzept ein – ursprünglich für Simulationen.
- 1970er: Smalltalk bei Xerox PARC – die erste „pure" OO-Sprache, prägt Begriffe wie „Nachricht senden".
- 1980er: C++ bringt OOP in den Mainstream (Aufsatz auf C).
- 1995: Java – OOP in jeder Hochschule, jedem Unternehmen.
- 2000er: C#, Ruby, Python (OOP-fähig) prägen die nächste Generation.
- 2010er-heute: Hybridsprachen dominieren – Kotlin, Scala, Rust, Go, TypeScript mischen OOP mit funktionalen Ideen.
Wer mehr darüber wissen will: Alan Kay, einer der Smalltalk-Erfinder, hat gesagt OOP sei eigentlich um Nachrichten zwischen Objekten gegangen – nicht um Klassen oder Vererbung. Heute haben sich aber Klassen-basierte Sprachen durchgesetzt.
Zusammenfassung
Paradigmen sind grundsätzliche Stile zum Bau von Software. Prozedural trennt Daten und Funktionen, OOP bündelt sie in Objekten. Vier Säulen der OOP: Kapselung, Vererbung, Polymorphismus, Abstraktion. Prozedural ist gut für Skripte und Algorithmen, OOP für große Anwendungen mit komplexen Entitäten. Moderne Sprachen sind multi-paradigma – man mischt bewusst je nach Problem. OOP ist keine „bessere" Welt, sondern ein Werkzeug für Skalierung und Wartbarkeit.
