Estruturas de Controle: Dominando o Fluxo do Seu Código
Estruturas de controle são o coração de qualquer programa. Elas permitem que seu código tome decisões, execute blocos específicos sob certas condições e evite repetição desnecessária de lógica. Nesta aula, exploraremos as quatro principais: if, else, switch e match. Começaremos com as mais tradicionais e evoluiremos para a mais moderna.
if e else: A Base da Tomada de Decisão
Conceito Fundamental
O if executa um bloco de código somente se uma condição for verdadeira. O else oferece uma alternativa quando a condição é falsa. Essa é a estrutura mais fundamental da programação.
idade = 18
if idade >= 18:
print("Você é maior de idade")
else:
print("Você é menor de idade")
let temperatura = 35;
if (temperatura > 30) {
console.log("Está quente");
} else if (temperatura > 20) {
console.log("Está agradável");
} else {
console.log("Está frio");
}
Boas Práticas
Sempre mantenha suas condições simples e legíveis. Use else if para múltiplas condições, mas quando tiver muitas branches, considere usar switch. Evite condições muito complexas — se necessário, extraia a lógica em funções separadas para melhorar a legibilidade.
int nota = 85;
if (nota >= 90) {
System.out.println("A");
} else if (nota >= 80) {
System.out.println("B");
} else if (nota >= 70) {
System.out.println("C");
} else {
System.out.println("F");
}
switch: Alternativa Elegante para Múltiplas Condições
Quando Usar switch
O switch é ideal quando você precisa comparar uma única variável contra múltiplos valores específicos. É mais legível que vários else if e geralmente mais eficiente. A grande diferença: switch usa igualdade exata, não condições lógicas complexas.
dia = 3
match dia:
case 1:
print("Segunda-feira")
case 2:
print("Terça-feira")
case 3:
print("Quarta-feira")
case _:
print("Outro dia")
let fruta = "maçã";
switch (fruta) {
case "maçã":
console.log("R$ 3,00");
break;
case "banana":
console.log("R$ 2,00");
break;
case "laranja":
console.log("R$ 2,50");
break;
default:
console.log("Fruta não encontrada");
}
Detalhe Crítico: break
Em linguagens como C, Java e JavaScript, sempre use break após cada caso. Sem ele, a execução "cai" para o próximo caso (fall-through). Isso é um erro comum que pode levar a bugs difíceis de encontrar. Python 3.10+ e Rust não têm esse problema.
int opcao = 2;
switch (opcao) {
case 1:
System.out.println("Opção 1");
break;
case 2:
System.out.println("Opção 2");
break;
default:
System.out.println("Opção inválida");
}
match: A Evolução Moderna
A Nova Geração
match é a versão moderna e mais segura de switch. Disponível em Python 3.10+, Rust, Scala e outras linguagens, match força você a lidar com todos os casos possíveis (exhaustividade), elimina o risco de fall-through e permite padrões muito mais complexos.
# Python 3.10+
status = "processando"
match status:
case "ativo":
print("Sistema rodando normalmente")
case "inativo":
print("Sistema desligado")
case "processando":
print("Aguarde...")
case _:
print("Status desconhecido")
Padrões Avançados
match vai além de igualdade simples. Você pode usar destructuring, guards (condições adicionais), e até padrões estruturais. Isso o torna muito mais poderoso que switch tradicional.
# Python com padrões avançados
ponto = (0, 5)
match ponto:
case (0, 0):
print("Origem")
case (0, y):
print(f"Eixo Y: {y}")
case (x, 0):
print(f"Eixo X: {x}")
case (x, y):
print(f"Ponto: ({x}, {y})")
// Rust - match com guards
let numero = 15;
match numero {
n if n < 0 => println!("Negativo"),
n if n == 0 => println!("Zero"),
n if n < 10 => println!("Dígito"),
_ => println!("Número maior"),
}
Escolhendo a Estrutura Correta
A escolha entre if, switch e match depende do seu caso:
if/else: Use para lógica condicional complexa com múltiplas condições diferentes. Exemplo:if (idade > 18 && ativo).switch: Use quando comparar uma variável contra vários valores específicos. Rápido de ler, mas limitado a igualdade.match: Use quando disponível. É type-safe, obriga tratar todos os casos e permite padrões sofisticados.
# Exemplo prático: classificar usuário
class Usuario:
def __init__(self, nome, tipo, ativo):
self.nome = nome
self.tipo = tipo
self.ativo = ativo
usuario = Usuario("João", "admin", True)
# if/else para lógica complexa
if usuario.ativo and usuario.tipo == "admin":
print("Acesso total concedido")
elif usuario.ativo and usuario.tipo == "user":
print("Acesso limitado")
else:
print("Acesso negado")
Conclusão
Dominar estruturas de controle é essencial para programar bem. Primeiro ponto: if e else são universais e fundamentais — domine-os perfeitamente. Segundo ponto: switch é uma alternativa elegante para comparações múltiplas contra um único valor. Terceiro ponto: match (quando disponível) é a evolução natural, oferecendo segurança de tipo e padrões poderosos. Na prática, você usará if na maioria das vezes, recorrerá a switch ocasionalmente, e apreciará match quando trabalhar em linguagens modernas. O importante é entender quando cada uma brilha e escolher com propósito.