Clean Code em PHP: princípios e exemplos
Todo desenvolvedor PHP já passou pela situação em que o próprio código se torna incompreensível depois de alguns meses. E o que dizer do código alheio, herdado da equipe anterior. Isso leva a bugs, longo onboarding de novatos e relutância em fazer alterações. A solução para esse problema são os princípios do Clean Code (código limpo), popularizados por Robert Martin (Tio Bob). Neste artigo, vamos analisar os principais princípios do Clean Code aplicados ao PHP e ver exemplos concretos.
1. Nomenclatura de variáveis, funções e classes
A nomenclatura correta é a base de um código legível. O nome deve responder às perguntas: "O que é isso?" e "Para que serve?". Não economize letras em prol da brevidade.
Exemplo ruim (código ruim)
<?phpfunction getData($d, $u) { $r = []; foreach ($d as $i) { if ($i['status'] === 'active' && $i['user_id'] === $u) { $r[] = $i; } } return $r;}?>Exemplo bom (código limpo)
<?phpfunction getActiveOrdersByUser(array $orders, int $userId): array{ $activeOrders = []; foreach ($orders as $order) { if ($order['status'] === 'active' && $order['user_id'] === $userId) { $activeOrders[] = $order; } } return $activeOrders;}?>Regras de nomenclatura:
- Variáveis — substantivos:
$userName,$orderTotal. - Funções — verbos:
calculateTotal(),sendEmail(). - Classes — substantivos no singular:
UserRepository,OrderProcessor. - Variáveis booleanas — comece com
is,has,can:$isActive,$hasPermission. - Evite abreviações (
$usr), transliterações ($sozdanieZakaza) e variáveis de uma letra (exceto contadores de loop$i).
2. Funções: pequenas e com uma única responsabilidade
Uma função deve fazer apenas uma coisa e fazê-la bem. Se uma função executa várias tarefas — ela precisa ser dividida. O tamanho ideal de uma função é de 10 a 20 linhas.
Exemplo ruim (função faz tudo)
<?phpfunction processOrder(array $orderData): bool{ // Validação if (empty($orderData['items'])) { return false; } // Cálculo do valor $total = 0; foreach ($orderData['items'] as $item) { $total += $item['price'] * $item['quantity']; } // Salvamento no BD $sql = "INSERT INTO orders (user_id, total, status) VALUES (?, ?, 'new')"; $stmt = $this->db->prepare($sql); $stmt->execute([$orderData['user_id'], $total]); // Envio de email mail($orderData['email'], 'Order Confirmation', 'Your order is placed'); return true;}?>Exemplo bom (divisão em funções pequenas)
<?phpclass OrderService{ public function processOrder(array $orderData): bool { if (!$this->validateOrder($orderData)) { return false; } $total = $this->calculateTotal($orderData['items']); $orderId = $this->saveOrder($orderData['user_id'], $total); $this->sendConfirmationEmail($orderData['email']); return true; }
private function validateOrder(array $orderData): bool { return !empty($orderData['items']); }
private function calculateTotal(array $items): float { $total = 0; foreach ($items as $item) { $total += $item['price'] * $item['quantity']; } return $total; }
private function s
```