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.