Code Review em PHP: o que um sênior diz e como não passar vergonha

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que seu código é mandado refazer?

\n\n

Você escreveu o código. Ele funciona. Você está orgulhoso. Mas chega o code review, e o desenvolvedor sênior deixa 15 comentários, metade começando com "E se..." ou "Vamos reescrever isso usando...". Familiar?

\n\n

O code review em PHP não é sobre implicância. É sobre a sobrevivência do projeto. Seniors não olham apenas para "funciona/não funciona", mas sim como o código se comportará sob carga, como outro desenvolvedor o manterá e quanto tempo você gastará caçando um bug daqui a seis meses.

\n\n

Neste artigo, vamos analisar os comentários mais frequentes que você ouvirá em um code review de um desenvolvedor PHP experiente. Mostrarei exemplos reais de código e explicarei como corrigi-los. Após a leitura, você conseguirá antecipar 80% dos comentários e escrever um código que não dá vergonha de mostrar.

\n\n

1. "Números mágicos" e strings: o código deve falar por si

\n\n

A primeira coisa que um sênior notará são números e strings sem sentido espalhados pelo código. Números mágicos são um antipadrão que destrói a legibilidade.

\n\n

Exemplo ruim

\n
if ($user->getAge() > 18) {\n    $discount = $price * 0.1;\n}
\n\n

O que o sênior dirá?

\n
    \n
  • Por que exatamente 18? É a maioridade ou o limite para desconto?
  • \n
  • Por que 0.1? São 10%? E se o desconto mudar?
  • \n
\n\n

Exemplo bom

\n
const ADULT_AGE = 18;\nconst DISCOUNT_RATE = 0.1; // 10%\n\nif ($user->getAge() > ADULT_AGE) {\n    $discount = $price * DISCOUNT_RATE;\n}
\n\n

Agora o código conta a história sozinho. O sênior aprovará: constantes podem ser reutilizadas, alteradas em um só lugar e não exigem comentários.

\n\n

2. Falta de tipos: PHP 8 não é desculpa para tipagem dinâmica

\n\n

PHP é uma linguagem de tipagem fraca, mas isso não significa que você deve escrever como em 2005. Tipagem estrita salva de bugs difíceis de detectar.

\n\n

Exemplo ruim

\n
function calculateTotal($items, $tax) {\n    $total = 0;\n    foreach ($items as $item) {\n        $total += $item['price'] * $item['quantity'];\n    }\n    return $total * (1 + $tax);\n}
\n\n

Comentários do sênior

\n
    \n
  • O que é $items? Um array? Um objeto? Uma coleção?
  • \n
  • Qual a estrutura do elemento? Por que não usar um DTO?
  • \n
  • E se $tax for passada como string "0.2"? Vai concatenar?
  • \n
\n\n

Exemplo bom

\n
declare(strict_types=1);\n\nclass OrderItem {\n    public function __construct(\n        public readonly float $price,\n        public readonly int $quantity\n    ) {}\n}\n\nfunction calculateTotal(array $items, float $taxRate): float {\n    $total = 0.0;\n    foreach ($items as $item) {\n        if (!$item instanceof OrderItem) {\n            throw new InvalidArgumentException('Expected OrderItem');\n        }\n        $total += $item->price * $item->quantity;\n    }\n    return $total * (1 + $taxRate);\n}
\n\n

O sênior dirá: "Mandou bem, usando DTO, propriedades readonly e tipagem estrita. Código previsível." Isso é boas práticas PHP 8+.

\n\n

3. Aninhamentos profundos e Early Return

\n\n

Quando você vê 5 níveis de if...else dentro de um único método, o sênior segura a cabeça. Esse código é impossível de ler, testar e debugar.

\n\n

Exemplo ruim

\n
public function processOrder($order) {\n    if ($order->isPaid()) {\n        if ($order->hasStock()) {\n            if ($order->isShippable()) {\n                // 50 linhas de lógica\n                return $this->ship($order);\n            } else {\n                throw new \\Exception('Order cannot be shipped');\n            }\n        } else {\n            throw new \\Exception('Out of stock');\n        }\n    } else {\n        throw new \\Exception('Order not paid');\n    }\                

Blogs

Book Recommendations