En mi sistema de inscripción de libros yo necesito del nombre y del precio:
public class Libro {
private final String nombre;
private final double precio;
public Libro(String nombre, double precio) {
this.nombre = nombre;
this.precio = precio;
}
//métodos
}
Para inscribir un libro yo necesito pasar las informaciones y enviar para el banco de datos:
Libro libro = new Libro("Java", 27.83);
Conexion conexion = hagaConexionConElBancoDeDatos();
conexion.registraLibro(libro);
conexion.cierraConexion();
Todas las veces que yo quiera inscribir un libro yo tendré que instanciarlo, tomar una conexión, guardar el libro y cerrar la conexión. Vamos a suponer que ahora nosotros necesitamos verificar si el libro ya existe en el banco, y en caso de que exista, necesitamos actualizar en vez de guardar:
Libro libro = new Libro("Java", 27.83);
Conexion conexion = hagaConexionConElBancoDeDatos();
if(!conexion.existeLibro(libro)){
conexion.registraLibro(libro);
} else{
conexion.actualizaLibro(libro);
}
conexion.cierraConexion();
Cuantos más procedimientos, necesitamos para poder guardar el libro, mayor quedará la rutina de guardar libros. Imaginate todas las clases que necesitan guardar un libro, tendrán que ser actualizadas todas las veces que hubiera un cambio! Es una pésima solución... ¿Que tal cambiar esos procedimientos de guardar el libro para un único método? Entonces, quedaría:
Libro libro = new Libro("Java", 27.83);
guardaLibro(libro);
public void guardaLibro(Libro libro){
Conexion conexion = hagaConexionConElBancoDeDatos();
if(!conexion.existeLibro(libro)){
conexion.registraLibro(libro);
} else{
conexion.actualizaLibro(libro);
}
conexion.cierraConexion();
}
Ahora no necesitamos saber sobre conexión o cualquier procedimiento para guardar un libro, apenas llamamos el método guardaLibro()
, enviamos el libro, y él hace todo por nosotros! cuando transformamos un procedimiento que presenta muchas reglas de negocio o rutinas complejas en un método, llamamos eso de encapsulamiento.¿Y si tuvieramos que hacer un backup de los libros cada vez que guardamos o actualizamos? Bastaría agregar ese trecho en un único lugar, o sea, en el método guardaLibro()
:
//continuo usando el guardaLibro() de la misma forma que guardaLibro(libro);
public void guardaLibro(Libro libro){
//rotina para guardar libro
conexion.hacerBackupDelLibro();
conexion.cierraConexion(); }
¡El código cambió y continuamos utilizando el método sin ninguna preocupación si él cambio o no! Además de eso, el código fue modificado en apenas un lugar, o sea, no necesitamos preocuparnos si va quebrar nuestro sistema en todos los otros lugares que usan ese método! Además de ser más elegante, nuestro sistema se convierte en mantenible.
Es siempre importante verificar en todos los puntos del código donde es posible aplicar el encapsulamiento, pues ganamos muchos beneficios:
¿Te gustó de encapsulamiento? ¿Estás listo para analizar tu código y verificar donde él puede ser aplicado? El encapsulamiento hace parte de una de las buenas prácticas de refatorización de código.
Encapsulamiento es un principio de deseño de código, generalmente relacionado a programación orientada, que nos orienta a esconder las funcionalidades y funcionamiento de nuestro código dentro de pequeñas unidades (normalmente métodos y funciones). eso posibilita que modificaciones en el sistema puedan ser hechas de manera más quirúrgicas, sin que una funcionalidad esté dispersa por diversas partes del sistema.
Básicamente siempre, pues la interface, la forma como clases y objetos conversan uno con el otro, debe siempre estar isolada de la forma como ejecutan lo que se propusieron hacer. Esa ejecución es la implementación del código. Como dice el libro Design patterns: programe volviendo a la interface, no a la implementación.
Es cuando la implementación dio una funcionalidad 'fuga' para diferentes partes del sistema, con código en regiones, unidades, módulos o paquetes muy diferentes. De esa forma, siempre que necesitamos modificar esa funcionalidad, necesitamos alterar diversas partes distantes del código. Un ejemplo es el uso exagerado de variables globales: ellas comienzan a generar códigos dispersos que acceden y modifican esas variables, un fuerte acoplamiento, que amarra puntas que deberían estar más sueltas.
Alex Felipe Victor Vieira
Alex es instructor y desarrollador y posee experiencia en Java, Kotlin, Android. Creador de más de 40 cursos, como Kotlin, Flutter, Android, persistencia de datos, comunicación con Web API, personalización de pantallas, pruebas automatizadas, arquitectura de Apps y Firebase. Es experto en Programación Orientada a Objetos, visando siempre en compartir las buenas prácticas y tendencias del mercado de desarrollo de software. Trabajó 2 años como editor de contenido en blog de la Alura y hoy todavía escribe artículos técnicos.
Puedes leer también:
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Puedes realizar el pago de tus planes en moneda local en los siguientes países:
País | |||||||
---|---|---|---|---|---|---|---|
Plan Semestral |
487.37
BOB |
69289.36
CLP |
307472.10
COP |
65.90
USD |
264.35
PEN |
1435.53
MXN |
2978.57
UYU |
Plan Anual |
738.82
BOB |
105038.04
CLP |
466107.17
COP |
99.90
USD |
400.74
PEN |
2176.17
MXN |
4515.32
UYU |
Acceso a todos
los cursos
Estudia las 24 horas,
dónde y cuándo quieras
Nuevos cursos
cada semana