Gli effetti collaterali non sono concreti?

1

Nel capitolo 23 di "Object Oriented Software Construction" (1988), Betrand Meyer distingue tra effetti collaterali, effetti collaterali concreti ed effetti collaterali astratti.

Meyer definisce un effetto collaterale nella seguente citazione:

A change performed by a function is known as a side effect to indicate that it is ancillary to the function’s official purpose of answering a query."

E definisce un effetto collaterale concreto in una finestra di definizione come:

A function produces a concrete side effect if its body contains any of the following: an assignment, assignment attempt or creation instruction whose target is an attribute, or a procedure call.

Questa distinzione per me è difficile da capire, dal momento che non riesco a pensare ad un esempio di funzioni che producono effetti collaterali ma che non producono effetti collaterali concreti. Meyer non ce ne dà neanche uno.

Meyer avrebbe detto che effetto collaterale e effetto collaterale concreto sono sinonimi? Oppure esiste una classe di effetti collaterali che non sono effetti collaterali concreti?

(Nota, la risposta non è effetti collaterali astratti, poiché gli effetti collaterali astratti sono essi stessi concreti effetti collaterali.)

    
posta Ceasar Bautista 16.04.2015 - 08:13
fonte

2 risposte

7

Riscaldare il processore e perdere tempo con calcoli inutili è un effetto collaterale che viene generalmente ignorato, quindi potrebbe essere considerato non molto concreto. Non è concreto secondo la definizione citata di Meyer.

Questo è il motivo per cui i compilatori possono ottimizzare il codice inutile come

 /// spend some time busy waiting in a useless computation
 for (int i=1; i<10000000; i++) 
    (void) log(5.0*i);

in un blocco vuoto.

Sembra stupido, ma molte domande relative al benchmark sono sbagliate perché il compilatore ottimizza il codice ignorandolo -

BTW, al livello fisico più basso, ogni calcolo ha un effetto collaterale termico.

Quindi pensiamo sempre in termini di qualche macchina astratta , e noi ignoriamo sempre alcuni effetti collaterali non interessanti (e ci prendiamo cura di alcuni altro lato effetti, in particolare interessante input o output). A volte potresti anche considerare alcuni output di debug come un effetto collaterale ignorato. Alcune persone sono invece molto preoccupate per il consumo di energia (ad esempio per i dispositivi indossabili) e non astraggono tale effetto collaterale.

    
risposta data 16.04.2015 - 08:55
fonte
0

Dai commenti abbiamo discusso quanto segue: potrebbe essere un effetto collaterale che non è in realtà direttamente nella funzione chiamata, ma in una funzione chiamata da tale funzione? Quindi viene chiamata la funzione A. Chiama la funzione B e la funzione B ha un effetto collaterale concreto e la funzione A è quindi triste per avere un effetto collaterale, perché chiama la funzione B.

    
risposta data 17.04.2015 - 09:36
fonte