¡Hola! Dediquemos la lección de hoy a la encapsulación y comencemos de inmediato con ejemplos :) Principios de encapsulación - 1Aquí tiene una máquina de refrescos ordinaria . Tengo una pregunta para ti: ¿cómo funciona? Trate de dar una respuesta detallada: ¿de dónde viene la taza, cómo se mantiene la temperatura interna, dónde se almacena el hielo, cómo sabe la máquina qué jarabe agregar, etc.? Probablemente no tengas respuestas a estas preguntas. Bastante justo, ya que no todos usan tales máquinas. No son tan populares hoy en día. Intentemos dar otro ejemplo. Algo que definitivamente usas muchas veces todos los días. ¡Aquí hay una idea! Principios de encapsulación - 2Cuéntanos cómo funciona el motor de búsqueda de Googleobras. ¿Cómo busca exactamente información relacionada con las palabras que ingresa? ¿Por qué ciertos resultados se clasifican alto y otros no? Aunque usas Google todos los días, lo más probable es que no lo sepas. Pero no importa No necesitas saber esto. Puede ingresar consultas en un motor de búsqueda sin pensar en cómo funciona. Puedes comprar refrescos de una máquina sin saber cómo funciona. Puedes conducir un automóvil sin entender cómo funciona un motor de combustión interna y sin saber nada de física, incluso al nivel de la escuela primaria. Todo esto es posible gracias a uno de los principios fundamentales de la programación orientada a objetos: la encapsulación.. Al leer varios artículos sobre programación orientada a objetos (OOP), debe haberse dado cuenta de que la programación involucra dos conceptos comunes: encapsulación y ocultación . Y los autores usan la palabra "encapsulación" para significar una cosa y luego otra. Exploraremos ambos términos para que obtenga una comprensión completa. En programación, el significado original de encapsulación es la agrupación de datos, junto con los métodos que operan en esos datos, en una sola unidad (es decir, una "cápsula"). En Java, la clase es la unidad de encapsulación. Una clase contiene datos (campos) y métodos para trabajar con estos datos.Principios de encapsulación - 3Este puede parecerle el enfoque obviamente correcto, pero en otros paradigmas de programación, todo está organizado de manera diferente. Por ejemplo, en la programación funcional, los datos están estrictamente separados de las operaciones sobre ellos. En OOP, los programas consisten en cápsulas, o clases, que consisten tanto en datos como en funciones para trabajar con esos datos. Ahora hablemos de esconderse . ¿Cómo es que usamos todo tipo de dispositivos complejos sin entender cómo están organizados o cómo funcionan? Es simple: sus creadores nos brindaron una interfaz simple y conveniente. En una máquina de refrescos, la interfaz son los botones del panel. Pulsando un botón, eliges la talla de copa. Presionando otro, eliges el sabor. Un tercero se encarga de añadir hielo. Y eso es todo lo que necesitas hacer. No importa la organización interna de la máquina. Lo que importa es que está diseñado de tal manera que requiere que el usuario presione tres botones para obtener un refresco . Lo mismo ocurre con los coches. No importa lo que esté pasando dentro. Lo que importa es que cuando pisas el pedal derecho, el coche avanza, y cuando pisas el pedal izquierdo, frena.. En eso consiste esconderse. Todo el "interior" de un programa está oculto para el usuario. Para el usuario, esta información superflua, innecesaria. El usuario necesita el resultado final, no el proceso interno. Veamos la Autoclase como ejemplo:
public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();

       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
Así es como se ve la ocultación de la implementación en un programa Java. Es como en la vida real: al usuario se le proporciona una interfaz (métodos). Si el usuario necesita un automóvil en un programa para realizar una acción, simplemente llama al método deseado. Lo que sucede dentro de estos métodos es superfluo. Lo que importa es que todo funcione como debe. Aquí estamos hablando de ocultar la implementación . Además de eso, Java también tiene ocultación de datos . Escribimos sobre eso en la lección sobre getters y setters , pero repasar el concepto no hará daño. Por ejemplo, tenemos una Catclase:
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
¿Quizás recuerdas el problema con esta clase de la última lección? Si no, recordémoslo ahora. El problema es que sus datos (campos) están abiertos para todos: otro programador puede crear fácilmente un gato sin nombre con un peso de 0 y una edad de -1000 años:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Tal vez pueda vigilar de cerca si uno de sus compañeros de trabajo ha creado objetos con un estado no válido, pero sería mucho mejor excluir incluso la posibilidad de crear tales "objetos no válidos". Principios de encapsulación - 4Los siguientes mecanismos nos ayudan a lograr la ocultación de datos:
  1. modificadores de acceso ( privado , protegido , predeterminado del paquete )
  2. captadores y setters
Por ejemplo, podemos marcar allí para ver si alguien está tratando de asignar un número negativo a la edad del gato. Como dijimos anteriormente, los autores de varios artículos sobre encapsulación a veces se refieren a combinar datos y métodos, u ocultarlos, o ambos (combinarlos y ocultarlos). Java tiene ambos mecanismos (esto no es necesariamente cierto para otros lenguajes OOP), por lo que el último significado es el más correcto. La encapsulación nos da varias ventajas importantes:
  1. Control sobre el estado correcto de un objeto. Había ejemplos de esto arriba. Un setter y el modificador privado aseguran que nuestro programa no tendrá gatos cuyo peso sea 0.

  2. Facilidad de uso a través de una interfaz. Solo los métodos quedan "expuestos" al mundo exterior. Llamar a los métodos es suficiente para obtener un resultado; no hay absolutamente ninguna necesidad de profundizar en los detalles de cómo funcionan.

  3. Los cambios de código no afectan a los usuarios. Realizamos todos y cada uno de los cambios dentro de los métodos. Esto no afecta al usuario del método: si el código correcto anteriormente era "auto.gas()" para aplicar el acelerador, entonces seguirá siéndolo. El hecho de que hayamos cambiado algo dentro del método gas() permanece invisible para el usuario: como antes, la persona que llama simplemente recibe el resultado deseado.