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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Módulo | una parte del sistema con un trabajo propio | |
| Dependencia | cuando una parte necesita a otra para funcionar | |
| Acoplamiento | cuántas dependencias tiene una parte | |
| Cohesión | cuánto encaja lo que hay dentro de un módulo | |
| Interfaz | lo que un módulo enseña a los demás | una 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ódulo | Lo que contiene | Cohesión |
|---|---|---|
| reservas | Crear, cancelar y comprobar reservas | Alta: un solo trabajo |
| salas | Dar de alta salas y leer sus plazas | Alta: un solo trabajo |
| utilidades | Reglas de reservas, correos, fechas y contraseñas | Baja: 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ódulo | Salen | Llegan | Qué dice |
|---|---|---|---|
| pantalla | 2 | 0 | Depende de dos y nadie depende de ella |
| reservas | 2 | 2 | Muy enlazado: cuatro enlaces en total |
| salas | 0 | 2 | No depende de nadie: es fácil de cambiar por dentro |
| avisos | 1 | 1 | Forma 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
export PGPASSWORD=shopSe 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
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
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
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
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
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.