AULA 04 / 61 · ACESSO GRATUITO

Funções módulos contratos e tratamento de erros

Graciliano TolentinoEngenharia Caracol · Edição 2.0
Nesta aula
  1. Nomear uma transformação
  2. Código completo de uma função pequena
  3. Tratar falhas de forma explícita
  4. O contrato do projeto principal
  5. Exercício com solução e critério

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.

Dados entram no módulo catalogo, cuja função listarAtivos usa validarCasos. Dados válidos produzem saída pública; entrada inválida gera TypeError. A origem é preservada.Ampliar diagrama
A fronteira do módulo de catálogo. A validação pertence ao contrato do catálogo. O consumidor deve tratar a falha; a validação não demonstra que a interface e o servidor já estão integrados.

Código completo de uma função pequena

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

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

javascript
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.mjsEntradaSaída ou falha
validarCasosArray de objetos do contrato completo.Aceita conjunto válido ou lança TypeError.
listarAtivosConjunto completo válido.Nova lista de objetos públicos ativos.
obterCasoAtivoConjunto 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 S19
Conseguiu explicar o que aprendeu?

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