# Acoblament (informàtica)

En informàtica, l'acoblament és la forma i nivell d'interdependència entre mòduls de programari; es una mesura del grau d'interconnexió entre dues rutines o mòduls de programari; així com el grau de força de la relació entre mòduls. Un exemple simple d'acoblament és quan un component accedeix directament a una dada que pertany a un altre component. En aquest cas, el resultat del comportament del component A dependrà del valor del component B, per tant, estan acoblats.
L'acoblament està comunament contrastat amb la cohesió. Un baix acoblament normalment es correlaciona amb una alta cohesió, i viceversa. El baix acoblament és freqüentment un senyal d'un sistema ben estructurat i d'un bon disseny de programari.

## Història

La mètrica de programari d'acoblament i cohesió va ser inventada per Larry Constantine a la fi de la dècada de 1960 com a part del disseny estructurat, basat en característiques de 'bones' pràctiques de programació que redueixen els costos de manteniment i modificació. El Disseny estructurat, incloent cohesió i acoblament, es va publicar en l'article Stevens, Myers i Constantine (1974) i en el llibre Yourdon & Constantine (1979), l'últim dels quals posteriorment es va tornar un estàndard.
L'acoblament pot ser "baix" (també "feble") o "alt" (també "fort").

## Baix acoblament

Un baix acoblament entre les unitats de programari és l'estat ideal que sempre s'intenta obtenir per aconseguir una bona programació o un bon disseny. Com menys interdepenents siguin les parts que constitueixen un sistema informàtic, millor serà el resultat. No obstant això, és impossible un desacoblament total de les unitats.
Per això, l'objectiu final del disseny de programari és reduir al màxim l'acoblament entre els diversos components. Per a això, el més important és saber eliminar l'acoblament que no sigui funcional o arquitectònic.
El cas de l'acoblament funcional, pot ser per exemple que un component de càlcul de probabilitats depengui d'un component de càlcul matemàtic bàsic, ja que per calcular probabilitats serà necessari aplicar fórmules matemàtiques.
El baix acoblament permet:
* Millorar la manutenció de les unitats de programari.
* Augmentar la reutilització de les unitats de programari.
* Evitar l'efecte ona, ja que un defecte en una unitat pot propagar-se a unes altres, fent fins i tot més difícil de detectar on està el problema.
* Minimitza el risc d'haver de canviar múltiples unitats de programari quan se n'ha d'alterar una.

## Tipus d'acoblament

Alguns tipus d'acoblament, de major a menor, són els següents:

### Programació estructurada

En programació estructurada, un mòdul fa referència a una subrutina de qualsevol tipus, és a dir, un conjunt d'una o més línies o seccions de codi que té un nom.

#### Acoblament de contingut (alt)

    L'acoblament de contingut (també conegut com a Acoblament patològic) succeeix quan un mòdul modifica o es recolza en el funcionament intern d'un altre mòdul (per exemple, accedint a dades locals d'un altre mòdul).
    Per tant, canviar la forma en què el segon mòdul produeix dades (ubicació, tipus, velocitat) conduirà a canviar el mòdul depenent.

#### Acoblament comú

    L'acoblament comú (també conegut com a Acoblament global) ocorre quan dos mòduls comparteixen les mateixes dades globals (per exemple, una variable global).
    Canviar el recurs compartit implica canviar tots els mòduls que facin us d'aquest recurs.

#### Acoblament extern

    L'acoblament extern succeeix quan dos mòduls comparteixen un format de dades imposat externament, protocol de comunicació, o interfície de dispositiu. Això està bàsicament relacionat amb la comunicació a eines externes i dispositius.

#### Acoblament de control

    L'acoblament de control es dona quan un mòdul controla el flux d'un altre, mitjançant el pas d'informació sobre el que ha de fer (per exemple, passant-li una bandera tipus what-to-do flag).

#### Acoblament segellat (Acoblament per estructura de dades)

    L'acoblament segellat (Stamp coupling en anglès) succeeix quan els mòduls comparteixen una estructura de dades composta i usen només una part d'ella, possiblement una part diferent (per exemple, passant un registre complet a una funció que només necessita un canvi d'aquest registre).
    Això podria portar a canviar la forma en la qual un mòdul llegeix un registre a causa que un camp que el mòdul no necessita ha estat modificat.

#### Acoblament de dades

    L'acoblament de dades succeeix quan els mòduls comparteixen dades entre ells, per exemple, paràmetres. Cada dada és una peça elemental i aquest paràmetre és l'única data compartida (per exemple, passant un enter a una funció que calcula una arrel quadrada).

#### Acoblament de missatges (baix)

    És el més baix tipus d'acoblament. Es pot aconseguir per la descentralització d'estats (com en els objectes) i la comunicació de components es realitza mitjançant paràmetres o pas de missatges.

#### Sense acoblament

    Mòduls que no es comuniquen per res entre ells.

### Programació orientada a objectes

En programació orientada a objectes tenim:

#### Acoblament de subclasses

    Descriu la relació entre una classe filla i la seva classe pare. La filla es connecta al seu pare, però el pare no es connecta al fill.

#### Acoblament temporal

    Quan dues accions s'agrupen en un mòdul només perquè succeeixen al mateix temps.
En un treball recent diversos altres conceptes d'acoblament s'han investigat i utilitzat com a indicadors per a diferents principis de modularització utilitzats en la pràctica.

## Desavantatges

Sistemes estretament acoblats tendeixen a presentar les següents característiques de desenvolupament, que sovint són vists com a desavantatges:
* Un canvi en un mòdul usualment força un efecte dominó de canvis en altres mòduls.
* L'ensamblatge de mòduls podria requerir més esforç i temps a causa de la interdependència entre mòduls.
* Un mòdul particular podria ser més difícil de reutilitzar o provar a causa que els mòduls dependents han d'incloure's.

## Problemes de rendiment

Ja sigui amb alt o baix acoblament, el rendiment d'un sistema veu afectat per la creació de missatges i paràmetres, transmissió, traducció (per exemple, el càlcul de referències) i la interpretació de missatges (que podria ser una referència a una cadena, matriu o estructura de dades), o fins i tot missatges més complexos com SOAP.

### Transmissió de missatges i rendiment

    Atès que un missatge ha de transmetre's complet per recuperar la seva informació completa, la transmissió de missatges s'ha d'optimitzar. Missatges més llargs requereixen més memòria per transmetre's i rebre's. També, quan és necessari, els receptors han de regenerar el missatge al seu estat original per completar la seva recepció. En aquest sentit, per optimitzar el rendiment en temps d'execució, la grandària del missatge s'ha de minimitzar, i la informació continguda s'ha de maximitzar.

### Traducció de missatges i rendiment

    Els protocols de missatges i els missatges mateixos moltes vegades contenen informació extra (per exemple, paquet, estructura, definició i informació del llenguatge). Per tant, el receptor moltes vegades necessita traduir un missatge en un altre més refinat removent caràcters extra i estructures d'informació i convertint valors d'un tipus a un altre. Qualsevol tipus de traducció incrementa l'ús de CPU i memòria. Per optimitzar el rendiment en temps d'execució, els missatges i els seus continguts s'han de reduir i refinar per maximitzar la informació continguda i reduir la traducció.

### Interpretació de missatges i rendiment

    El receptor ha d'interpretar tots els missatges. Missatges simples com enters podrien no requerir processament addicional per ser interpretats. No obstant això, missatges complexos com a missatges SOAP requereixen parseig i transformació de cadenes de caràcters per mostrar el seu significat intern. Per optimitzar el rendiment en temps d'execució, els missatges s'han de refinar i reduir per minimitzar la sobrecàrrega per interpretació.

## Solucions

Un enfocament per disminuir l'acoblament és el disseny funcional, el qual busca limitar les responsabilitats dels mòduls basant-se en la seva funcionalitat. L'acoblament s'incrementa entre dues classes A i B si:
* A té un atribut que refereix a (és del tipus) B.
* A crida a un servei d'un objecte B.
* A té un mètode que referencia a B (via tipus return o paràmetres).
* A és una subclasse de (o implementa) la classe B.
El baix acoblament es refereix a una relació en la qual un mòdul interactua amb un altre via una simple i estable interfície i no necessita conèixer la implementació interna de l'altre mòdul (veure encapsulament (informàtica)).
Sistemes com CORBA o COM permeten objectes que es comuniquen amb els altres sense haver de saber res sobre la implementació dels altres objectes. Aquests dos sistemes fins i tot permeten la comunicació entre objectes escrits en diferents llenguatges.

## Acoblament versus Cohesió

Acoblament i cohesió són termes que ocorren junts molt freqüentment. L'acoblament es refereix a la interdependència entre mòduls, mentre que la cohesió descriu com es relacionen les funcions dins d'un sol mòdul. Baixa cohesió implica que un mòdul donat executa tasques que no estan molt relacionades les unes amb les altres i, per tant, poden crear problemes com per exemple que el mòdul es torni molt gran.

## Vegeu també

* Cohesió (informàtica)
* Enginyeria de programari

## Referències

* ↑ ISO/IEC/IEEE 24765:2010 Systems and software engineering — Vocabulary
* ↑ ISO/IEC TR 19759:2005, Software Engineering — Guide to the Software Engineering Body of Knowledge (SWEBOK)
* ↑ F. Beck, S. Diehl. On the Congruence of Modularity and Code Coupling. In Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Foundations of Software Engineering (SIGSOFT/FSE '11), Szeged, Hungary, September 2011. doi:10.1145/2025113.2025162