Objektorientierung in C#: Klassen, Objekte und saubere Verantwortlichkeiten
Objektorientierung ist kein Selbstzweck. Richtig eingesetzt hilft sie dabei, große Anwendungen verständlich, testbar und erweiterbar zu halten. Schlecht eingesetzt erzeugt sie dagegen unnötige Klassen, Abhängigkeiten und schwer nachvollziehbare Zustände.
Eine praxisnahe Einführung in objektorientierte Programmierung mit C#: Klassen, Objekte, Kapselung, Vererbung und typische Architekturfehler verständlich erklärt.
Was Objektorientierung praktisch bedeutet
Eine Klasse beschreibt Struktur und Verhalten eines fachlichen oder technischen Bausteins. Ein Objekt ist eine konkrete Instanz dieser Beschreibung.
Entscheidend ist nicht die Anzahl der Klassen, sondern ob jede Klasse eine klare Verantwortung besitzt und ihre Daten kontrolliert verwaltet.
- Klassen modellieren Verantwortung
- Objekte halten Zustand
- Methoden verändern oder lesen diesen Zustand
- Schnittstellen begrenzen Abhängigkeiten
Kapselung schützt Regeln
Kapselung bedeutet, dass interne Daten nicht beliebig von außen verändert werden können. Statt öffentliche Felder zu verteilen, sollte eine Klasse selbst darüber entscheiden, welche Zustandsänderungen erlaubt sind.
public sealed class Order
{
public decimal Total { get; private set; }
public void AddItem(decimal price)
{
if (price <= 0)
throw new ArgumentOutOfRangeException(nameof(price));
Total += price;
}
} Vererbung nur mit echtem Ist-ein-Verhältnis
Vererbung wird oft zu früh eingesetzt. In vielen Fällen ist Komposition robuster: Eine Klasse verwendet andere klar abgegrenzte Bausteine, statt tief in einer Vererbungshierarchie zu hängen.
Eine gute Faustregel lautet: Vererbung nur dann, wenn das Unterobjekt fachlich wirklich eine spezialisierte Form des Basistyps ist und dessen Vertrag vollständig erfüllt.
Typische Fehler
Die häufigsten Probleme entstehen nicht durch fehlende Syntaxkenntnisse, sondern durch unklare Verantwortlichkeiten.
- God Classes mit zu vielen Aufgaben
- Datenklassen ohne eigenes Verhalten
- statische globale Zustände
- Vererbung nur zur Codewiederverwendung
- Abhängigkeiten auf konkrete Implementierungen statt Schnittstellen
Fazit
Gute Objektorientierung macht Verhalten und Regeln sichtbar. Eine Klasse sollte einen klaren Zweck erfüllen, ihren Zustand schützen und möglichst wenig über andere Teile des Systems wissen.