DROPS II - Valide primeiro, modifique depois
Veja uma dica como escrever um código mais simples de ler e que seja mais fácil testar.
[DISCLAIMER] Os códigos abaixos são para efeitos de ilustrações e tem algumas execuções desnecessárias, para que possa exemplificar um ponto.
Na ideia de continuar com artigos rápidos e com dicas simples observadas no dia a dia escrevendo código, achei que seria legal compartilhar essa forma que uso para escrever código, que me facilita criar testes unitários e na leitura do código.
Ao escrever uma função valide as entradas, embora em liguagens fortemente tipadas é meio desnecesário, o exemplo abaixo em Javascript ele é bem comum e será usado para exemplo. Imagine uma função que concatena uma data após receber um timestamp, então ela transforma o timestamp em uma data e depois retorna essa string contacatenada.
function GetStringBrazilianDate(timestamp) {
const date = new Date(timestamp);
const day = date.getDate();
const month = date.getMonth() + 1;
const year = date.getFullYear();
return `${day}/${month}/${year}`;
}
É bom lembrar que o ideal seria só fazer a transformação do new Date
se realmente receber um número. Lembrando novamente que Typescript isso é desnecessário e estou usando isso como exemplo e por isso não estou usando Typescript.
Então uma abordagem comum é criar um if
checando o tipo do timestamp
function GetStringBrazilianDate(timestamp) {
let day, month, year;
if (typeof timestamp === 'number') {
const date = new Date(timestamp);
if (date.getDate && date.getMonth && date.getFullYear) {
day = date.getDate();
month = date.getMonth() + 1;
year = date.getFullYear();
}
return `${day}/${month}/${year}`;
}
return 'Invalid Date';
}
Apesar do exemplo acima funcionar ele causa alguns problemas na leitura do código, em uma função pequena como essa quase não vemos o problema, mas se ela crescer ou precisar de um outro if
a leitura fica mais dificil leitura, fora a complicação em testar algo assim conforme cresce o projeto.
A abordagem de validar primeiro é usar o if
e logo dar a saída da função se algo errado acontece com os dados. Como no exemplo abaixo:
function GetStringBrazilianDate(timestamp) {
let day, month, year;
if (typeof timestamp !== 'number') {
return 'Invalid Date';
}
const date = new Date(timestamp);
if (!date.getDate && !date.getMonth && !date.getFullYear) {
return 'methods don\'t exists';
}
day = date.getDate();
month = date.getMonth() + 1;
year = date.getFullYear();
return `${day}/${month}/${year}`;
}
O código acima evita uma sequencia de identação, facilita a leitura e para a execução o mais rápido possivel em caso de erro ou de dados inválidos. Com isso evitamos execuções desnecessárias, facilitamos a leitura e teste unitários.
Qualquer dúvida só me chamar no twitter @flpms
[UPDATE] caso queria ativar essa regra no seu eslint, só olhar aqui https://github.com/eslint/eslint/blob/master/docs/rules/no-else-return.md