DROPS II - Valide primeiro, modifique depois

[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