Modificadores de Atributos en Typescript (Como mantener secretos) - El Mundo de Angular

Modificadores de Atributos en Typescript (Como mantener secretos)

¿Sabías que a las clases  les encanta tener secretos?. A veces, esos secretos los comparten con las clases hijas, a veces no los comparten con nadie y, otras veces, los comparten con todo el mundo, entonces no son secretos. ¿Querés saber cómo guardan secretos las clases?, ¿querés saber cómo se comparten esos secretos entre una clase y otra sin que se entere el resto del mundo?. Entonces, ¡seguí leyendo!.

Existe un mecanismo en la programación orientada a objetos, en este caso usando Typescript, que permite hacer visibles o no, métodos y atributos de una clase. Este mecanismo se llama modificadores. Estos modificadores pueden modificar la visibilidad, tanto de un atributo, cómo de un método.

Modificadores: mecanismo por el cual se permite hacer visibles o no, atributos y métodos de una clase.

 

Existen cuatro tipos de modificadores dependiendo de qué tan visible querés que sea un atributo, estos modificadores son: public, private, protected y readonly

Modificador public

El modificador public es el que viene por defecto en Typescript; cuando no indicás ningún modificador, el lenguaje pone por defecto este modificador. Lo que hace, es hacer visibles para todo el mundo el atributo que lo precede:


class TodosSabenMisSecretos {
    secreto1='este atributo es público';
    public secreto2='este otro método también es público'
}

/* el mundo exterior */
let clasePublica = new TodosSabenMisSecretos();
console.log(clasePublica.secreto1); //OKA lectura
console.log(clasePublica.secreto2); //OKA lectura
clasePublica.secreto1 = ‘nuevo secreto’; //OKA escritura
clasePublica.secreto2 = ‘otro nuevo secreto; //OKA escritura

 

Secretos de la clase (modificador private)

 

El modificador private,  por otro lado, es lo opuesto a public. Este modificador restringe la visibilidad de los atributos de la clase sólo a esta clase. Dicho de otra manera, nadie más que la clase tiene acceso a estos atributos, tanto para leer como para modificarlos.


class SoloYoSeMisSecretos {
    private secretoSoloLectura='Mi secreto';
}

/* el mundo exterior */
let objetoConSecretos = new SoloYoSeMisSecretos();
console.log(objetoConSecretos.secretoSoloLectura); //ERROR LECTURA
objetoConSecretos.secretoSoloLectura = 'otro secreto' //ERROR ESCRITURA

Secretos entre clases (modificador protected)

 

¿Se puede saber si una clase puede heredar de otra y tener acceso a todos los atributos de ésta?. Es posible claro, si sus métodos y atributos son no son privados. Pero… ¿qué pasaría si quisieras que una clase “hija” tenga acceso a los atributos de la clase “padre”, pero estos métodos no tengan acceso a el “mundo exterior”?

 

Para eso existe el modificador protected, que es lo que hace exactamente. Protected hace visible atributos entre clases padre e hijas, pero los hace no-visibles al resto del mundo.


class ClasePadre {
    protected atributoProtected:string;
}

class ClaseHija extends ClasePadre {
    constructor() {
    super();
       this.atributoProtected='Este es un secreto entre ClasePadre'
    }
}

let hija = new ClaseHija();
console.log('cuál es el secreto?', hija.atributoProtected) //esto nos tira un error

Cómo ves, el código nos arroja un error ya que no podemos acceder al atributo atributoProtected, éste sólo es accesible entre las clases padre e hija.

 

 

Secretos de lectura (modificador readonly)

El modificador readonly, como su nombre lo indica, permite sólo la lectura de un atributo ya que, en caso de querer modificarlo el código arrojaría un error.


class SóloYoModificoMisSecretos {
    readonly secretoSoloLectura='este atributo es privado';
}

/* el mundo exterior */
let objetoSoloLectura = new SóloYoModificoMisSecretos();
console.log(objetoSoloLectura.secretoSoloLectura); //OK
objetoSoloLectura.secretoSoloLectura = 'otro secreto' //ERROR

¿Y qué pasa con los constructor abreviados?

¿Te acordás la forma de los constructores abreviados?:


class Persona {
    constructor(nuevoNombre:string, nuevoApellido:string) {
    }
}

Por defecto, si no se agregan modificadores en los atributos que se le pasan al constructor,  estos serán public. Si se quisiera declarar los atributos como protected, private o readonly, se podría hacer sin problemas de la siguiente forma:


class Persona {
    constructor(
       public nombre:string,
       readonly apellido:string,
       private direccion:string
    ) {    }
}

let nuevaPersona = new Persona('Gustavo', 'Dohara', 'Mi dirección');
console.log(nuevaPersona.nombre); // public
console.log(nuevaPersona.apellido) //read only
console.log(nuevaPersona.direccion) //ERROR esto es private

 

Conclusión

Restringir el acceso de los atributos de una clase es fundamental para la programación orientada a objetos.  Como cada clase es una caja cerrada, uno debe cuidar qué atributos puede o no modificar el que use esa clase. Permitir el acceso de todos los atributos de una clase, o permitir que cualquiera pueda modificar su estado (sus atributos), puede hacer que tu código se rompa. Así que mucho cuidado a quién le dejas las llaves de tu casa y el acceso a los atributos de tus clases.

About the Author

Mi nombre es Gustavo Hernán Dohara, soy Ingeniero en Sistemas y, sobre todas las cosas, soy un apasionado por la tecnología; tengo más de 10 años de experiencia en diferentes tecnologías y he decidido compartir mis conocimientos y experiencias con cualquiera que desee aprender: alumnos, empleados, freelancers y vos. Al ritmo que cada uno pueda, en el horario en que cada uno pueda y en el lugar que cada uno elija.