Gostaria de compartilhar com vocês uma técnica que aprendi a me acostumar ao longo dos anos, mas que conheci pelo livro do Robert C. Martin, o Clean Code. De forma bem sintetizada, o autor relata que uma boa prática é retornar exceções, ao invés de códigos de erro, pois isso evita a escrita de códigos de verificação, e mantém ele enxuto, mais confiável, sem aberturas para bugs relacionados à erros não previstos. Esse conteúdo você encontrará no capítulo 3 (página 46 - 47) e no capítulo 7 (página 103 - 112), do livro supracitado.
Aí como exemplo, desenvolvi um pequeno código Javascript que pode servir de referência para os demais, por ser simples de entender.
// ----------------------------- // Criei uma classe genérica que permite acesso ao objeto // Error, padrão do JS, e escrevo a stack trace nomeada // à partir de um Error genérico class GenericError extends Error { constructor(message) { super(message); this.name = this.constructor.name; Error.captureStackTrace(this, this.constructor); } } module.exports = { GenericError, }; // ----------------------------- // Aqui é feita a especialização do erro. // Nesse caso, será uma exceção para indicar CPF inválido const { GenericError } = require('./GenericError'); class InvalidCPFError extends GenericError { constructor(cpf) { super(`O CPF ${cpf} não é válido.`); this.data = { cpf }; } } module.exports = { InvalidCPFError, }; // ----------------------------- // Construí uma classe que utiliza o lançamento de exceção // especializada const { InvalidCPFError } = require('../errors/InvalidCPFError'); module.exports = function validarCPF(cpf) { cpf = cpf.replace(/[^\d]+/g, ''); if (cpf == '') throw new InvalidCPFError(cpf); // Vamos supor que daqui pra baixo tenham outras // regras de validação }; // ----------------------------- // Apenas na função que utiliza a função de validação // é inserido um try-catch, que já abstraído o tipo // retorna uma mensagem de erro padronizada // sem que Eu me precise me preocupar com sua implementação const validateCPF = require('../utils/validateCPF'); module.exports = { async store(request, response) { let { name, email, password, cpf, state, city } = request.body; try { validateCPF(cpf); // Vamos supor que daqui em diante, seja desenvolvido // o restante do código } catch (error) { return response.status(400).json({ error: error.message }); } }, }; --------------------------------------------------------
Vale ressaltar que essa foi a abordagem de extração do bloco try-catch que melhor atendeu neste contexto proposto, mas um caminho mais ideal é ter uma função que apenas tem um único objetivo: abstrair o tratamento da exceção.
Tenha em mente que sempre será necessário olhar pro contexto, e o ideal é sempre aquela abordagem que dará menos trabalho e efeitos colaterais se precisar ser alterada, ou substituída no futuro.
Comentários
Postar um comentário