Middle
Поговори о функционалном програмирању и његовим принципима.
sobes.tech АИ
Одговор од АИ
Функционално програмирање (ФП) је парадигма програмирања која разматра израчунавања као израчунавања математичких функција, избегавајући промену стања и променљиве податке.
Основни принципи:
-
Чисте функције: Функција се сматра чистом ако:
- Увек враћа исти резултат при истим аргументима.
- Нема споредне ефекте (не мења глобално стање, не врши улаз/излаз итд.).
<?php // Чиста функција function add(int $a, int $b): int { return $a + $b; } // Нечиста функција (има споредни ефекат - мења глобалну променљиву) $count = 0; function increment_and_get(): int { global $count; $count++; return $count; } -
Неизменљивост података: После креирања, подаци не могу бити измењени. Уместо измене постојећег објекта, креира се нови са потребним изменама.
<?php // Пример неизменљивости (у PHP-у то није строг принцип језика, али се може реализовати) 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; } // Уместо измене, враћамо нови објекат 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 остаје (1, 2), $p2 постаје (2, 3) -
Функције као првокласни објекти: Функције могу бити предаване као аргументи другим функцијама, враћане из функција, додељене променљивима.
<?php // Функције као променљиве $greeter = function(string $name): string { return "Hello, " . $name; }; echo $greeter("World"); // Излаз: Hello, World // Функције као аргументи 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] -
Недостаје споредни ефекти: Израчунавања не утичу на стање програма ван њиховог опсега.
-
Декларативност: Фокус је на шта треба израчунати, а не на како.
Предности:
- Побољшана тестираност (чисте функције лако тестирати).
- Олакшавање паралелизма (недостајање променљивог стања смањује проблеме синхронизације).
- Боља дебаговање.
- Предвидљивије понашање кода.