Skutek uboczny (informatyka)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Skutek uboczny lub efekt uboczny — w programowaniu dowolny efekt wyrażenia, lub wywołania funkcji, który wykracza poza zwrócenie wartości, np. interakcja z systemem operacyjnym, lub zmiana wartości zmiennej globalnej. Pomimo nazwy wiele funkcji jest wywoływanych właśnie dla uzyskania skutku ubocznego.

Np. wyrażenie 2 + 3 nie ma skutków ubocznych, wyrażenie a = 2 + 3 ma oczywisty skutek uboczny na zmiennej a. Innym przykładem skutku ubocznego jest poniższa funkcja w perlu:

sub add() {
    my $val = 0;
    $count++;
    $val += $_ foreach (@_);
    return $val;
}

Jej zasadniczym celem jest zwrócenie sumy wartości podanych argumentów, ale jako efekt uboczny zwiększa wartość pewnej zmiennej globalnej $count.

Z formalnego punktu widzenia większość funkcji systemowych powoduje efekty uboczne (w postaci komunikacji z systemem operacyjnym), np. funkcje z rodziny printf() w jezyku C zwracają liczbę wypisanych znaków, a samo wypisanie tych znaków jest właśnie efektem ubocznym.

W językach niskopoziomowych jest dużo skutków ubocznych — w asemblerze istnieją wyłącznie skutki uboczne i nie ma żadnego innego mechanizmu wykonywania obliczeń.

W językach funkcyjnych dla odmiany skutków ubocznych jest bardzo mało i tylko tam gdzie są rzeczywiście niezbędne, np. do operacji wejścia/wyjścia.

Skutki uboczne znacznie utrudniają przeprowadzenie wielu rodzajów optymalizacji kodu wynikowego oraz mogą powodować trudne do zdiagnozowania błędy w działaniu aplikacji (jeżeli programista nie jest świadomy efektów ubocznych używanych funkcji).