Middle
Rozprávaj o funkčnom programovaní a jeho princípoch.
sobes.tech AI
Odpoveď od AI
Funkcionálne programovanie (FP) je paradigmat programovania, ktoré považuje výpočty za výpočty matematických funkcií, vyhýbajúc sa zmenám stavu a meniteľným dátam.
Hlavné princípy:
-
Čisté funkcie: Funkcia sa považuje za čistú, ak:
- Vždy vracia rovnaký výsledok pri rovnakých argumentoch.
- Nemá vedľajšie účinky (nemení globálny stav, nevykonáva vstup/výstup atď.).
<?php // Čistá funkcia function add(int $a, int $b): int { return $a + $b; } // Nčistá funkcia (má vedľajší účinok - mení globálnu premennú) $count = 0; function increment_and_get(): int { global $count; $count++; return $count; } -
Nezmeniteľnosť dát: Po vytvorení nie je možné dáta meniť. Namiesto zmeny existujúceho objektu sa vytvorí nový s požadovanými zmenami.
<?php // Príklad nezmeniteľnosti (v PHP to nie je prísny princíp jazyka, ale dá sa implementovať) 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; } // Namiesto zmeny, vraciame 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 zostáva (1, 2), $p2 je (2, 3) -
Funkcie ako prvotriedne objekty: Funkcie môžu byť odovzdávané ako argumenty iným funkciám, vracané z funkcií, priradené premenným.
<?php // Funkcie ako premenné $greeter = function(string $name): string { return "Hello, " . $name; }; echo $greeter("World"); // Výstup: Hello, World // Funkcie ako 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] -
Chýbajúce vedľajšie efekty: Výpočty neovplyvňujú stav programu mimo ich rozsah.
-
Deklaratívnosť: Zameranie je na čo je potrebné vypočítať, nie na ako.
Výhody:
- Zlepšená testovateľnosť (čisté funkcie sú ľahko testovateľné).
- Uľahčenie paralelizmu (neprítomnosť meniteľného stavu znižuje problémy synchronizácie).
- Lepšia ladenie.
- Predvídateľnejšie správanie kódu.