Che cosa è esattamente l'accoppiamento dei dati? Quali sono i suoi lati negativi?

2

L'ho trovato in questo articolo :

You call a method and pass it a parameter that doesn’t affect its control flow.

This is still coupling, but we’re starting to reach the kind that isn’t so bad. Sometimes you need parameters! If you wanted to remove all coupling you wouldn’t be able to pass data between objects at all.

class ScreenPrinter
  # This method is coupled to its parameter, because a change to that argument
  # can cause breakage (if we undefined to_s, for example).
  def print(text)
    output_to_screen(text.to_s)
  end
end

Che cosa succede se text era solo una stringa e print ha passato text in output_to_screen senza accedendo a una delle sue proprietà o chiamando uno dei suoi metodi, in questo modo:

class ScreenPrinter
  def print(text)
    output_to_screen(text)
  end
end

Sarebbe ancora l'accoppiamento dei dati? Mi sembra che la risposta sia sì - non puoi prevedere cosa farà print senza sapere quali dati vengono passati ad esso.

L'accoppiamento dei dati in questo caso è una cosa brutta?

    
posta Adam Zerner 06.07.2017 - 01:33
fonte

1 risposta

1

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.

  1. 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.
  2. 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.

    
risposta data 06.07.2017 - 02:16
fonte

Leggi altre domande sui tag