Was ist Clean Code und warum ist es in PHP wichtig?
Clean Code (sauberer Code) ist nicht nur ein modischer Begriff, sondern eine Entwicklungsphilosophie, die hilft, Programme zu schreiben, die nicht nur für die Maschine, sondern auch für den Menschen verständlich sind. Im Kontext von PHP, wo Code oft über Jahre von verschiedenen Teams gewartet wird, wird die Befolgung der Prinzipien von sauberem Code zu einer kritisch wichtigen Fähigkeit.
Sauberer Code hat mehrere Schlüsseleigenschaften:
- Er ist leicht zu lesen und ohne Kommentare zu verstehen
- Er ist vorhersagbar und verursacht keine "Überraschungen" bei der Ausführung
- Er ist leicht zu modifizieren, ohne das Risiko, andere Teile des Systems zu beschädigen
- Er enthält ein Minimum an Redundanz (DRY-Prinzip)
In diesem Artikel werden wir die grundlegenden Prinzipien von Clean Code anhand konkreter Beispiele von PHP-Code analysieren.
1. Benennung von Variablen und Funktionen
Schlechtes Beispiel: Was ist falsch an diesem Code?
// ❌ Schlechter Code$a = 5;$b = 10;$c = $a * $b;
function calc($x, $y) { return $x + $y * 0.2;}
$d = calc($a, $b);In diesem Beispiel ist völlig unklar, was die Variablen $a, $b, $c bedeuten und was die Funktion calc tut. Nach einem Monat werden Sie sich selbst nicht mehr daran erinnern, warum Sie diesen Code geschrieben haben.
Gutes Beispiel: Aussagekräftige Namen
// ✅ Guter Code$productPrice = 5;$quantity = 10;$totalCost = $productPrice * $quantity;
function calculatePriceWithTax(float $basePrice, float $taxRate = 0.2): float { return $basePrice + ($basePrice * $taxRate);}
$finalPrice = calculatePriceWithTax($totalCost);Benennungsregeln in PHP:
- Verwenden Sie Substantive für Variablen (
$userName,$orderTotal) - Verwenden Sie Verben für Funktionen (
getUser(),calculateTotal()) - Kürzen Sie Namen nicht ab (schreiben Sie
$customerAddress, nicht$custAddr) - Vermeiden Sie einbuchstabige Variablen (außer für Schleifenzähler
$i,$j) - Beginnen Sie boolesche Variablen mit
is,has,can($isActive,$hasPermission)
2. Kleine Funktionen und das Prinzip der einzigen Verantwortung (SRP)
Problem: Die Schweizer-Taschenmesser-Funktion
// ❌ Schlechter Code: Die Funktion macht alles auf einmalfunction processOrder(array $orderData): array { // Validierung if (empty($orderData['email'])) { throw new Exception('Email required'); } // Speichern in der DB $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', ''); $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)"); $stmt->execute([$orderData['email'], $orderData['total']]); // E-Mail senden mail($orderData['email'], 'Order confirmed', 'Thank you!'); // Logging file_put_contents('log.txt', 'Order processed: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND); return ['status' => 'success'];}Diese Funktion verstößt gegen das Prinzip der einzigen Verantwortung (Single Responsibility Principle). Sie kümmert sich um Validierung, Datenbankarbeit, E-Mail-Versand und Logging. Jede Änderung in einem dieser Prozesse erfordert eine Änderung der gesamten Funktion.
Lösung: Zerlegung in kleine Funktionen
// ✅ Guter Code: Jede Funktion ist für eine Aktion verantwortlichfunction validateOrderData(array $orderData): void { if (empty($orderData['email'])) { throw new InvalidArgumentException('Email is required'); }}
function saveOrderToDatabase(array $orderData): int { $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', ''); $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)"); $stmt->execute([$orderData['email'], $orderData['total']]); return (int)$pdo->lastInsertId();