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 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.
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.
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.