Clean Code #2: Kleine Funktionen — Eine Aufgabe, ein Name, ein Zweck
Michael Nikolaus
Vorstand & Softwarearchitekt, Minicon eG
Eine Funktion sollte genau eine Sache tun — und die gut. Klingt einfach, wird aber in der Praxis erstaunlich oft ignoriert. Warum kleine Funktionen der Schlüssel zu lesbarem Code sind.
Das Problem mit langen Funktionen
Wir alle kennen sie: Methoden mit 200, 500 oder sogar 1000 Zeilen. Sie validieren Eingaben, holen Daten aus der Datenbank, transformieren sie, prüfen Berechtigungen, senden E-Mails und loggen Ergebnisse — alles in einer einzigen Funktion.
Das Ergebnis: Niemand versteht auf den ersten Blick, was die Funktion tut. Änderungen sind riskant, weil man nicht weiß, welche Seiteneffekte sie haben. Tests sind praktisch unmöglich.
Die Regel: Eine Funktion, ein Abstraktionslevel
// ❌ Schlecht: Mehrere Abstraktionslevel gemischt
async Task ProcessOrder(Order order) {
// Validierung (Detail)
if (order.Items.Count == 0) throw new Exception("Empty");
if (order.Total < 0) throw new Exception("Invalid");
// Berechnung (Business Logic)
var tax = order.Total * 0.19m;
var shipping = order.Total > 50 ? 0 : 4.99m;
// Persistenz (Infrastructure)
await _db.Orders.AddAsync(order);
await _db.SaveChangesAsync();
// Benachrichtigung (Side Effect)
await _mailer.Send(order.CustomerEmail, "Bestätigung");
}// ✅ Gut: Jede Funktion hat ein Abstraktionslevel
async Task ProcessOrder(Order order) {
ValidateOrder(order);
var totals = CalculateOrderTotals(order);
await PersistOrder(order, totals);
await NotifyCustomer(order);
}Wie klein ist "klein"?
Robert C. Martin empfiehlt: Funktionen sollten selten mehr als 20 Zeilen haben. Das klingt radikal, führt aber zu überraschend klarem Code. Jede Funktion passt auf einen Bildschirm. Man kann sie in Sekunden verstehen.
Parameter minimieren
Die ideale Anzahl von Funktionsparametern ist null. Dann eins. Dann zwei. Drei Parameter sollten die absolute Ausnahme sein. Mehr als drei? Zeit für ein Parameter-Objekt.
// ❌ Zu viele Parameter
void CreateUser(string name, string email, string phone,
string street, string city, string zip, string country);
// ✅ Parameter-Objekt
void CreateUser(CreateUserRequest request);Keine Seiteneffekte
Eine Funktion namens CheckPassword() sollte ein Passwort prüfen — und sonst nichts. Wenn sie nebenbei die Session initialisiert, ist das ein versteckter Seiteneffekt, der zu schwer zu findenden Bugs führt.
Command-Query-Separation
Eine Funktion sollte entweder etwas tun (Command) oder etwas zurückgeben (Query) — nicht beides gleichzeitig.
// ❌ Vermischt Command und Query
bool Set(string key, string value); // setzt UND gibt Erfolg zurück
// ✅ Getrennt
void Set(string key, string value);
bool Exists(string key);Fazit
Kleine, fokussierte Funktionen sind der Kern von Clean Code. Sie sind einfacher zu verstehen, zu testen, zu ändern und wiederzuverwenden. Wenn eine Funktion mehr als eine Sache tut — extrahieren Sie eine neue.
Nächster Artikel: Clean Code #3: DRY — Don't Repeat Yourself
Lassen Sie uns über Ihr Projekt sprechen
Das erste Gespräch ist kostenlos. Wir hören Ihnen zu und finden die beste Lösung für Sie.