Middle
Pasakok apie funkcionalų programavimą ir jo principus.
sobes.tech AI
Atsakymas iš AI
Funkcinis programavimas (FP) yra programavimo paradigma, kuri traktuoja skaičiavimus kaip matematikos funkcijų skaičiavimus, vengdama būsenos keitimo ir keičiamų duomenų.
Pagrindiniai principai:
-
Švarios funkcijos: Funkcija laikoma švaria, jei:
- ji visada grąžina tą patį rezultatą, jei pateikiami tie patys argumentai;
- neturi šalutinių poveikių (nekeičia globalios būsenos, nevykdo įvesties/išvesties operacijų ir t.t.).
<?php // Švari funkcija function add(int $a, int $b): int { return $a + $b; } // Neshvari funkcija (turi šalutinį poveikį - keičia globalią kintamąjį) $count = 0; function increment_and_get(): int { global $count; $count++; return $count; } -
Duomenų nekintamumas: Po sukūrimo duomenys negali būti keičiami. Vietoj to, kuriamas naujas objektas su reikiamais pakeitimais.
<?php // Pavyzdys apie nekintamumą (PHP nėra griežtas kalbos principas, bet jį galima įgyvendinti) 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; } // Vietoj keitimo, grąžinamas naujas objektas 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 lieka (1, 2), $p2 tampa (2, 3) -
Funkcijos kaip pirmosios klasės objektai: Funkcijos gali būti perduodamos kaip argumentai kitoms funkcijoms, grąžinamos iš funkcijų, priskiriamos kintamiesiems.
<?php // Funkcijos kaip kintamieji $greeter = function(string $name): string { return "Hello, " . $name; }; echo $greeter("World"); // Išvestis: Hello, World // Funkcijos kaip argumentai 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] -
Trūksta šalutinių poveikių: Skaičiavimai neveikia įtakos programos būsenai už jų ribų.
-
Deklaratyvumas: dėmesys skiriamas ką reikia apskaičiuoti, o ne kaip.
Privalumai:
- Pagerinta testavimas (švarios funkcijos lengvai testuojamos).
- Paprastesnis paralelizmas (nekeičiama būsena sumažina sinchronizacijos problemas).
- Geresnis derinimas.
- Kodo prognozuojamesnis elgesys.