Sobes.tech
Middle

Разкажи за функционалното програмиране и неговите принципи.

sobes.tech AI

Отговор от AI

Функционалното програмиране (ФП) е парадигма на програмиране, която разглежда изчисленията като изчисления на математически функции, избягвайки промяната на състоянието и изменяемите данни.

Основни принципи:

  • Чисти функции: Функция се счита за чиста, ако:

    • Винаги връща същия резултат при едни и същи аргументи.
    • Няма странични ефекти (не променя глобално състояние, не извършва вход/изход и т.н.).
    <?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]
    
  • Липса на странични ефекти: Изчисленията не влияят на състоянието на програмата извън техния обхват.

  • Декларативност: Фокусът е върху какво трябва да се изчисли, а не върху как.

Предимства:

  • Подобрена тестируемост (чистите функции са лесни за тестване).
  • Улесняване на паралелизма (липсата на изменяемо състояние намалява проблемите със синхронизацията).
  • По-добра отладъчност.
  • По-предсказуемо поведение на кода.