O que é Clean Code e por que é importante em PHP?
Clean Code (código limpo) não é apenas um termo da moda, mas uma filosofia de desenvolvimento que ajuda a escrever programas compreensíveis não apenas para a máquina, mas também para o ser humano. No contexto do PHP, onde o código é frequentemente mantido por anos por diferentes equipes, seguir os princípios do código limpo se torna uma habilidade criticamente importante.
O código limpo possui várias características-chave:
- É fácil de ler e entender sem comentários
- É previsível e não causa "surpresas" durante a execução
- É fácil de modificar sem o risco de quebrar outras partes do sistema
- Contém o mínimo de duplicação (princípio DRY)
Neste artigo, vamos analisar os princípios básicos do Clean Code com exemplos concretos de código PHP.
1. Nomenclatura de variáveis e funções
Exemplo ruim: o que há de errado com este código?
// ❌ Código ruim$a = 5;$b = 10;$c = $a * $b;
function calc($x, $y) { return $x + $y * 0.2;}
$d = calc($a, $b);Neste exemplo, não está claro o que significam as variáveis $a, $b, $c e o que a função calc faz. Em um mês, você mesmo não se lembrará por que escreveu este código.
Exemplo bom: nomes significativos
// ✅ Código bom$productPrice = 5;$quantity = 10;$totalCost = $productPrice * $quantity;
function calculatePriceWithTax(float $basePrice, float $taxRate = 0.2): float { return $basePrice + ($basePrice * $taxRate);}
$finalPrice = calculatePriceWithTax($totalCost);Regras de nomenclatura em PHP:
- Use substantivos para variáveis (
$userName,$orderTotal) - Use verbos para funções (
getUser(),calculateTotal()) - Não abrevie nomes (escreva
$customerAddress, não$custAddr) - Evite variáveis de uma letra (exceto contadores de loop
$i,$j) - Variáveis booleanas comece com
is,has,can($isActive,$hasPermission)
2. Funções pequenas e princípio da responsabilidade única (SRP)
Problema: função canivete suíço
// ❌ Código ruim: função faz tudo de uma vezfunction processOrder(array $orderData): array { // Validação if (empty($orderData['email'])) { throw new Exception('Email required'); } // Salvamento no 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']]); // Envio de email 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'];}Esta função viola o princípio da responsabilidade única (Single Responsibility Principle). Ela lida com validação, trabalho com BD, envio de e-mail e logging. Qualquer alteração em um desses processos exigirá a modificação de toda a função.
Solução: decomposição em funções pequenas
// ✅ Código bom: cada função é responsável por uma açãofunction 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();}