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