Funkcja

Nazwany, wielokrotnie używalny blok kodu wykonujący określone zadanie. Może przyjmować argumenty i zwracać wynik.

Funkcja to nazwany, wielokrotnie używalny blok kodu, który wykonuje jedno konkretne zadanie. Możesz przekazać jej dane wejściowe (argumenty), a ona odda ci wynik (wartość zwracaną). Zamiast kopiować ten sam fragment w dziesięciu miejscach, piszesz go raz, nadajesz mu nazwę i wołasz tyle razy, ile potrzebujesz.

Sens funkcji sprowadza się do trzech rzeczy: nie powtarzaj się (zasada DRY), ukryj szczegóły za sensowną nazwą i testuj kawałki kodu w izolacji. Funkcję definiujesz raz, a potem ją wywołujesz — przekazujesz argumenty przez parametry i odbierasz to, co zwróci. Dobra funkcja robi jedną rzecz i robi ją dobrze, a jej nazwa mówi co robi, nie jak. Jeśli musisz scrollować, żeby zobaczyć jej koniec, prawdopodobnie powinna być kilkoma mniejszymi funkcjami.

Jak to wygląda w praktyce

Weźmy Pythona. Funkcję definiujesz słowem kluczowym def:

  • def pole_kola(r): return 3.14159 * r ** 2
  • wywołanie: pole_kola(5) zwróci 78.539...

W JavaScript masz kilka zapisów na to samo: klasyczne function dodaj(a, b) { return a + b; } oraz krótszą funkcję strzałkową const dodaj = (a, b) => a + b;. Funkcje są tam first-class citizens — możesz je przypisać do zmiennej, wrzucić do tablicy albo przekazać innej funkcji jako argument (tzw. callback, np. w array.map(...)). To fundament całego programowania funkcyjnego.

Częste pułapki

  • Funkcja-moloch — robi pięć rzeczy naraz. Trudno ją przetestować i nazwać. Tnij na mniejsze.
  • Mylenie parametru z argumentemparametr to nazwa w definicji (def f(x)), argument to konkretna wartość przy wywołaniu (f(10)).
  • Side effects — funkcja, która po cichu modyfikuje globalny stan zamiast tylko zwracać wynik, potrafi narobić bałaganu. Funkcja „czysta” (pure) dla tych samych argumentów zawsze zwraca to samo i niczego z zewnątrz nie rusza.
  • Brak return — w Pythonie funkcja bez jawnego return zwróci None, co bywa zaskakujące, gdy spodziewasz się liczby.

Pojęcia powiązane: metoda (funkcja przypisana do obiektu/klasy), argument i parametr, wartość zwracana, rekurencja (funkcja wywołująca samą siebie), funkcja anonimowa (lambda), callback, zakres zmiennych (scope) oraz zasada DRY.