Encapsulación (o sea, ocultar los atributos)

Encapsulación (o sea, ocultar tus atributos)

Hoy voy a continuar con esta nueva sección que creamos hace poco, en la que iré aclarando muchas dudas y conceptos relacionados con la programación y que muchos de vosotros me escribís para preguntarme sobre ellos y que os aclare algunas dudas (sobre todo los estudiantes. Un saludo para todos!!). Hoy vamos a aclarar uno de los conceptos más típicos y que suelen crear confusión cuando uno comienza en esto de la programación y el desarrollo de aplicaciones. Concretamente, hoy hablaremos del concepto de encapsulación.

Veamos qué es exactamente y qué nos aporta.

¡Comenzamos! : )

Qué es esto de la Encapsulación

Como ya vimos en el post en el que hablamos de la Programación Orientada a Objetos (POO), una clase está compuesta, por un lado, de métodos que determinan el comportamiento de los objetos de la clase y, por otro, de atributos que representan las características de los objetos de la clase. Si no sabes de qué te estoy hablando, te recomiendo que eches un vistazo a ese post porque en él encontrarás un breve vídeo en el que te lo explico de una forma muy gráfica y sencilla!

Normalmente, si no se indica lo contrario, el comportamiento por defecto al definir una clase suele ser que tanto los atributos como los métodos de la clase sean accesibles desde el exterior de la misma. Es decir, que desde cualquier parte de nuestro código, podremos crear un objeto, a partir de una clase, y acceder directamente a los métodos y atributos definidos en dicha clase.

Ejemplo del concepto de programación orientada a objetos (POO)

Esto no siempre será lo más conveniente para nosotros; y esa es precisamente la idea de la encapsulación dentro de la programación orientada a objetos: mantener los atributos de los objetos como privados y proporcionar acceso a los mismos únicamente a través de métodos públicos (métodos de acceso).

Esta “filosofía”, esta forma de hacer las cosas, proporciona grandes beneficios, como por ejemplo:

  • Protección de datos “sensibles”.
  • Facilidad y flexibilidad en el mantenimiento de las aplicaciones.

Protección de datos “sensibles”

Imaginemos que tenemos que crear una clase que representa una persona (por poner un ejemplo). Dicha clase podría proporcionar diversos métodos para realizar acciones en la vida de la persona (caminar, comer, dormir, celebrar su cumpleaños… yo que sé, cualquier cosa…). Además, dispondrá también de los atributos que la caracterizarían (como, por ejemplo, su nombre, su peso, altura, su edad, etc.).

Supongamos que desarrollamos la clase sin implementar el concepto de encapsulación; esto es, proporcionando acceso libremente a los atributos del objeto desde el exterior. Al hacerlo de esta manera, nada impediría al programador que va a hacer uso de nuestra clase Persona, acceder directamente al atributo edad (por ejemplo) y asignarle cualquier valor de forma directa. Imagínate, incluso podría quitarle años a la persona!! o incluso asignarle cualquier valor negativo, lo cual no tendría ningún sentido para el concepto de persona que estamos modelando en nuestro programa! (además de poder provocar algún tipo de resultado incoherente en la ejecución de nuestro programa…).

A este hecho se le conoce también como corrupción de los datos, y una forma muy sencilla de evitarlo sería haciendo uso del concepto de encapsulación que hemos visto, y proteger los atributos de la clase del acceso directo desde el exterior; forzando a que el acceso a dichos atributos se realice siempre de forma “controlada” a través de métodos de acceso.

En nuestro ejemplo concreto, podríamos establecer que para que un programador pudiera modificar la edad de un objeto persona, la única forma de hacerlo fuese llamando al método celebrarCumpleaños() (por ejemplo), y dentro de ese método estará definido el incremento en una unidad del valor asignado al atributo edad (de este modo nos aseguraremos de que los años se cumplan de uno en uno, y que nadie se quite años! 😉

Una aclaración sobre este concepto que estamos viendo de encapsulamiento (y así aprovecho para contestar a una duda directa de uno de los lectores), esto está muy relacionado con los conocimos como “métodos getter o setter. Me explico:

Dentro de este concepto que hemos explicado, dentro del mundo de la programación, se suele seguir el convenio de darle el nombre “setAtributo” para el método de acceso que permite la escritura del atributo (asignarle un valor o modificarlo), y “getAtributo” para el método de lectura que únicamente recupera el valor del atributo. De este modo, gracias al control que podremos establecer dentro del código que incluyamos en el método de acceso antes de almacenar un valor en el atributo (podremos hacer todo tipo de comprobaciones, etc.), se evitará que dicho atributo se corrompa y pueda llegar a recibir algún valor “raro”.

Facilidad en el mantenimiento de la Clase

Si una vez tengamos definida nuestra clase quisiéramos cambiar los criterios sobre los posibles valores que pudieran tomar los atributos, podríamos simplemente modificar el código de los métodos de acceso y distribuir la nueva versión la clase, sin que los programadores que la utilizan tengan que cambiar una sala línea de código en sus programas. ¡Fíjate la gran ventaja que esto supone de cara al mantenimiento de nuestro código!

Los detalles de la implementación quedan ocultos, manteniendo la “interfaz” (es decir, el formato y utilización del método no cambian), por lo que el código que hace uso de esta clase desde el exterior, no tendrá que modificarse.

Es algo así como:

“Lo que pasa dentro de la Clase, se queda dentro de la Clase”!

Conclusión

Espero que con lo que hemos compartido hoy en este post, te haya quedado ya completamente claro qué es el concepto de encapsulación (uno de los conceptos principales de la programación orientada a objetos) y que tengas perfectamente claro ahora para qué se utiliza y en qué ocasiones podrías sacarle provecho.

Así que nada, a partir de ahora ya sabes: a proteger tus atributos! 😉

Un saludo y te veo en próximas entregas.
Hasta entonces, muy buenos días!! : )

 

¿Te ha gustado el artículo? Entonces compártelo con alguien a quien también le pueda gustar!

Posts relacionados

Sin comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *