¿Qué es Clean Code y por qué es importante en PHP?
Clean Code (código limpio) no es solo un término de moda, sino una filosofía de desarrollo que ayuda a escribir programas comprensibles no solo para la máquina, sino también para las personas. En el contexto de PHP, donde el código a menudo es mantenido durante años por diferentes equipos, seguir los principios del código limpio se convierte en una habilidad críticamente importante.
El código limpio tiene varias características clave:
- Es fácil de leer y entender sin comentarios
- Es predecible y no causa "sorpresas" durante la ejecución
- Es fácil de modificar sin riesgo de romper otras partes del sistema
- Contiene un mínimo de duplicación (principio DRY)
En este artículo analizaremos los principios fundamentales de Clean Code con ejemplos concretos de código PHP.
1. Nombrado de variables y funciones
Ejemplo malo: ¿qué está mal con este código?
// ❌ Código malo$a = 5;$b = 10;$c = $a * $b;
function calc($x, $y) { return $x + $y * 0.2;}
$d = calc($a, $b);En este ejemplo, no está nada claro qué significan las variables $a, $b, $c y qué hace la función calc. En un mes, usted mismo no recordará por qué escribió este código.
Ejemplo bueno: nombres con significado
// ✅ Código bueno$productPrice = 5;$quantity = 10;$totalCost = $productPrice * $quantity;
function calculatePriceWithTax(float $basePrice, float $taxRate = 0.2): float { return $basePrice + ($basePrice * $taxRate);}
$finalPrice = calculatePriceWithTax($totalCost);Reglas de nombrado en PHP:
- Use sustantivos para variables (
$userName,$orderTotal) - Use verbos para funciones (
getUser(),calculateTotal()) - No abrevie nombres (escriba
$customerAddress, no$custAddr) - Evite variables de una sola letra (excepto contadores de bucles
$i,$j) - Las variables booleanas comiencen con
is,has,can($isActive,$hasPermission)
2. Funciones pequeñas y principio de responsabilidad única (SRP)
Problema: la función navaja suiza
// ❌ Código malo: la función lo hace todo a la vezfunction processOrder(array $orderData): array { // Validación if (empty($orderData['email'])) { throw new Exception('Email required'); } // Guardar en BD $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', ''); $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)"); $stmt->execute([$orderData['email'], $orderData['total']]); // Enviar email mail($orderData['email'], 'Order confirmed', 'Thank you!'); // Registro file_put_contents('log.txt', 'Order processed: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND); return ['status' => 'success'];}Esta función viola el principio de responsabilidad única (Single Responsibility Principle). Se encarga de validación, trabajo con BD, envío de correo y registro. Cualquier cambio en uno de estos procesos requerirá modificar toda la función.
Solución: descomposición en funciones pequeñas
// ✅ Código bueno: cada función se encarga de una acciónfunction 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();