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óci78.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 argumentem — parametr 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 jawnegoreturnzwróciNone, 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.