1. Introducción

Queremos dedicar la lección de hoy a la encapsulación . Ya sabes lo que es en términos generales.

Encapsulación

¿Cuáles son los beneficios de la encapsulación? Son bastantes, pero puedo destacar cuatro que, en mi opinión, son las principales:


2. Estado interno válido

En los programas, a menudo surgen situaciones cuando un objeto interactúa con varias otras clases. Estas interacciones con el objeto pueden dañar los datos dentro del objeto, haciendo imposible que el objeto continúe funcionando como se esperaba.

Como resultado, el objeto necesita realizar un seguimiento de cualquier cambio en sus datos internos o, mejor aún, realizar los cambios por sí mismo.

Si no queremos que otras clases cambien alguna variable, la declaramos privada. Una vez que hacemos eso, solo los métodos de su propia clase pueden acceder a él. Si queremos que las variables sean de solo lectura, entonces debemos agregar una public getterpara las variables relevantes.

Por ejemplo, supongamos que queremos que todos puedan saber el número de elementos de nuestra colección, pero no queremos que puedan cambiar la colección sin nuestro permiso. Luego declaramos una private int countvariable y un public getCount()método.

El uso adecuado de la encapsulación garantiza que ninguna clase pueda acceder directamente a los datos internos de nuestra clase, lo que evita cualquier cambio fuera de nuestro control. Estos cambios solo son posibles llamando a los métodos de la misma clase que las variables que se están modificando.

Es mejor asumir que otros programadores siempre usarán sus clases de la manera que sea más conveniente para ellos, no de la manera que sea más segura para usted (para su clase). Este comportamiento es la fuente tanto de los errores como de los intentos de prevenirlos.


3. Validando los argumentos del método

A veces necesitamos validar los argumentos pasados ​​a nuestros métodos. Por ejemplo, supongamos que tenemos una clase que representa a una persona y le permite establecer una fecha de nacimiento. Debemos verificar todos los datos de entrada para asegurarnos de que tengan sentido con la lógica del programa y la lógica de nuestra clase. Por ejemplo, para anular una fecha de nacimiento en el mes 13 o el 30 de febrero, etc.

¿Por qué alguien indicaría el 30 de febrero como fecha de nacimiento? Primero, esto podría ser un error del usuario al ingresar los datos. En segundo lugar, un programa puede tener muchos errores antes de que comience a funcionar como un reloj. Por ejemplo, la siguiente situación es posible.

Un programador escribe un programa que identifica a las personas cuyo cumpleaños es pasado mañana. Por ejemplo, digamos que hoy es 3 de marzo. El programa agrega el número 2 al día actual del mes y busca a todos los que nacieron el 5 de marzo. Parece que todo está correcto.

Pero cuando llega el 30 de marzo, el programa no encontrará a nadie, porque el calendario no tiene 32 de marzo. Un programa tiene muchos menos errores si comprobamos los datos pasados ​​a los métodos.

¿ Recuerdas cuando estudiamos ArrayListy analizamos su código? Vimos que los métodos gety setverificaban si indexes mayor o igual a cero y menor que la longitud de la matriz. Además, estos métodos lanzan una excepción si el índice cae fuera de los límites de la matriz. Este es un ejemplo clásico de validación de entrada.


4. Minimizar errores al cambiar código

Supongamos que escribimos una clase súper útil cuando estábamos involucrados en un proyecto grande. A todos les gustó tanto que otros programadores comenzaron a usarlo en cientos de lugares en su código.

La clase fue tan útil que decidiste darle algunas mejoras. Pero si elimina algún método de la clase, el código de docenas de personas dejará de compilarse. Tendrán que reescribir todo. Y cuantos más cambios haga, más errores creará. Romperás muchas asambleas y serás odiado.

Pero cuando cambiamos los métodos que se declaran como privados, sabemos que no hay ninguna otra clase en ninguna parte que pueda estar llamando a estos métodos. Podemos reescribirlos, cambiar la cantidad de parámetros y sus tipos, y cualquier código externo dependiente seguirá funcionando. Bueno, al menos compilará.


5. Decidimos cómo nuestro objeto interactúa con objetos externos

Podemos restringir algunas de las acciones que se pueden realizar con nuestro objeto. Por ejemplo, supongamos que queremos que un objeto sea instanciado solo una vez. Incluso si se puede crear en varios lugares del proyecto. Y podemos hacer esto gracias a la encapsulación.

Encapsulación 2

La encapsulación nos permite agregar restricciones adicionales , que pueden convertirse en ventajas adicionales . Por ejemplo, la Stringclase se implementa como un objeto inmutable . Un objeto de la Stringclase es inmutable desde el momento de su creación hasta el momento de su muerte. Todos los métodos de la Stringclase ( remove, substring, ...), devuelven una nueva cadena sin realizar ningún cambio en el objeto sobre el que se llaman.

La encapsulación es una cosa muy interesante.