Middle
Opowiedz o programowaniu funkcyjnym i jego zasadach.
sobes.tech AI
Odpowiedź od AI
Programowanie funkcyjne (FP) to paradygmat programowania, który traktuje obliczenia jako ocenę funkcji matematycznych, unikając zmiany stanu i danych mutowalnych.
Podstawowe zasady:
-
Funkcje czyste: Funkcja jest uważana za czystą, jeśli:
- Zawsze zwraca ten sam wynik dla tych samych argumentów.
- Nie ma efektów ubocznych (nie zmienia globalnego stanu, nie wykonuje wejścia/wyjścia itp.).
<?php // Funkcja czysta function add(int $a, int $b): int { return $a + $b; } // Funkcja nieczysta (ma efekt uboczny - zmienia zmienną globalną) $count = 0; function increment_and_get(): int { global $count; $count++; return $count; } -
Niezmienność danych: Po utworzeniu dane nie mogą być zmienione. Zamiast modyfikować istniejący obiekt, tworzy się nowy z potrzebnymi zmianami.
<?php // Przykład niezmienności (w PHP nie jest to ścisła zasada języka, ale można ją zaimplementować) 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; } // Zamiast zmieniać, zwraca nowy obiekt 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 pozostaje (1, 2), $p2 staje się (2, 3) -
Funkcje jako obiekty pierwszej klasy: Funkcje mogą być przekazywane jako argumenty do innych funkcji, zwracane z funkcji, przypisywane do zmiennych.
<?php // Funkcje jako zmienne $greeter = function(string $name): string { return "Hello, " . $name; }; echo $greeter("World"); // Wypisze: Hello, World // Funkcje 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] -
Brak efektów ubocznych: Obliczenia nie wpływają na stan programu poza ich zakresem.
-
Deklaratywność: Skupia się na co trzeba obliczyć, a nie na jak.
Zalety:
- Lepsza testowalność (czyste funkcje są łatwe do testowania).
- Uproszczenie równoległości (brak zmiennego stanu zmniejsza problemy synchronizacji).
- Lepsza możliwość debugowania.
- Bardziej przewidywalne zachowanie kodu.