Funções módulos contratos e tratamento de erros
Nesta aula
Nomear uma transformação
Uma função agrupa instruções para realizar uma tarefa identificável. Parâmetros são os nomes que recebem as entradas; argumentos são os valores entregues na chamada. O retorno é o resultado que a função devolve. Separar esses elementos permite testar uma regra sem precisar abrir uma interface.
A tarefa selecionarTitulos recebe uma lista de casos e devolve os títulos dos ativos. Ela não grava um arquivo nem imprime cada item. Quem a chama decide como usar o resultado. Essa escolha reduz dependências: o mesmo cálculo pode ser usado em um terminal ou em uma página.
Código completo de uma função pequena
export function selecionarTitulos(casos) {
if (!Array.isArray(casos)) {
throw new TypeError('A entrada deve ser uma lista.');
}
const titulos = [];
for (const caso of casos) {
if (caso.ativo === true) titulos.push(caso.titulo);
}
return titulos;
}A primeira linha exporta a função, permitindo que outro módulo a importe. O nome casos entre parênteses é o parâmetro. Array.isArray verifica se a entrada é uma coleção do tipo esperado. O ponto de exclamação nega o resultado: se não for array, o bloco lança um erro. throw interrompe esse caminho e entrega uma informação de falha a quem chamou.
O bloco seguinte reaproveita a seleção já estudada e return devolve titulos. Um retorno não é a mesma operação que console.log: imprimir ajuda uma pessoa a observar, mas não devolve automaticamente um valor utilizável por outra função. O exemplo valida a forma externa da entrada; a validação completa de cada registro pertence a catalogo.mjs no projeto principal.
import { selecionarTitulos } from './04_funcoes.mjs';
const casos = [
{ titulo: 'Bicicletas', ativo: true },
{ titulo: 'Roupas', ativo: false }
];
console.log(selecionarTitulos(casos));O segundo trecho é o arquivo 04_executar.mjs. Execute node 04_executar.mjs na pasta dos laboratórios. O caminho ./04_funcoes.mjs parte da localização do módulo que importa; ./ indica o diretório atual nessa referência. O retorno contém apenas Bicicletas. Os dois arquivos precisam existir juntos.
Tratar falhas de forma explícita
Um erro pode ser capturado por try...catch quando há uma resposta útil a oferecer. Se uma interface recebe dados inválidos, uma resposta adequada é mostrar que o catálogo não pôde ser carregado e preservar informações para diagnóstico. Devolver uma lista vazia silenciosamente confundiria ausência de serviços com uma falha na fonte.
import { selecionarTitulos } from './04_funcoes.mjs';
try {
selecionarTitulos(null);
} catch (erro) {
console.log(erro.message);
}Salve esse trecho, se quiser executá-lo, como 04_erro.mjs ao lado dos outros módulos. A saída esperada é A entrada deve ser uma lista. Capturar não corrige a entrada: apenas permite controlar como a falha é comunicada. Se você não tiver uma recuperação apropriada, permita que o erro chegue à camada que pode tomar a decisão, mantendo contexto suficiente e evitando expor informação sensível.
O contrato do projeto principal
| Função de catalogo.mjs | Entrada | Saída ou falha |
|---|---|---|
| validarCasos | Array de objetos do contrato completo. | Aceita conjunto válido ou lança TypeError. |
| listarAtivos | Conjunto completo válido. | Nova lista de objetos públicos ativos. |
| obterCasoAtivo | Conjunto válido e identificador. | Objeto público correspondente ou null. |
Consulte a implementação entregue antes de mudar um contrato. Uma função pública não precisa revelar todos os campos da fonte. Usar somente id, titulo e descricao na saída torna a fronteira explícita. A reserva simulada, em outro módulo, possui um contrato diferente: recebe chave e casoId e devolve reservaId e casoId. Não misture esse estado de operação com o arquivo editorial do catálogo.
Exercício com solução e critério
Crie um conjunto vazio e outro com um ativo e dois inativos. Preveja o retorno de selecionarTitulos. Depois chame a função com um objeto simples em vez de uma lista.
Ver solução comentada
Solução: [] no primeiro caso, um título no segundo e TypeError no terceiro. A função não deve alterar os objetos fornecidos.
Explique uma vantagem de devolver o resultado em vez de imprimi-lo dentro da função. Uma resposta adequada mostra um consumidor concreto, como um teste que compara a lista recebida, e reconhece que a comunicação com a pessoa pode ocorrer em uma camada diferente. A conclusão exige executar as três situações e identificar qual contrato foi verificado.
Fontes relacionadas
Consulte os limites e as seções de apoio de cada referência.
S18 S19Tente o exercício antes de consultar a solução. Marque a aula para organizar sua leitura.
A conclusão desta leitura não equivale a certificação ou aceite de um projeto real. Teste os exemplos no escopo indicado e registre as limitações.