Middle
Pověz o funkcionálním programování a jeho principech.
sobes.tech AI
Odpověď od AI
Funkcionální programování (FP) je paradigma programování, které považuje výpočty za výpočty matematických funkcí, vyhýbá se změnám stavu a měnitelným datům.
Hlavní principy:
-
Čisté funkce: Funkce je považována za čistou, pokud:
- Vždy vrací stejný výsledek při stejných vstupech.
- Nemá vedlejší efekty (nemění globální stav, nevykonává vstup/výstup atd.).
<?php // Čistá funkce function add(int $a, int $b): int { return $a + $b; } // Nečistá funkce (má vedlejší efekt - mění globální proměnnou) $count = 0; function increment_and_get(): int { global $count; $count++; return $count; } -
Neměnnost dat: Po vytvoření data nelze změnit. Místo změny existujícího objektu se vytváří nový s požadovanými změnami.
<?php // Příklad neměnnosti (v PHP to není striktní princip jazyka, ale lze jej implementovat) class ImmutablePoint { private int $x; private int $y; public function __construct(int $x, int $y) { $this->x = $x; $this->y = $y; } public function getX(): int { return $this->x; } public function getY(): int { return $this->y; } // Místo změny vrací nový objekt public function move(int $dx, int $dy): self { return new self($this->x + $dx, $this->y + $dy); } } $p1 = new ImmutablePoint(1, 2); $p2 = $p1->move(1, 1); // $p1 zůstává (1, 2), $p2 je (2, 3) -
Funkce jako prvotřídní objekty: Funkce mohou být předávány jako argumenty jiným funkcím, vráceny z funkcí, přiřazeny proměnným.
<?php // Funkce jako proměnné $greeter = function(string $name): string { return "Hello, " . $name; }; echo $greeter("World"); // Výstup: Hello, World // Funkce jako argumenty function apply_transform(array $data, callable $transform): array { $result = []; foreach ($data as $item) { $result[] = $transform($item); } return $result; } $numbers = [1, 2, 3]; $doubled_numbers = apply_transform($numbers, function(int $n): int { return $n * 2; }); // $doubled_numbers = [2, 4, 6] -
Chybějící vedlejší efekty: Výpočty neovlivňují stav programu mimo jejich rozsah.
-
Deklarativnost: Zaměření je na co je třeba vypočítat, nikoli na jak.
Výhody:
- Zlepšená testovatelnost (čisté funkce jsou snadno testovatelné).
- Zjednodušení paralelismu (nepřítomnost měnitelného stavu snižuje problémy synchronizace).
- Lepší laditelnost.
- Předvídatelnější chování kódu.