Non capisco la definizione di effetti collaterali [duplicato]

1

Non capisco l'articolo di wikipedia su Effetti collaterali :

In computer science, a function or expression is said to have a side effect if, in addition to returning a value, it also 1.) Modifies some state or 2.) Has an observable interaction with calling functions or the outside world.

Conosco un esempio della prima cosa che fa sì che una funzione o un'espressione abbiano effetti collaterali - modifica di uno stato

Funzione ed espressione modifica di uno stato :

1).

foo(int X)
{
return x = x % x;
}

a = a + 1;

Che cosa fa 2.) - Ha un'interazione osservabile con le funzioni di chiamata o il mondo esterno, "significa? - Per favore, fai un esempio.

L'articolo continua a dire, "Ad esempio, una funzione potrebbe modificare una variabile globale o statica, modifica uno dei suoi argomenti, genera un'eccezione, scrivi dati su un display o file, leggi dati o chiama altre funzioni di effetti collaterali ... "Sono tutti questi esempi, esempi di 1.) - Modifica di alcuni stati o sono anche parte di 2.) - Ha un'interazione osservabile con le funzioni di chiamata o il mondo esterno?

    
posta Chris Okyen 01.09.2012 - 21:49
fonte

2 risposte

10

Per prima cosa, il tuo esempio è sbagliato (a meno che x si riferisca a un campo e X non sia usato). foo(int x) { return x = x % x; } è in realtà un metodo puro, cioè non ha effetti collaterali. Ciò che avrebbe effetti collaterali è un metodo come:

private int x;

public void ComputeValue()
{
    this.x = this.x * 2 + 1; // Modifies a state of this.x
}

Per quanto riguarda il secondo punto, il mondo esterno può essere qualsiasi elemento con cui la tua app interagisce: file system , un database , display utente , stampante , porta USB , servizio web , impostazioni utente (come lo sfondo del desktop), ecc.

Alcuni esempi di metodi che interagiscono con il mondo esterno:

public void SayHello()
{
    Console.WriteLine("Hello World!");
}

interagisce con la console. In altre parole, SayHello ha un effetto collaterale per cambiare lo stato della console aggiungendo caratteri (e facoltativamente spostando il testo precedente in alto, rimuovendo la riga più vecchia dall'utente).

public void SaveHello()
{
    File.Save(this.fileName, "Hello World");
}

interagisce con il file system. In altre parole, SaveHello ha un effetto collaterale per alterare il contenuto di un file (o creare un file).

Pensa agli effetti collaterali come qualcosa che cambia qualcosa da qualche parte al di fuori del metodo stesso . Se un metodo aggiunge una riga a un database, lo stato del database cambia: si tratta di un effetto collaterale. Se un metodo registra un evento, lo stato del registro cambia.

La comprensione di questi effetti collaterali è cruciale quando si esegue il calcolo parallelo. Un metodo puro, ovvero un metodo senza effetti collaterali, può essere eseguito contemporaneamente da più core della CPU senza alcun problema. Un metodo che cambia lo stato di qualcosa deve essere usato con cautela. Spesso, i blocchi e le transazioni sono necessari per garantire che il programma venga eseguito come previsto.

    
risposta data 01.09.2012 - 21:55
fonte
0

Una funzione corretta non apporta modifiche all'ambiente. Riceve argomenti, calcola un valore e lo restituisce. Qualsiasi altra cosa è un effetto collaterale.

Tecnicamente, una funzione richiede un po 'di tempo per osservare il passaggio, e anche questo potrebbe essere chiamato un effetto collaterale, quindi nel mondo reale non esiste alcun "effetto collaterale".

    
risposta data 01.09.2012 - 22:40
fonte

Leggi altre domande sui tag