home / skills / victorsmaniotto / degestao / code-analyzer
npx playbooks add skill victorsmaniotto/degestao --skill code-analyzerReview the files below or copy the command above to add this skill to your agents.
---
name: code-analyzer
description: Análise estática de código para identificar code smells, complexidade ciclomática, duplicações, violações de padrões, acoplamento excessivo, e métricas de qualidade. Usar para avaliar qualidade de código, identificar pontos de refatoração, medir débito técnico, verificar aderência a padrões PSR/SOLID, e gerar relatórios de qualidade para gestão.
---
# Code Analyzer
Skill para análise estática e métricas de qualidade de código PHP.
## Métricas Principais
| Métrica | Ideal | Alerta | Crítico |
|---------|-------|--------|---------|
| Complexidade Ciclomática | ≤10 | 11-20 | >20 |
| Linhas por Método | ≤20 | 21-50 | >50 |
| Linhas por Classe | ≤200 | 201-500 | >500 |
| Parâmetros por Método | ≤4 | 5-7 | >7 |
| Profundidade de Herança | ≤3 | 4-5 | >5 |
| Acoplamento Aferente (Ca) | ≤20 | 21-40 | >40 |
| Acoplamento Eferente (Ce) | ≤20 | 21-40 | >40 |
## Code Smells Comuns
### 1. God Class (Classe Deus)
```php
// ❌ SMELL: Classe faz muitas coisas
class UserManager
{
public function create() { }
public function update() { }
public function delete() { }
public function sendEmail() { } // Responsabilidade de Email
public function generateReport() { } // Responsabilidade de Report
public function processPayment() { } // Responsabilidade de Payment
public function exportToCsv() { } // Responsabilidade de Export
}
// ✅ SOLUÇÃO: Separar responsabilidades
class UserService { }
class UserEmailService { }
class UserReportService { }
class PaymentService { }
class UserExporter { }
```
### 2. Long Method
```php
// ❌ SMELL: Método com 100+ linhas
public function processOrder($data)
{
// validação (20 linhas)
// cálculo de preço (30 linhas)
// aplicar desconto (15 linhas)
// processar pagamento (25 linhas)
// enviar notificações (20 linhas)
}
// ✅ SOLUÇÃO: Extrair métodos
public function processOrder(OrderData $data): Order
{
$this->validateOrder($data);
$order = $this->createOrder($data);
$order = $this->applyPricing($order);
$this->processPayment($order);
$this->notifyStakeholders($order);
return $order;
}
```
### 3. Feature Envy
```php
// ❌ SMELL: Método usa mais dados de outra classe
class OrderProcessor
{
public function calculateTotal(Order $order)
{
return $order->getPrice()
+ $order->getTax()
- $order->getDiscount()
+ $order->getShipping();
}
}
// ✅ SOLUÇÃO: Mover lógica para classe dona dos dados
class Order
{
public function calculateTotal(): float
{
return $this->price + $this->tax - $this->discount + $this->shipping;
}
}
```
### 4. Primitive Obsession
```php
// ❌ SMELL: Usar primitivos para conceitos de domínio
function createUser(string $email, string $cpf, string $phone) { }
// ✅ SOLUÇÃO: Value Objects
function createUser(Email $email, Cpf $cpf, Phone $phone) { }
readonly class Email
{
public function __construct(public string $value)
{
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Email inválido');
}
}
}
```
### 5. Excessive Parameters
```php
// ❌ SMELL: Muitos parâmetros
function createContract(
$clientId, $value, $date, $status,
$notes, $category, $paymentMethod, $installments
) { }
// ✅ SOLUÇÃO: Parameter Object
function createContract(CreateContractDTO $data) { }
readonly class CreateContractDTO
{
public function __construct(
public int $clientId,
public float $value,
public DateTime $date,
public string $status = 'pending',
public ?string $notes = null,
public ?string $category = null,
public string $paymentMethod = 'boleto',
public int $installments = 1,
) {}
}
```
### 6. Deep Nesting
```php
// ❌ SMELL: Aninhamento profundo
if ($user) {
if ($user->isActive()) {
if ($user->hasPermission('edit')) {
if ($contract->status === 'pending') {
if ($contract->value > 0) {
// lógica
}
}
}
}
}
// ✅ SOLUÇÃO: Early returns / Guard clauses
if (!$user || !$user->isActive()) {
return;
}
if (!$user->hasPermission('edit')) {
throw new UnauthorizedException();
}
if ($contract->status !== 'pending' || $contract->value <= 0) {
return;
}
// lógica
```
### 7. Duplicate Code
```php
// ❌ SMELL: Código duplicado em múltiplos lugares
// Em ContractController
$total = 0;
foreach ($contracts as $c) {
$total += $c->value;
}
// Em ReportService (mesmo código)
$total = 0;
foreach ($contracts as $c) {
$total += $c->value;
}
// ✅ SOLUÇÃO: Extrair para método reutilizável
// Em Contract (Collection macro ou método)
public static function calculateTotal(Collection $contracts): float
{
return $contracts->sum('value');
}
```
## Análise por Comando
```bash
# PHPStan - Análise estática
./vendor/bin/phpstan analyse src --level=8
# PHPMD - Mess Detector
./vendor/bin/phpmd src text cleancode,codesize,controversial,design,naming,unusedcode
# PHP_CodeSniffer - Padrões PSR
./vendor/bin/phpcs src --standard=PSR12
# PHPLOC - Métricas de tamanho
./vendor/bin/phploc src
# PHP Copy/Paste Detector
./vendor/bin/phpcpd src
```
## Checklist de Análise
```markdown
## Análise de Código - [PROJETO]
### Estrutura
- [ ] Classes seguem Single Responsibility
- [ ] Métodos têm ≤20 linhas em média
- [ ] Complexidade ciclomática ≤10
- [ ] Sem duplicação significativa
### Padrões
- [ ] PSR-4 autoload
- [ ] PSR-12 coding style
- [ ] Type hints em parâmetros e retornos
- [ ] Documentação PHPDoc onde necessário
### Acoplamento
- [ ] Dependency Injection utilizada
- [ ] Interfaces para abstrações
- [ ] Sem dependências circulares
- [ ] Sem uso de global/static desnecessário
### Smells Identificados
| Arquivo | Linha | Smell | Severidade |
|---------|-------|-------|------------|
| ... | ... | ... | ... |
```
## Output: Relatório de Qualidade
```markdown
# Relatório de Qualidade - [PROJETO]
## Métricas Gerais
- Linhas de código: 15,420
- Classes: 89
- Métodos: 456
- Complexidade média: 8.2
## Distribuição de Complexidade
- Baixa (≤10): 380 métodos (83%)
- Média (11-20): 62 métodos (14%)
- Alta (>20): 14 métodos (3%)
## Top 10 Métodos Críticos
| Método | Complexidade | Linhas | Arquivo |
|--------|--------------|--------|---------|
| ... | ... | ... | ... |
## Recomendações Priorizadas
1. [CRÍTICO] Refatorar UserController::process() - CC=35
2. [ALTO] Extrair lógica de OrderService
3. [MÉDIO] Adicionar types em legacy/
```