Lógica antes de linguagem

Antes de escolher JavaScript, Python ou qualquer sintaxe, existe um passo universal: traduzir um problema em passos finitos e não ambíguos. Esse é o núcleo da lógica de programação. Linguagens são dialetos; lógica é gramática do pensamento computacional.

Considere um processo administrativo: “aprovar solicitação de reembolso”. No papel humano, há margem para interpretação. No software, cada condição precisa ser explicitada — inclusive o que acontece quando dados estão incompletos.

Pseudocódigo: rascunho sem amarras de sintaxe

FUNÇÃO aprovarReembolso(solicitacao):
  SE solicitacao.valor <= 0 ENTÃO
    RETORNAR erro "Valor inválido"
  FIM SE

  SE solicitacao.anexos está vazio ENTÃO
    RETORNAR erro "Comprovante obrigatório"
  FIM SE

  SE solicitacao.valor > limiteGerente ENTÃO
    RETORNAR status "PENDENTE_DIRETORIA"
  SENÃO
    RETORNAR status "APROVADO"
  FIM SE
FIM FUNÇÃO

Repare: tratamos entradas inválidas cedo (guard clauses). Definimos limiar de valor. Cada caminho retorna um estado claro. Só depois disso vale abrir o editor.

Diagrama PlantUML

Traduzindo para JavaScript

const LIMITE_GERENTE = 1500;

function aprovarReembolso(solicitacao) {
  if (solicitacao.valor <= 0) {
    return { ok: false, motivo: 'Valor inválido' };
  }

  if (!solicitacao.anexos || solicitacao.anexos.length === 0) {
    return { ok: false, motivo: 'Comprovante obrigatório' };
  }

  if (solicitacao.valor > LIMITE_GERENTE) {
    return { ok: true, status: 'PENDENTE_DIRETORIA' };
  }

  return { ok: true, status: 'APROVADO' };
}

Operadores lógicos: combinando condições

Regras de negócio raramente usam uma única comparação. Três operadores dominam:

  • && (E): todas as condições devem ser verdadeiras.
  • || (OU): ao menos uma verdadeira.
  • ! (NÃO): inverte booleano.
function elegivelFreteGratis(cliente, pedido) {
  const assinanteAtivo = cliente.plano === 'premium' && cliente.ativo === true;
  const pedidoAlto = pedido.total >= 300;
  const produtoFisico = pedido.itens.some(item => item.tipo === 'fisico');

  return produtoFisico && (assinanteAtivo || pedidoAlto);
}

Teste mentalmente cenários: assinante inativo com pedido baixo (false), pedido alto sem produto físico (false), assinante ativo com produto físico (true).

Tabelas verdade: quando a regra confunde

Para duas condições A e B:

ABA && BA || B
truetruetruetrue
truefalsefalsetrue
falsetruefalsetrue
falsefalsefalsefalse

Quando stakeholders discordam da regra, volte à tabela. Muitos bugs nascem de “E vs OU” mal especificado em reunião.

Decomposição: problema grande → partes testáveis

Exemplo: calcular folha de horas extras.

  1. Validar entrada (horas normais, horas extras, valor hora).
  2. Calcular pagamento base: horas normais × valor.
  3. Calcular extras com multiplicador (ex.: 1,5×).
  4. Somar e arredondar centavos.
  5. Retornar objeto com breakdown para auditoria.

Cada etapa vira função pequena. Funções pequenas são testáveis no console antes de integrar.

Erros clássicos de iniciantes (e como evitar)

  • Comparar com = em vez de ===: em JavaScript, use === para evitar coerção implícita.
  • Condições sobre dados que podem ser null: verifique existência antes de acessar propriedade.
  • Regra incompleta: “e se nenhum dos casos?” — sempre defina else ou retorno padrão.

Exercício guiado

Implemente classificarImc(imc) com faixas OMS (abaixo 18,5; normal até 25; sobrepeso até 30; obesidade acima). Valide: imc negativo retorna erro. Teste no mínimo cinco valores incluindo limites exatos (18.5, 25, 30).

Para aprofundar na web

Para entender melhor este tema, pesquise por:

  • "pseudocódigo programação exemplos" — praticar lógica sem sintaxe
  • "operadores lógicos AND OR NOT programação" — tabelas verdade e combinações
  • "fluxograma algoritmo como desenhar" — visualizar ramificações antes do código
  • "guard clauses programação" — retorno antecipado e menos aninhamento
  • "decomposição de problemas programação" — dividir tarefas grandes em funções

Desenhe fluxograma de um processo do seu trabalho antes de codificar — valida regra com você mesmo.

Atividades

  1. Qual é a principal vantagem do pseudocódigo antes do código?

    • A) Executar mais rápido no navegador
    • B) Separar regras de negócio de detalhes de sintaxe
    • C) Substituir testes automatizados
    • D) Evitar uso de funções
    Ver resposta

    Resposta correta: B) Separar regras de negócio de detalhes de sintaxe

    Pseudocódigo permite validar lógica com stakeholders e consigo mesmo antes de escolher construtos da linguagem.

  2. Em elegivelFreteGratis, por que produtoFisico entra na condição final?

    • A) Porque frete só faz sentido para itens físicos
    • B) Porque JavaScript exige
    • C) Porque assinantes nunca pagam frete digital
    • D) Porque arrays não suportam filter
    Ver resposta

    Resposta correta: A) Porque frete só faz sentido para itens físicos

    Produtos digitais não têm logística de envio; a regra de frete grátis aplica-se ao contexto físico.

  3. Guard clause significa:

    • A) Proteger servidor com firewall
    • B) Tratar casos inválidos no início e retornar cedo
    • C) Usar apenas switch
    • D) Evitar return em funções
    Ver resposta

    Resposta correta: B) Tratar casos inválidos no início e retornar cedo

    Guard clauses reduzem aninhamento tratando falhas e entradas inválidas antes do fluxo principal.

  4. Escreva pseudocódigo para decidir se um funcionário pode acessar o sistema fora do horário comercial (depende de perfil e autorização prévia).

    Ver resposta

    Exemplo: SE não autenticado RETORNAR negado. SE horário entre 8h-18h RETORNAR permitido. SE perfil admin RETORNAR permitido. SE possui autorizacaoExtra válida RETORNAR permitido. SENÃO RETORNAR negado.