¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Acoplamiento y cohesión en el diseño

Después de esta lección: Puedo juzgar un diseño por su acoplamiento y su cohesión.

Lección de 60 min6 comandosLaboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

Qué son el acoplamiento y la cohesión

El acoplamiento mide cuánto depende una parte de un sistema de las demás. La cohesión mide cuánto encajan entre sí las cosas que hay dentro de una misma parte.

Un buen diseño tiene poco acoplamiento y mucha cohesión. Así se puede cambiar una parte sin romper las otras, y eso es lo que más cuesta en un sistema que vive años.

Al terminar esta lección

Nota

Puedo juzgar un diseño por su acoplamiento y su cohesión.

Palabras clave

PalabraQué significaEjemplo
Módulouna parte del sistema con un trabajo propio
Dependenciacuando una parte necesita a otra para funcionar
Acoplamientocuántas dependencias tiene una parte
Cohesióncuánto encaja lo que hay dentro de un módulo
Interfazlo que un módulo enseña a los demásuna dirección web

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un módulo cohesivo hace un solo trabajo

Un módulo tiene cohesión alta si todo lo que contiene trabaja para un mismo fin. Un módulo "reservas" que guarda y comprueba reservas es cohesivo.

Si el mismo módulo también envía correos y da formato a fechas, tiene poca cohesión. Para cambiar el correo hay que tocar el módulo de las reservas, y eso da errores.

Ejemplo resuelto: cohesión alta y baja

MóduloLo que contieneCohesión
reservasCrear, cancelar y comprobar reservasAlta: un solo trabajo
salasDar de alta salas y leer sus plazasAlta: un solo trabajo
utilidadesReglas de reservas, correos, fechas y contraseñasBaja: cuatro trabajos mezclados

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El acoplamiento se cuenta con las flechas

Dibuja cada dependencia como una flecha de quien usa a quien es usado. El acoplamiento de un módulo es cuántas flechas salen de él y cuántas llegan.

Las flechas que salen dicen de cuántos módulos depende. Las que llegan dicen cuántos dependen de él. Dos módulos que se usan el uno al otro forman un ciclo, y es el enlace más difícil de cambiar.

Ejemplo resuelto: contar las flechas

MóduloSalenLleganQué dice
pantalla20Depende de dos y nadie depende de ella
reservas22Muy enlazado: cuatro enlaces en total
salas02No depende de nadie: es fácil de cambiar por dentro
avisos11Forma un ciclo con reservas

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que lo ideal es cero dependencias. Un sistema sin enlaces no hace nada, porque las partes no colaboran. Lo que se busca son pocos enlaces, claros, en una sola dirección y sin ciclos.

Un cliente acoplado se rompe cuando algo cambia

Un cliente de la API que pide student=eq.Lucia depende del nombre de la columna student. Si alguien cambia ese nombre, el cliente deja de funcionar.

Los comandos crean la tabla, hacen una petición que funciona, cambian el nombre de la columna y repiten la misma petición. Al final dejan todo como estaba. Primero da a psql la contraseña.

Dar a psql la contraseña

Comando
export PGPASSWORD=shop

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crear la tabla de reservas

Comando
psql -h db -U shop -c "drop table if exists bookings; create table bookings (id serial primary key, room text not null, student text not null, hour int not null check (hour between 8 and 20), status text not null default 'confirmed', unique (room, hour)); insert into bookings (room, student, hour) values ('A1', 'Lucia', 9), ('A1', 'Marcos', 10), ('B2', 'Irene', 9), ('B2', 'Pablo', 12); notify pgrst, 'reload schema'"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pedir las reservas de Lucia

Comando
curl -s -w "\n%{http_code}\n" "http://api:3000/bookings?student=eq.Lucia"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cambiar student por person

Comando
psql -h db -U shop -c "alter table bookings rename column student to person; notify pgrst, 'reload schema'"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Repetir la misma petición

Comando
curl -s -o /dev/null -w "%{http_code}\n" "http://api:3000/bookings?student=eq.Lucia"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Devolver el nombre original

Comando
psql -h db -U shop -c "alter table bookings rename column person to student; notify pgrst, 'reload schema'"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sobre este laboratorio y su código: Laboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.