SkillsTecnológicas
Menu
Conteúdo da trilha

Estruturas condicionais encadeadas e aninhadas

Diferencie cadeias e decisões aninhadas, organize a ordem dos testes e simplifique fluxos sem alterar seus caminhos.

Conteúdo 24 de 39

Decisões desenhadas a lápis formam uma cadeia, enquanto um ramo conduz a outra decisão dentro de uma moldura

Encadear compara alternativas; aninhar cria dependência

Uma condicional encadeada organiza várias alternativas no mesmo nível. As condições são testadas em ordem e o primeiro ramo verdadeiro é executado.

SE prioridade = 3 ENTÃO
  fila <- "crítica"
SENÃO SE prioridade = 2 ENTÃO
  fila <- "alta"
SENÃO SE prioridade = 1 ENTÃO
  fila <- "normal"
SENÃO
  fila <- "revisão"
FIM SE

Uma condicional aninhada coloca uma decisão dentro do bloco de outra. A pergunta interna só é alcançada se o fluxo entrar no ramo que a contém.

SE contaAtiva ENTÃO
  SE possuiPermissao ENTÃO
    liberar operação
  SENÃO
    negar por falta de permissão
  FIM SE
SENÃO
  negar por conta inativa
FIM SE

Na cadeia, as perguntas competem para classificar um caso. No aninhamento, a segunda pergunta depende do contexto criado pela primeira. Essa distinção é mais importante que a aparência da sintaxe.

Dois fluxos comparam uma cadeia de três condições no mesmo nível e uma decisão interna que só é alcançada pelo ramo verdadeiro da decisão externa
A cadeia percorre alternativas em sequência; o aninhamento abre uma nova decisão dentro de um caminho específico.

Essas formas ampliam o if e else para problemas com mais caminhos, mas não são intercambiáveis em todas as situações.

Como funciona uma cadeia else if

Considere a classificação de um chamado:

SE sistemaIndisponivel ENTÃO
  prioridade <- "crítica"
SENÃO SE variosUsuariosAfetados ENTÃO
  prioridade <- "alta"
SENÃO SE existeAlternativaTemporaria ENTÃO
  prioridade <- "média"
SENÃO
  prioridade <- "normal"
FIM SE

A execução segue quatro regras:

  1. começa pela primeira condição;
  2. se ela for falsa, avalia a próxima;
  3. ao encontrar a primeira verdadeira, executa seu bloco;
  4. ignora todos os ramos restantes da cadeia.

O else final é opcional. Quando existe, cobre tudo o que não satisfez as condições anteriores. Aqui ele garante que prioridade receba um valor mesmo quando nenhuma situação especial ocorre.

Python usa elif; JavaScript e C# usam else if:

if sistema_indisponivel:
    prioridade = "crítica"
elif varios_usuarios_afetados:
    prioridade = "alta"
elif existe_alternativa_temporaria:
    prioridade = "média"
else:
    prioridade = "normal"
if (sistemaIndisponivel) {
  prioridade = "crítica";
} else if (variosUsuariosAfetados) {
  prioridade = "alta";
} else if (existeAlternativaTemporaria) {
  prioridade = "média";
} else {
  prioridade = "normal";
}

Apesar da diferença de palavras, as duas versões selecionam no máximo um bloco.

A ordem dos ramos faz parte da regra

Condições de uma cadeia podem se sobrepor. Ao classificar uma nota, nota >= 90 também satisfaz nota >= 70. Por isso, a ordem define qual resultado prevalece:

SE nota >= 90 ENTÃO
  conceito <- "A"
SENÃO SE nota >= 70 ENTÃO
  conceito <- "B"
SENÃO
  conceito <- "C"
FIM SE

Com nota = 95, o primeiro ramo vence. Se nota >= 70 vier primeiro, o ramo A nunca será alcançado, porque todas as notas de 90 ou mais já serão capturadas pelo teste mais geral.

Notas 95, 82 e 60 percorrem uma cadeia ordenada; cada uma para na primeira condição verdadeira e recebe respectivamente os conceitos A, B e C
Em uma cadeia, os testes anteriores retiram casos do conjunto que chega aos testes seguintes.

Organize faixas sobrepostas do caso mais específico ou restritivo para o mais geral. Outra opção é escrever intervalos sem sobreposição:

SE nota >= 90 ENTÃO
  conceito <- "A"
SENÃO SE nota >= 70 E nota < 90 ENTÃO
  conceito <- "B"
SENÃO
  conceito <- "C"
FIM SE

A condição adicional documenta a faixa, mas é redundante durante a execução: chegar ao segundo teste já significa que nota >= 90 foi falso. Escolha a forma mais clara para o público e registre os limites com testes.

Cadeia não é o mesmo que vários if independentes

Compare a cadeia:

SE clienteVip ENTÃO
  adicionar brinde vip
SENÃO SE primeiraCompra ENTÃO
  adicionar brinde de boas-vindas
FIM SE

com duas decisões independentes:

SE clienteVip ENTÃO
  adicionar brinde vip
FIM SE

SE primeiraCompra ENTÃO
  adicionar brinde de boas-vindas
FIM SE

Se a pessoa for VIP e também estiver na primeira compra, a cadeia adiciona somente o primeiro brinde. As decisões independentes adicionam os dois.

Pergunte se os resultados são exclusivos ou cumulativos:

  • use uma cadeia quando apenas uma classificação ou ação deve vencer;
  • use decisões independentes quando mais de uma ação pode ocorrer no mesmo caso.

Não transforme automaticamente todo conjunto de if em else if. Isso pode remover comportamentos que deveriam coexistir.

Como funciona uma condicional aninhada

No controle de uma operação, verificar permissão só faz sentido depois de confirmar que a conta está ativa:

SE contaAtiva ENTÃO
  SE possuiPermissao ENTÃO
    liberar operação
  SENÃO
    negar por falta de permissão
  FIM SE
SENÃO
  negar por conta inativa
FIM SE

Existem dois níveis:

  • a decisão externa divide contas ativas e inativas;
  • a decisão interna divide contas ativas com e sem permissão.

Quando contaAtiva é falsa, possuiPermissao nem é consultada. A decisão interna pertence somente ao contexto “conta ativa”. Esse é um uso legítimo do aninhamento: a pergunta seguinte depende semanticamente do ramo anterior.

Cada nível aumenta a quantidade de caminhos. Nesse exemplo existem três resultados alcançáveis:

Conta ativaPossui permissãoCaminhoResultado
nãonão importaelse externonegar por conta inativa
simnãoif externo → else internonegar por falta de permissão
simsimif externo → if internoliberar operação

“Não importa” significa que o valor não é avaliado nesse caminho. Um teste manual deve registrar também quais perguntas foram alcançadas.

Qual if pertence a cada else?

Em linguagens que permitem omitir chaves, esta escrita é perigosa:

SE contaAtiva
  SE possuiPermissao
    liberar operação
  SENÃO
    negar operação

O recuo visual pode sugerir uma relação, mas linguagens como Java, C e C# associam o else ao if compatível mais próximo quando não há delimitadores que indiquem outra estrutura. Esse comportamento é conhecido como problema do else pendente (dangling else).

Use blocos explícitos:

if (contaAtiva) {
  if (possuiPermissao) {
    liberarOperacao();
  } else {
    negarPorFaltaDePermissao();
  }
} else {
  negarPorContaInativa();
}

As chaves definem o pertencimento em JavaScript, C# e Java. Em Python, a indentação faz parte da sintaxe e determina os blocos. Em qualquer linguagem, formatação consistente ajuda pessoas a enxergarem a mesma árvore que a linguagem executa.

Quando combinar condições e quando manter níveis

Este aninhamento:

SE contaAtiva ENTÃO
  SE possuiPermissao ENTÃO
    liberar operação
  FIM SE
FIM SE

pode ser combinado sem alterar o único bloco executado:

SE contaAtiva E possuiPermissao ENTÃO
  liberar operação
FIM SE

A condição composta reduz um nível quando as duas perguntas apenas controlam a mesma ação e não precisam de respostas diferentes.

Não combine quando cada falha exige tratamento próprio:

SE contaAtiva E possuiPermissao ENTÃO
  liberar operação
SENÃO
  negar operação
FIM SE

Essa versão perde a distinção entre conta inativa e falta de permissão. O aninhamento anterior preserva mensagens e ações específicas.

O critério não é “menos linhas”. Pergunte se os ramos representam resultados diferentes e se a segunda pergunta só é válida dentro do primeiro contexto.

Reduza profundidade sem esconder a regra

Muitos níveis tornam difícil saber quais condições estão ativas. Considere:

SE entradaPresente ENTÃO
  SE formatoValido ENTÃO
    SE usuarioAutorizado ENTÃO
      processar solicitação
    SENÃO
      informar falta de autorização
    FIM SE
  SENÃO
    informar formato inválido
  FIM SE
SENÃO
  informar entrada ausente
FIM SE

Uma forma de simplificar é tratar impedimentos antes e manter o caminho principal linear:

SE NÃO entradaPresente ENTÃO
  informar entrada ausente
  encerrar solicitação
FIM SE

SE NÃO formatoValido ENTÃO
  informar formato inválido
  encerrar solicitação
FIM SE

SE NÃO usuarioAutorizado ENTÃO
  informar falta de autorização
  encerrar solicitação
FIM SE

processar solicitação
Um fluxo profundo com três decisões dentro umas das outras é transformado em três verificações antecipadas de impedimentos e um caminho principal linear
Tratar exceções antes pode deixar o caminho principal visível, desde que encerrar realmente interrompa o fluxo.

Essa transformação só é equivalente se encerrar solicitação impedir a continuação. Em uma linguagem real, isso pode ser um return, uma exceção adequada ou outra estrutura definida pelo contexto. Sem interrupção, o processamento ainda seria alcançado.

Outras formas de reduzir complexidade são:

  • nomear resultados intermediários;
  • combinar condições que controlam exatamente o mesmo bloco;
  • eliminar testes repetidos já garantidos por um ramo anterior;
  • separar classificação de execução quando a mesma decisão aparece várias vezes;
  • representar o fluxo antes de codificar com um fluxograma.

Não aplique essas transformações mecanicamente. Compare os caminhos antes e depois para confirmar que mensagens, alterações de estado e interrupções continuam equivalentes.

Teste caminhos, ordem e alcançabilidade

Para a cadeia de prioridade, cubra pelo menos:

Sistema indisponívelVários afetadosAlternativa temporáriaResultado esperado
simsimsimcrítica
nãosimsimalta
nãonãosimmédia
nãonãonãonormal

O primeiro caso confirma que o primeiro ramo prevalece mesmo quando condições posteriores também seriam verdadeiras. Os demais fazem cada resultado vencer uma vez.

Para o aninhamento, teste cada folha da árvore, não todas as combinações brutas. Se a conta está inativa, variar possuiPermissao não cria outro caminho, pois a pergunta interna não é alcançada.

Ao revisar, responda:

  • cada resultado necessário possui um caminho?
  • algum ramo geral torna outro inalcançável?
  • alternativas exclusivas estão em uma cadeia?
  • ações cumulativas permanecem em decisões independentes?
  • cada else está associado ao if pretendido?
  • todas as folhas relevantes foram exercitadas?

Erros comuns

Colocar a condição geral antes da específica

Uma faixa ampla captura casos que deveriam chegar a um ramo mais específico. Teste sobreposição e ordem.

Confundir cadeia com decisões independentes

Adicionar else transforma ações possivelmente cumulativas em alternativas exclusivas.

Aninhar perguntas que controlam a mesma ação

Quando não há tratamentos intermediários, uma condição composta pode comunicar melhor a regra.

Combinar condições que precisam de respostas diferentes

Uma expressão única pode esconder qual requisito falhou e eliminar mensagens específicas.

Confiar apenas na indentação em linguagens com chaves

O recuo não substitui delimitadores sintáticos. Use blocos explícitos para evitar else ambíguo.

Simplificar sem preservar a interrupção

Uma verificação antecipada que não encerra o fluxo pode permitir a execução do caminho principal mesmo após uma falha.

Pratique com faixas e dependências

Uma entrega recebe a classificação:

  • “bloqueada” quando o endereço é inválido;
  • “expressa” quando o endereço é válido e o prazo é de até dois dias;
  • “padrão” quando o endereço é válido e o prazo é maior que dois dias.

Primeiro represente a regra com uma decisão externa sobre enderecoValido e uma decisão interna sobre prazoDias <= 2. Depois reescreva como cadeia e compare os caminhos.

Teste:

  • endereço inválido com prazo 1;
  • endereço válido com prazo 2;
  • endereço válido com prazo 3.

Explique por que o prazo não deve influenciar o primeiro caso e confirme que o limite 2 pertence à entrega expressa.

O que você deve guardar

Uma cadeia organiza alternativas exclusivas no mesmo nível e executa o primeiro ramo verdadeiro. O aninhamento coloca uma decisão dentro de um ramo porque a pergunta seguinte depende daquele contexto. Vários if independentes, por sua vez, permitem que mais de uma ação execute.

Escolha a estrutura pela relação entre resultados, não apenas pelo formato mais curto. Ordene cadeias conscientemente, delimite blocos, preserve tratamentos específicos e teste cada folha alcançável. Em seguida, veja quando a seleção múltipla com switch ou case torna mais clara uma escolha baseada em casos discretos.

Referências