Objektorientierte Programmierung
Programmierparadigma, das Software als Zusammensetzung von Objekten mit Zustand und Verhalten modelliert. Fördert Modularität, Wiederverwendbarkeit und Informationskapselung.
Klassifikation
- KomplexitätMittel
- AuswirkungTechnisch
- EntscheidungstypArchitektur
- OrganisationsreifeFortgeschritten
Technischer Kontext
Prinzipien & Ziele
Use Cases & Szenarien
Kompromisse
- Falsches Modellieren von Domänen führt zu schwer wartbarem Code
- Überkomplexe Hierarchien erhöhen kognitive Belastung
- Missbrauch von Vererbung statt Komposition verursacht Engpässe
- Bevorzuge Komposition gegenüber Vererbung
- Kleine, fokussierte Klassen mit klarer Verantwortung
- Programmiere gegen Schnittstellen und nutze Abstraktionen
I/O & Ressourcen
- Fachliche Anforderungen und Anwendungsfälle
- Bestehende Architektur- und Schnittstellenbeschreibungen
- Team-Erfahrung mit OOP-Prinzipien
- Klassendiagramme und API-Spezifikationen
- Modulare, wiederverwendbare Komponenten
- Testabdeckung für Klassen und Schnittstellen
Beschreibung
Objektorientierte Programmierung ist ein fundamentales Paradigma, das Systeme als Sammlungen von Objekten mit Eigenschaften und Methoden organisiert. Es nutzt Konzepte wie Klassen, Kapselung, Vererbung und Polymorphie, um Komplexität zu reduzieren und Wiederverwendbarkeit zu fördern. OOP beeinflusst Design- und Architekturentscheidungen in vielen Sprachen.
✔Vorteile
- Verbesserte Modularität und Wiederverwendbarkeit von Code
- Bessere Abstraktion komplexer Domänen
- Erleichterte Testbarkeit und Wartbarkeit durch klare Grenzen
✖Limitationen
- Kann zu übermäßiger Schichtung und Boilerplate führen
- Nicht immer optimal für sehr einfache oder datenorientierte Aufgaben
- Vererbung kann zu starrer Kopplung und Fragilität führen
Trade-offs
Metriken
- Kohäsion
Maß für Zusammenhang der Methoden und Daten innerhalb einer Klasse.
- Kopplung
Maß für Abhängigkeiten zwischen Klassen oder Modulen.
- Anzahl öffentlicher Methoden pro Klasse
Ein Indikator für Verantwortungsumfang und Oberfläche einer Klasse.
Beispiele & Implementierungen
Bankkonto-Klassenmodell
Ein typisches Beispiel mit Konto-, Kunde- und Transaktionsklassen zur Demonstration von Kapselung und Vererbung.
GUI-Komponenten mit Vererbung
Basisklasse für UI-Komponenten und spezialisierte Widgets, die Rendering und Ereignisbehandlung kapseln.
Plugin-System einer CMS-Plattform
Plugins implementieren definierte Interfaces, werden geladen und über gemeinsame API betrieben.
Implementierungsschritte
Domäne analysieren und zentrale Konzepte identifizieren
Schnittstellen und Klassenverantwortlichkeiten definieren
Iterativ implementieren, testen und refaktorieren
⚠️ Technische Schulden & Engpässe
Tech Debt
- Veraltete Vererbungsstrukturen, die Refactoring erschweren
- Unklare Ownership von Klassen und Verantwortlichkeiten
- Fehlende Tests für kritische Klassen
Bekannte Engpässe
Beispiele für Missbrauch
- Verwendung von Vererbung für Wiederverwendung statt Extraktion
- Erzeugung vieler kleiner, unnötiger Klassen ohne klaren Nutzen
- Öffentliche mutable Felder statt kontrollierter Zugriffsmethoden
Typische Fallen
- Übermäßige Abstraktion versteckt einfache Fehler
- Nicht definierte Schnittstellen führen zu impliziten Abhängigkeiten
- Refactoring ohne Tests gefährdet Verhalten
Erforderliche Fähigkeiten
Drivers (Architectural Drivers)
Constraints
- • Programmiersprachen-Einschränkungen und Laufzeitkosten
- • Kompatibilitätsanforderungen zu bestehenden APIs
- • Teamkenntnisse in OOP-Designprinzipien