Il riferimento sostanziale che ho trovato per "accoppiamento dati" è un po 'diverso dalla Wikipedia e dalle definizioni degli articoli.
Nel documento LDRA , l'accoppiamento dei dati è
The dependence of a software component on data not exclusively under the control of that software component.
Il loro esempio è:
For this demonstration of a Data Coupling defect consider two functions, CalculateAirspeed
and Display-Airspeed both of which are called from the same Main Program
(diagram above) and which share a global variable ‘speed’. Calculate-Airspeed
computes a value for the variable ‘speed’, i.e. a set operation, whilst the function
Display-Airspeed outputs the value of ‘speed’ to a display device, i.e. a use operation.
The Main Program may be of the form illustrated below.
int main(){
int speed, order;
loop:
get(order);
switch( order ){
case 1: calculate_airspeed(speed);
case 2: display_airspeed(speed);
}
goto loop;
}
Il documento dice che display_airspeed
è accoppiato a speed
perché è dichiarato e impostato indipendentemente da display_airspeed
. display_airspeed
si interromperà se l'ordine delle operazioni è passato sopra.
Non mi piace questa definizione perché penso che lo spirito del termine accoppiamento dati sia più ampio. Sì, display_airspeed
è dati accoppiati a speed
, ma questo è irrilevante per l'esecuzione e il flusso del programma. Il loro esempio è più indicativo di "Accoppiamento comune" in base alla voce di Wikipedia.
La voce di Wikipedia e l'articolo che hai letto prendono una più ampia definizione di accoppiamento dei dati. Wikipedia utilizza:
Data coupling occurs when modules share data through, for example, parameters. Each datum is an elementary piece, and these are the only data shared (e.g., passing an integer to a function that computes a square root).
What if the text was just a string and print passed text into output_to_screen without accessing any of its properties or calling any of its methods, like so: ... Would it still be data coupling?
Sì. print
è ancora accoppiato in due modi.
- L'esistenza del parametro
text
è di per sé un accoppiamento dati in base alla definizione, poiché la rimozione del parametro e la creazione di print
senza parametro o l'aggiunta di un parametro rappresenterebbero una modifica di rottura. Pertanto print
è dati accoppiati per passare un singolo parametro.
- Come dice @Alexe,
print
è accoppiato al tipo di text
. Anche in un linguaggio tipizzato in modo dinamico come il tuo esempio, se output_to_screen
si aspetta un Foo
da passare, e chiamo print
e lo passo a Bar
, si romperà print
(perché la stampa non è corretta chiamando output_to_screen
). Pertanto print
è data-coupled al tipo Foo
transitivamente a causa di output_to_screen
. Non sono sicuro che questo sia l'accoppiamento dei dati. Potrebbe effettivamente essere "accoppiamento esterno" al tipo di text
.
Rimuovendo la chiamata a to_s
, hai rimosso quello che credo sia "Accoppiamento di timbri (Accoppiamento strutturato per dati)" (dalla definizione di Wikipedia)
Stamp coupling occurs when modules share a composite data structure and use only parts of it, possibly different parts
In questo caso print
ha solo bisogno di una stringa, ma il parametro è di tipo diverso e print
accede al membro to_s
di text
per recuperare un valore stringa. Pertanto print
è coppia alla struttura di text
e la modifica o la non definizione di to_s
è un cambiamento di rottura.