Cómo mantener limpio su código con la encapsulación de objetos »Wiki Ùtil

La encapsulación significa mantener algo aislado. Si pones algo en una cápsula, el mundo exterior no puede acceder a él. La encapsulación es un concepto importante en la programación orientada a objetos porque ayuda a mantener manejable el código complejo.

Por qué necesitas clases

Digamos que tiene una aplicación de zoológico de mascotas con cientos de miles de líneas de código. Ahora imagina que hay un objeto muy importante que es fundamental para toda la aplicación, llamado animal . ¿Qué pasaría si cada parte del programa que fuera un animal pudiera acceder y cambiar ese objeto?

El acceso irrestricto causaría mucho caos. Si un lechón usa animal para definir sus parámetros, entonces el animal tendrá atributos de lechón . Ahora, digamos que una cabra decide usar animal para definir sus parámetros.

En JavaScript / TypeScript, se vería así:

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

Lo siguiente que sabes es que tienes cabras rosas y lechones con cuernos. Vea el código en acción en la zona de pruebas de TypeScript y luego haga clic en ejecutar para ver la salida de la consola.

Si está aprendiendo a programar y desea inspiración además de crear un zoológico de mascotas, aquí hay 10 proyectos más para inspirarlo .

Debido a que su base de código es tan grande, podría llevar cientos de horas encontrar el código que le da a sus corderos cuellos de llama y lana a sus patitos. Y una vez que encuentre el código ofensivo, tendrá que escribir aún más código espagueti para evitar que los objetos interfieran entre sí. Tiene que haber una mejor manera.

La forma de solucionar el problema de superposición es definiendo objetos con clases. Cualquier parte del código puede crear un objeto basado en la definición de la clase. La creación de un objeto único se denomina instanciación. Garantiza que cada objeto creado tendrá sus propias propiedades. Y esos objetos no podrán interferir entre sí accidentalmente.

Las clases no son suficientes; Las variables de su objeto también necesitan encapsulación

Por eso hemos decidido que cada animal necesita su propio objeto. Creemos una clase que defina a nuestros animales.

 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 continuación, creemos un par de objetos animales.

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

Juega con el código hasta ahora.

Ahora podemos agregar todos los animales que queramos sin mutaciones extrañas. ¿O podemos?

¿Qué pasaría si una noche, un programador cansado escribiera un código para editar un animal desde la aplicación espeluznante, pero editaran el conejito por error?

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

¡Los conejitos araña no son geniales, hombre! Eso es tan malo como cuando no encapsulamos nuestro código en objetos. Asegurémonos de que eso nunca vuelva a suceder.

Lo primero que debemos hacer es convertir nuestros objetos en privados . Eso significa que nada puede editar nuestras variables directamente después de crearlas. Aquí está el código que muestra que cambiar las variables privadas crea un error .

Sin embargo, las variables deben ser modificables. Y ahí es donde entran los getters y setters .

Los captadores y definidores son funciones que acceden y cambian variables de forma controlada. Los montadores pueden establecer limitaciones sobre los datos que se modifican. Y los captadores pueden alterar los datos que se recuperan.

Así es como se ve nuestra clase con las funciones get y set para controlar el recuento de tramos.

 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 la encapsulación y evite las variables globales

Aquí está el código final. Recapitule lo que ha aprendido para asegurar su comprensión:

  • Agregue captadores y definidores para el resto de las variables.
  • Devuelve el nombre del animal como una etiqueta span: <span> llama </span>
  • Cambie la variable de decoración para permitir múltiples decoraciones. Cree un captador y definidor apropiado para reflejar ese cambio.

Si desea mantener su código funcionando como una máquina bien engrasada, es absolutamente necesario utilizar la encapsulación. Evite las variables globales a toda costa. Y si necesita compartir variables entre objetos, puede ver la documentación de TypeScript sobre cómo crear variables de clase / estáticas para aprender a hacerlo.