Clean Code em PHP: princípios e exemplos na prática
\nCódigo limpo não é um luxo, mas uma necessidade para qualquer desenvolvedor PHP profissional. Quando você escreve código fácil de ler, entender e modificar, economiza tempo para si e para sua equipe. Neste artigo, vamos analisar os princípios-chave do Clean Code em PHP com exemplos concretos que podem ser aplicados imediatamente em projetos.
\n\nPor que o código limpo é importante para projetos PHP?
\nPHP é uma linguagem flexível, mas essa flexibilidade muitas vezes leva ao caos se a qualidade do código não for monitorada. O código limpo ajuda a:
\n- \n
- Encontrar e corrigir erros mais rapidamente; \n
- Adicionar novas funcionalidades facilmente sem o risco de quebrar a lógica existente; \n
- Reduzir o tempo de integração de novos desenvolvedores no projeto; \n
- Aumentar a estabilidade geral da aplicação. \n
Vamos passar para os princípios e exemplos específicos.
\n\nNomes corretos de variáveis e funções
\nO primeiro passo para um código limpo são nomes significativos. O nome deve responder à pergunta "O que é isso?" ou "O que faz?".
\n\nExemplo ruim
\n<?php\n$a = 86400;\n$b = $a * 7;\n$c = $b * 0.8;\n\nExemplo bom (Clean Code)
\n<?php\n$secondsPerDay = 86400;\n$weeklySeconds = $secondsPerDay * 7;\n$discountedWeeklySeconds = $weeklySeconds * 0.8;\n\nPrincípio: Os nomes devem ser descritivos e não exigir comentários. Evite abreviações (exceto as amplamente aceitas, como $i para contador de loop).
Exemplo para funções
\n<?php\n// Ruim\nfunction calc($a, $b) {\n return $a + $b * 1.2;\n}\n\n// Bom\nfunction calculateTotalWithTax(float $price, float $taxRate = 0.2): float {\n return $price * (1 + $taxRate);\n}\n\nPrincípio da Responsabilidade Única (SRP) em classes
\nUm dos princípios SOLID afirma: "Uma classe deve ter apenas um motivo para mudar". Isso significa que cada classe deve ser responsável por uma tarefa específica.
\n\nViolação do SRP
\n<?php\nclass OrderProcessor {\n public function process(Order $order) {\n // Validação do pedido\n if (empty($order->items)) {\n throw new Exception("Pedido vazio");\n }\n \n // Salvar no banco de dados\n $this->saveToDatabase($order);\n \n // Enviar email\n mail($order->email, "Pedido confirmado", "Obrigado pela compra!");\n \n // Gerar fatura em PDF\n $this->generateInvoice($order);\n }\n}\n\nImplementação limpa com SRP
\n<?php\nclass OrderValidator {\n public function validate(Order $order): void {\n if (empty($order->items)) {\n throw new Exception("Pedido vazio");\n }\n }\n}\n\nclass OrderRepository {\n public function save(Order $order): void {\n // Lógica de salvar no banco de dados\n }\n}\n\nclass EmailNotifier {\n public function sendOrderConfirmation(Order $order): void {\n mail($order->email, "Pedido confirmado", "Obrigado pela compra!");\n }\n}\n\nclass InvoiceGenerator {\n public function generate(Order $order): string {\n // Geração de PDF\n return "invoice_".$order->id.".pdf";\n }\n}\n\n// Uso\nclass OrderProcessor {\n public function __construct(\n private OrderValidator $validator,\n private OrderRepository $repository,\n private EmailNotifier $notifier,\n private InvoiceGenerator $invoiceGenerator\n ) {}\n \n public function process(Order $order): void {\n $this->validator->validate($order);\n $this->repository->save($order);\n $this->notifier->sendOrderConfirmation($order);\n $this->invoiceGenerator->generate($order);\n }\n}\n\nAgora cada classe é responsável por sua área de responsabilidade, o que simplifica os testes e a manutenção.
\n\n