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.