programandoai

Dividir para conquistar: quebrando um problema grande

O coração do pensamento computacional não é escrever uma função só: é quebrar um problema grande em passos pequenos, cada um com sua própria função, e combiná-los.

Estudar esta lição interativa →

Um problema como "calcular o total de um pedido, com frete e desconto incluídos" parece pequeno, mas na verdade é feito de vários passos menores: calcular o subtotal, aplicar o frete, talvez aplicar um desconto. Tentar escrever tudo isso numa única função gigante deixa o código difícil de ler e, principalmente, difícil de corrigir quando algo dá errado. A alternativa, e um dos hábitos mais importantes de quem programa bem, é dividir para conquistar: quebrar o problema grande em passos pequenos, cada um com sua própria função, e combinar essas funções no final.

function calcularSubtotal(preco, quantidade) {
  return preco * quantidade;
}

function aplicarFrete(subtotal) {
  return subtotal + 15;
}

function totalPedido(preco, quantidade) {
  return aplicarFrete(calcularSubtotal(preco, quantidade));
}

console.log(totalPedido(20, 3));

Rode e observe as três funções trabalhando juntas.

Repare que totalPedido não faz a conta inteira sozinha: ela chama calcularSubtotal, pega o resultado, e passa esse resultado para aplicarFrete. Cada função tem uma única responsabilidade clara, e o nome dela já conta o que ela faz. Se um dia a regra do frete mudar, você só precisa mexer em aplicarFrete, sem tocar em nada mais.

Pense numa linha de montagem de fábrica: uma estação monta a estrutura, a próxima pinta, a próxima embala. Cada estação faz uma coisa só, muito bem, e passa o resultado adiante. Se a pintura sair com defeito, você sabe exatamente qual estação investigar, sem precisar desmontar a fábrica inteira. É essa mesma clareza que "dividir para conquistar" traz para o código.

Essa divisão também facilita achar bugs. Se o resultado final está errado, você pode testar cada função separadamente, chamando-a sozinha e conferindo o resultado, até encontrar exatamente qual passo está com problema, em vez de vasculhar um bloco de código enorme de uma vez só.

Uma função, uma responsabilidade

Uma boa regra prática: se você tem dificuldade de resumir o que uma função faz numa frase curta ("calcula o subtotal", "aplica o frete"), ela provavelmente está fazendo coisa demais e vale dividir em duas. Funções pequenas, com nome claro, são mais fáceis de testar, de reaproveitar e de corrigir.

A ordem de composição também importa

Assim como a ordem das instruções do Módulo 1, a ordem em que você combina as funções muda o resultado. Chamar aplicarFrete antes de calcularSubtotal, por exemplo, aplicaria o frete sobre o preço unitário, não sobre o total da compra, um erro lógico que não gera nenhuma mensagem, só um resultado errado. Sempre que combinar funções, vale conferir: essa é mesmo a ordem em que os passos deveriam acontecer no problema real?

function calcularSubtotal(preco, quantidade) {
  return preco * quantidade;
}

function aplicarFrete(subtotal) {
  return subtotal + 15;
}

function totalPedido(preco, quantidade) {
  return calcularSubtotal(aplicarFrete(preco), quantidade);
}

console.log(totalPedido(20, 3));

Corrija a ordem das chamadas dentro de totalPedido.

Escreva uma função calcularMedia(a, b, c) que recebe três notas e devolve a média das três, dividindo a soma por 3.
function calcularMedia(a, b, c) {
  // some as três notas e divida por 3
}

🧩 Este é um exercício com correção automática — abra no app para completá-lo e verificar.

← Voltar ao índice do curso