Vedlejší účinek (programování)
Vedlejší účinek (anglicky side effect) je pojem, který v programování představuje situaci, kdy volaná funkce nebo výpočetní výraz mění i jiný stav procesu, než je návratová hodnota funkce nebo výrazu nebo změna hodnoty parametru odkazovaného přes odkaz referencí.
Vedlejší účinek může být úmyslný nebo neúmyslný. Neúmyslný vedlejší účinek je častým zdrojem mnoha programátorských chyb. Úmyslný vedlejší účinek je základem procedurálního přístupu k tvorbě software a pokud se používá přehledně a účelně, může zjednodušit implementaci programového kódu. Naopak v deklarativním přístupu tvorby software je vedlejší účinek zakázán a často není ani možný.
Z pohledu současných programovacích jazyků je vedlejší účinek považován spíše za programátorský antivzor a je snahou vedlejší účinky minimalizovat pomocí neměnných dat. S pojmem vedlejšího účinku souvisí také pojem čistá funkce, která ze své podstaty brání vzniku vedlejších účinků.
Příklady
Typický případ neúmyslného (chybného) vedlejšího účinku výrazu v jazyce C:
int i = 1;
foo( i++, i );
při volání funkce foo() se jako první argument předává hodnota i, která se následně zvýší o 1 (vedlejší účinek), má se jako druhý argument zapsat hodnota i původní nebo zvýšená o 1? V praxi záleží na konkrétní implementaci překladače jazyka.
Typický případ úmyslného vedlejšího účinku výrazu v jazyce C:
int pocitadlo=0;
void foo()
{
pocitadlo++;
}
při každém volání funkce foo() se zvýší hodnota proměnné počítadlo o 1.
Následky vedlejších účinků
Díky vedlejšímu účinku je možné některé algoritmy zapsat jednodušším způsobem než v případě, kdy je snahou se vedlejším efektům vyhnout. Následkem vedlejšího efektu je ale změna vnitřního stavu běžícího programu (nebo některé jeho části). Běh programu tak může být na základě změny vnitřního stavu změněn neočekávaným způsobem. Jednoduchost zápisu je tak vykoupena snížením deterministického chování a stabilitou výsledného systému.
Stabilitu programu by mělo zajistit jeho testování ve fázi vzniku. Algoritmy s vedlejším efektem se ale těžko testují, protože jejich chování může být často nepředvídatelně ovlivněno předchozí činností programu. Z tohoto důvodu je nutné vytvářet velké množství testovacího kódu, aby pokrylo všechny možné eventuality, které by mohly nastat. To často znamená vytvořit větší množství testovacího kódu než produkčního.
Odstraněním vedlejších účinků vznikají tzv. čisté funkce, jejichž chování je neměnné a snadno testovatelné: Mají méně cest průchodu.
Vedlejší efekt jako událost reálného světa
Efekt v kontextu programovacích jazyků je něco co je pozorovatelné vně vykonávaného kódu. Efekt je tak něco co vykonává každý program (imperativní nebo deklarativní). Vedlejší efekt je ale speciální typ efektu, který není očekávaný. Dalo by se říct, že se jedná o sekundární efekt vykonávaného kódu, který mění stav a tím i chování jiných částí systému.
Vedlejší efekt je ale událost reálného světa a každý program, který dělá něco užitečného vyžaduje určitou formu vedlejšího efektu. Asi nejdůležitější operace, která vyžaduje vedlejší efekt jsou totiž vstup a výstup z programu, bez kterých se žádný program neobejde. Vstup do programu totiž mění stav běžícího programu, protože umožňuje brát data "odnikud" a výstup na druhou stranu umožňuje, aby se data ztrácela bez možnosti je získat zpět (nelze ověřit co bylo fyzicky výstupem).
To je největší problém se kterým se musejí potýkat funkcionální programovací jazyky.