Ícone do site dfilitto

Javascript – Private Methods

Javascript - Dicas

O post fala sobre a feature que permite emcapsular variáveis, constantes e funções nas classe implementadas por meio da linguagem Javascript.

Javascript – Private Methods

JS sempre foi uma linguagem orientada a objetos mas por sua implementação com base em protótipo ao invés de classes, apesar de termos a sintaxe especial de Class desde de a ES2015, por conflitos de decisões de implementação não tínhamos como fazer métodos ou campos privados nativamente.

Quando usamos classes em Javascript temos como padrão nomear elementos privados com um _na frente como meio de diferenciação.

Com a nova especificação colocar o sinal de #na frente da variável ou função já vai definir que o não se deve ter acesso a ele em outros contextos além da própria classe.

Apesar de parecer contra intuitivo, essa decisão se deve exatamente ao fato de que muitas bibliotecas já aderiram o sublinhado _ como meio de marcar campos privados, sendo um meio de evitar alterações já existentes.

Isso pode causar um estranhamento também pra quem vem do Typescript cuja sintaxe já amplamente conhecida para definir se algo é privado também é o _ .

Dessa forma podemos escrever classes similares a essa:

class Counter {
#x = 0; // Define uma variável privada
increment() {
this.#x++; // Incrementa a variável privada
}
decrement() {
this.#x--; // Decrementa a variável privada
}
getX(){
return this.#x;
}
}const c = new Counter();console.log(c.getX()); // 0 -> Valor é exposto pelo metodo getX

Tentar pegar o valor da variável privada diretamente não é viável pois ela não pode ser acessada fora do contexto da classe.

c.#x => 🙅‍♀Uncaught SyntaxError: Private field '#x'

Os métodos modificam o campo x e o resultado final retornado por por getX é o valor -1.

c.increment(); 
c.decrement();
c.decrement();
console.log(c.getX()); // -1 -> Valor é modificado e depois exposto

Supondo que no meu exemplo não quero que o contador chegue em valor abaixo de 0 e quero criar uma função auxiliar privada para fazer essa verificação.

class Counter {
#x = 0;
increment() {
this.#x++;
}
#isPositive() {
return this.#x > 0
}
decrement() {
if (this.#isPositive()) this.#x--;
// Chama o método privado para verificar se o valor x é positivo
}
getX(){
return this.#x;
}
}const c = new Counter();

Assim como a propriedade privada, não posso chamar o método novo fora do contexto da classe.

c.#isPositive() => 🙅‍♀Uncaught SyntaxError: Private method '#x'

Desta forma ao chamar a função decrement podemos ter a garantia que nosso valor não será negativo.

c.decrement();
console.log(c.getX()); // 0

Isso é de extrema importância pois até então tínhamos dificuldade de seguir os princípios de SOLID pois não tínhamos como suprir o Open/Closed principle.

Super dicas

Se inscreva em nosso canal e compartilhe as matérias que gostar com os seus colegas.

Participe dos nossos grupos de estudos do Facebook, WhatsApp desenvolvimento de sistemas e WhatsApp desenvolvimento de jogos.

Aproveite também e venha fazer parte do nosso clube de vantagens e ter acesso exclusivo a vídeos, tutoriais, cursos e muito mais.

Clique no link para se tornar um membro do dfilitto – clube de vantagens e ter acesso a todos os benefícios do nosso clube.

Fonte: Medium.com

Sair da versão mobile