Como manter seu código limpo com encapsulamento de objetos.

Encapsulamento significa manter algo isolado. Se você colocar algo em uma cápsula, o mundo externo não poderá acessá-lo. O encapsulamento é um conceito importante na programação orientada a objetos porque ajuda a manter o código complexo gerenciável.

Por que você precisa de aulas

Digamos que você tenha um aplicativo de zoológico com centenas de milhares de linhas de código. Agora imagine que há um objeto altamente importante que é central para todo o aplicativo, chamado animal . E se cada parte do programa que era um animal pudesse acessar e alterar esse objeto?

O acesso irrestrito causaria muito caos. Se um leitão usa animal para definir seus parâmetros, então o animal terá atributos de leitão . Agora, digamos que uma cabra decida usar animal para definir seus parâmetros.

Em JavaScript / TypeScript, seria assim:

 var animal = {name: "piglet", legs: 4, color: "pink", decoration: "snout"}
animal.name = "goat"
animal.decoration = "horns"

A próxima coisa que você sabe é que você tem cabras cor de rosa e leitões com chifres. Veja o código em ação na caixa de proteção do TypeScript e clique em executar para visualizar a saída do console.

Se você está aprendendo a programar e quer inspiração além de criar um zoológico de animais domésticos, aqui estão mais 10 projetos para inspirá-lo .

Como sua base de código é tão grande, pode levar centenas de horas para encontrar o código que está dando aos seus cordeiros pescoços de lhama e lã de patinhos. E assim que encontrar o código ofensivo, você terá que escrever ainda mais código espaguete para evitar que os objetos interfiram uns com os outros. Deve haver uma maneira melhor.

A maneira de corrigir o problema de sobreposição é definir objetos com classes. Qualquer parte do código pode criar um objeto com base na definição da classe. A criação de um objeto único é chamada de instanciação. Ele garante que cada objeto criado terá suas próprias propriedades. E esses objetos não serão capazes de interferir um no outro acidentalmente.

As aulas não são suficientes; Suas variáveis ​​de objeto também precisam de encapsulamento

Portanto, decidimos que cada animal precisa de seu próprio objeto. Vamos criar uma classe que definirá nossos animais.

 class Animal {
name: string;
legs: number;
color: string;
decoration: string;
constructor(name: string, legs: number, color: string, decoration: string) {
this.name = name;
this.legs = legs;
this.color = color;
this.decoration = decoration;
}
}

A seguir, vamos criar alguns objetos animais.

 let babyDuck = new Animal("baby duck", 2, "yellow", "beak");
let bunny = new Animal("bunny", 4, "gray", "floppy ears");

Brinque com o código até agora.

Agora podemos adicionar todos os animais que quisermos sem nenhuma mutação estranha. Ou podemos?

O que aconteceria se uma noite, um programador cansado escrevesse algum código para editar um animal do app assustador, mas eles editassem o coelho por engano?

 bunny.color = "black";
bunny.legs = 8;

Coelhos aranha não são legais, cara! Isso é tão ruim quanto quando não encapsulamos nosso código em objetos. Vamos garantir que isso nunca aconteça novamente.

A primeira coisa que precisamos fazer é tornar nossos objetos privados . Isso significa que nada pode editar nossas variáveis ​​diretamente após criá-las. Aqui está o código que mostra que alterar variáveis ​​privadas cria um erro .

As variáveis ​​precisam ser alteráveis, no entanto. E é aí que entram os getters e setters .

Getters e setters são funções que acessam e alteram variáveis ​​de maneira controlada. Os configuradores podem definir limitações nos dados que são alterados. E os getters podem alterar os dados recuperados.

Essa é a aparência de nossa classe com as funções get e set para controlar a contagem de pernas.

 class Animal {
private _name: string;
private _legs: number;
private _color: string;
private _decoration: string;
constructor(name: string, legs: number, color: string, decoration: string) {
this._name = name;
this._legs = legs;
this._color = color;
this._decoration = decoration;
}
get legs() {
return this._legs;
}
set legs(legCount: number) {
if(legCount > 1 && legCount < 5) {
this._legs = legCount;
}
}
}

Aprenda o encapsulamento e evite variáveis ​​globais

Aqui está o código final. Recapitule o que você aprendeu para garantir sua compreensão:

  • Adicione getters e setters para o resto das variáveis.
  • Retorne o nome do animal como uma tag span: <span> lhama </span>
  • Altere a variável de decoração para permitir várias decorações. Crie um getter e setter apropriados para refletir essa mudança.

Se você deseja manter seu código funcionando como uma máquina bem lubrificada, é absolutamente necessário usar o encapsulamento. Evite variáveis ​​globais a todo custo. E se você precisa compartilhar variáveis ​​entre objetos, você pode ver a documentação do TypeScript sobre como criar variáveis ​​de classe / estáticas para aprender como.