1
resposta

Porque não implementar o adicionaSenha dentro do construtor?

Se você tivesse implementado o adicionaSenha() dentro do construtor, poderia ter mantido a função valida() inteira.

Agora, do jeito que está, você tem uma função que valida algumas informações, enquanto outras são validadas dentro de outro método. Aliás, esse método precisa ser invocado por fora!

Tem algum ponto positivo que eu não estou vendo?

1 resposta

Oi, Eduardo!

Essa é uma ótima pergunta, pois isso realmente foi pensado de antemão na concepção do projeto mas acabei não frisando os motivos no curso.

Primeiro, como o próprio artigo da byte archer (em inglês) comenta muito bem, um construtor não é feito para fazer chamadas de funções. Por isso, quando tentamos realizar chamadas de funções assíncronas (como o bcrypt.hash()) a coisa se torna bem complicada. Já que o construtor só pode devolver o seu respectivo objeto inicializado, não conseguiríamos trabalhar com Promises da forma usual, ou seja, não podemos usar async e await.

Por isso, se quiséssemos implementar o conteúdo de adiciona senha no construtor, teríamos que fazer algo da forma

// [...]  
constructor(usuario) {
    // [...]
    this.senhaHash = usuario.senhaHash;
    // sobrescrevendo a senhaHash caso o construtor seja chamado com o atributo senha 
    if (!usuario.senha) {
        bcrypt.hash(usuario.senha, 12).then(
              senhaHash => { this.senhaHash = senhaHash }
        ) ;
   }
    this.valida(); // valida com as validações da senha
  }
// [...]

Mas isso não daria nenhuma garantia de que a promise teria finalizado após a criação do objeto. E essa garantia é muito importante porque, logo em seguida, precisamos adicionar as informações do objeto no banco de dados:

const usuario = new Usuario({
      // [...]
      });
 await  usuario.adiciona();

Ainda, não conseguríamos também recuperar possíveis erros do bcrypt.hash().

Além disso, uma função validacao() que também trata da senha só faria sentido durante a criação de um novo usuário, pois em qualquer outro momento não teríamos esse valor, apenas a senhaHash. Com isso, se ainda tentássemos manter essas duas lógicas numa mesma função, poderíamos acabar aumentando muito a complexidade do nosso código.

Dessa forma, a solução desses dois problemas foi criar o método adicionaSenha(). A semântica desse método é adicionar o atributo senhaHash em usuario a partir de uma senha, verificando antes se a senha está no padrão correto.

Como essa é uma situação muito particular do processo de criação do usuário, faz sentido a gente ter uma função separada que trata só disso, deixando o resto do código no mesmo padrão.

De qualquer forma, é sempre bom questionar a melhor forma de implementar os projetos do curso.

Se tiver mais alguma dúvida, é só falar!

Abraços.