Publicações | Codurance

Cognitive Complexity: por que duas funções com a mesma Ciclomática podem ter custos completamente diferentes

Written by Mauro Ribeiro | 05 mai 2026

Você já abriu um arquivo, viu uma função com complexidade ciclomática baixa e, mesmo assim, levou 40 minutos para entender o que ela fazia? Aconteceu porque a Ciclomática conta caminhos — mas não diz nada sobre o quanto seu cérebro precisa segurar enquanto navega por eles.

A Ciclomática conta caminhos. A Cognitive Complexity mede o que o seu cérebro paga para segui-los — e a diferença explica por que uma função com complexidade ciclomática 4 pode ser trivial e outra, com a mesmíssima 4, pode roubar 40 minutos da sua tarde.

TL;DR

Cognitive Complexity mede o esforço mental necessário para compreender um trecho de código. Diferentemente da Ciclomática, ela pune o aninhamento de forma cumulativa — porque o cérebro humano paga um preço exponencial para reter contexto em níveis profundos. Foi proposta pela SonarSource para preencher exatamente essa lacuna.

Para quem  Tech Leads que já usam Ciclomática Leitura  ~5 min Funil  Awareness

O que este artigo explora:

  • O paradoxo de duas funções com a mesma Ciclomática e custos cognitivos completamente diferentes
  • Como a Cognitive Complexity é calculada — passo a passo, com exemplo de código
  • Por que o aninhamento é punido cumulativamente (e o que isso tem a ver com memória de trabalho)
  • A propriedade de "familiaridade" no código de time — e o que ela destrava
  • Por que LLMs também sofrem com Cognitive Complexity alta
  • Como reduzir Cognitive via extração com nomeação semântica
  • Plano operacional em 4 passos para começar hoje
  • Ferramentas que medem Cognitive Complexity out-of-the-box
  • Cinco pontos-chave para levar embora
§ 1 O Paradoxo

O paradoxo

Considere os dois exemplos abaixo. Os dois têm exatamente a mesma Ciclomática (4). Mas qualquer dev sabe imediatamente qual dos dois é doloroso de ler:

Versão A · Linear Cognitive 3
// Ciclomática 4 — fácil de ler
function classify(order) {
  if (order.value > 1000) return 'PREMIUM';
  if (order.value > 100)  return 'STANDARD';
  if (order.items > 10)   return 'BULK';
  return 'BASIC';
}
Versão B · Aninhada Cognitive 10
// Ciclomática 4 — sofrimento
function classify(order) {
  if (order.user) {
    if (order.user.active) {
      if (order.value > 1000) {
        if (order.items > 10) {
          return 'PREMIUM_BULK';
        }
      }
    }
  }
  return 'BASIC';
}
§ 2 Cálculo

Mesmo número de caminhos. Custos cognitivos completamente diferentes. A Cognitive Complexity é a métrica que captura essa diferença.

Como a Cognitive Complexity é calculada

A SonarSource introduziu a métrica em 2018 para preencher uma lacuna que se tornou evidente após décadas de uso da métrica Ciclomática. A regra é simples no princípio: o aninhamento é punido de forma cumulativa.

  • Cada estrutura de controle (if, for, while, catch, etc.) → +1 base
  • Mais +1 por nível de aninhamento em que ela está
  • Operadores lógicos em sequência (&&, ||) somam +1 cada após o primeiro
  • else e else if somam +1 (são bifurcações adicionais)

Resultado: um if no nível raiz custa 1. O mesmo if aninhado no nível 4 custa 4. O peso explode com a profundidade — porque o leitor precisa reter o contexto de todos os níveis acima para entender por que aquela condição está ali.

JavaScript Cognitive Complexity = 10 (não 4)
// Cognitive Complexity = 10 (não 4)
function classify(order) {
  if (order.user) {                    // +1 (nível 1)
    if (order.user.active) {           // +2 (nível 2)
      if (order.value > 1000) {        // +3 (nível 3)
        if (order.items > 10) {        // +4 (nível 4)
          return 'PREMIUM_BULK';
        }
      }
    }
  }
  return 'BASIC';
}

Dez. Para uma função que faz, conceitualmente, uma classificação simples.

Fig. 1 — Peso cognitivo por nível de aninhamento
Ciclomática (linear) Cognitiva (cumulativa)
0 7 14 21 28 N1N2N3N4N5N6N7 PESO NÍVEL DE ANINHAMENTO
§ 3 Justificativa

Por que o aninhamento é punido tanto

A justificativa é cognitiva, não estética. Para entender uma instrução no quarto nível de aninhamento, o desenvolvedor precisa manter ativo na memória de trabalho:

  1. A condição do nível 1 (que precisa ser verdadeira pra chegar aqui)
  2. A condição do nível 2 (idem)
  3. A condição do nível 3 (idem)
  4. A instrução em si (no nível 4)

Pesquisa sobre memória de curto prazo aponta que humanos conseguem reter confortavelmente entre 4 e 7 itens simultaneamente. O aninhamento profundo preenche esse buffer rapidamente. Por isso, a métrica é cumulativa: reflete o custo real de processar o código, não a estrutura formal.

Implicação para LLMs

Cognitive Complexity alta não é só barreira para humanos. Também é uma barreira para a IA. Quando você pede ao Copilot ou ao Claude para "modificar esta função" e ela tem Cognitive 30, o modelo provavelmente vai gerar código que ignora algum nível de aninhamento — porque ele também tem dificuldade em reter o contexto completo.

Código que parece escrito por uma única pessoa

O objetivo de monitorar Cognitive Complexity não é zerar o número. É manter um teto que garanta familiaridade — a propriedade pela qual qualquer dev do time pode abrir qualquer arquivo do sistema e entender o fluxo sem precisar de um tour guiado.

Quando o time tem essa propriedade, várias coisas mudam:

  • O dev novo se onboarda mais rápido. Não precisa decifrar o estilo individual de cada autor.
  • O dev veterano não tem medo de mexer em áreas desconhecidas. O padrão é previsível.
  • Code review é sobre conteúdo, não sobre estilo. As discussões tornam-se mais técnicas, menos estéticas.
  • A IA generativa funciona melhor. LLMs geram código mais útil quando o contexto é navegável.

Não é só quebrar a função — é quebrar e dar nomes que removam a necessidade de processar o "como" no nível mais alto.

§ 4 Remediação

Como reduzir Cognitive Complexity

A técnica é extração com nomeação semântica. Não é só quebrar a função — é quebrar e dar nomes que removam a necessidade de processar o "como" no nível mais alto.

JavaScript · antes Cognitive 10
function classify(order) {
  if (order.user) {
    if (order.user.active) {
      if (order.value > 1000) {
        if (order.items > 10) {
          return 'PREMIUM_BULK';
        }
      }
    }
  }
  return 'BASIC';
}
JavaScript · depois Cognitive 3 (top-level)
function classify(order) {
  if (!isEligibleForPremium(order)) return 'BASIC';
  if (isBulkOrder(order))           return 'PREMIUM_BULK';
  return 'PREMIUM';
}

function isEligibleForPremium(order) {
  return order.user?.active && order.value > 1000;
}

function isBulkOrder(order) {
  return order.items > 10;
}

A função original ainda existe, distribuída em três funções. O leitor do classify agora entende a lógica em segundos — sem precisar processar o como de cada predicado.

§ 5 IA Generativa

O impacto da Cognitive Complexity no uso de IA

A IA generativa também tem um buffer de memória de trabalho limitado — só que, diferente do humano, ela não percebe quando o ultrapassa. Quando você pede ao Copilot ou Claude Code para "modificar esta função" e ela tem Cognitive 30, o modelo provavelmente vai gerar código que ignora algum nível de aninhamento, ou produzir alucinação (código que parece correto mas não funciona). Cognitive alta é a região em que os outputs do LLM mais frequentemente se quebram silenciosamente.

O que acontece em código com Cognitive alta + IA

  • A IA mantém ou piora o padrão. Em código com aninhamento profundo, ela tende a continuar aninhando — em vez de extrair predicados nomeados que reduziriam Cognitive.
  • Aumento de duplicação. Sem uma modularização clara, a IA não reconhece que uma lógica equivalente já existe em outro lugar. Gera nova versão. Cada prompt pode gerar uma nova cópia.
  • Maior chance de bugs introduzidos. O LLM perde contexto entre níveis de aninhamento — pelo mesmo motivo pelo qual os humanos também perdem. A diferença é que o humano, pelo menos, suspeita; o modelo entrega com confiança.
  • Testes automatizados também ficam complexos. A IA gera testes que herdam a estrutura aninhada da função. Resultado: testes longos, frágeis, com setup denso — difíceis de manter quando o código muda.
A boa notícia

Cognitive baixa, modularização clara e tipagem rigorosa fazem a IA trabalhar com você. Ela identifica funções existentes e reutiliza, gera código que respeita a estrutura e produz testes que cabem na cabeça. Métricas de qualidade tornam-se pré-condição para extrair valor da IA.

O que fazer agora
Plano operacional · 4 passos
  1. 1Adote Cognitive Complexity como o gate, não Ciclomática. Use Ciclomática para definir cobertura de testes; use Cognitive Complexity para definir quando refatorar.
  2. 2Threshold operacional sugerido: alerta em 15, bloqueio em 25 (valores comumente adotados pela indústria como ponto de partida).
  3. 3Use early returns e guard clauses. Eles "achatam" o aninhamento sem perder a lógica.
  4. 4Extraia predicados em funções nomeadas. O nome do método vira documentação executável.

Ferramentas que medem Cognitive Complexity

A métrica foi originalmente proposta por G. Campbell em 2018 e popularizada por linters como SonarQube/SonarLint (multi-language), cognitive-complexity-ts (TypeScript), Detekt (Kotlin), e a categoria como um todo em ferramentas modernas de análise estática. A plataforma SQA da Codurance integra essa medição com as outras quatro métricas da série em um diagnóstico unificado — útil quando você quer ver Cognitive em conjunto com Cyclomatic, Smells, Bugs e Duplication.

Resumo · Pontos-chave
Cinco frases para levar embora.
  • Cognitive Complexity mede esforço mental, não estrutura formal.
  • Pune aninhamento de forma cumulativa — nível 4 custa 4× mais que nível 1.
  • Mesma Ciclomática, Cognitive completamente diferente — depende de como o fluxo é organizado.
  • A cura é extração com nomes semânticos. Não é só quebrar — é quebrar e nomear.
  • IA também sofre. Cognitive alta é barreira para humanos e para LLMs.
Próximo passo na série
Em breve

Cyclomatic e Cognitive medem estrutura. Mas e os padrões de design ruim que não aparecem em nenhuma dessas métricas — métodos longos, duplicação de responsabilidade, classes que invadem outras? É aí que entram os Code Smells.

Code Smells
Próximo lançamento da série Code Quality.  Ver índice da série →

Como a Codurance pode ajudar?

A Codurance acompanha times de engenharia que querem instrumentar a saúde do código sem virar gestores. Ajudamos Tech Leads e Staff Engineers a integrar Cognitive Complexity em pipelines de CI/CD, definir thresholds operacionais sustentáveis e estabelecer rituais de refatoração que mantêm a propriedade de "familiaridade" no código ao longo do tempo.

Se você quer aplicar essas práticas no seu time, entre em contato hoje.