Funkcje

W poprzednim poście dowiedzieliśmy się, jak za pomocą instrukcji warunkowych sterować logiką naszego programu. Dziś zrobimy kolejny krok i poznamy funkcje. Dzięki nim możemy ładnie grupować sobie nasz kod w mniejsze, bardziej zrozumiałe i łatwiejsze do zarządzania części, które będziemy mogli wykorzystywać wielokrotnie.

Pisząc nasze programy często zauważymy, że piszemy bardzo podobny kod wielokrotnie. I nie chodzi mi tutaj o jakąś linijkę czy polecenie, ale bardziej o kilka, kilkanaście czy kilkadziesiąt linijek kodu, który robi jakąś określoną rzecz. Po pewnym czasie okazuje się, że w jakimś innym miejscu w naszym programie będziemy chcieli zrobić dokładnie to samo (albo prawie to samo). Mamy wtedy dwie opcje: albo przepisujemy ten sam kod (metodą kopiuj – wklej) albo właśnie używamy funkcji (ang. function).

W 99% przypadków kopiowanie kodu w inne miejsce jest złym rozwiązaniem i starajmy się go unikać. Pozwalają na to właśnie między innymi funkcje.

Funkcja jest to oddzielna część naszego programu, która sobie gdzieś tam jest i coś robi. Co najważniejsze możemy taką funkcję używać wielokrotnie w różnych miejscach naszego programu. Możemy porównać funkcje do przybornika z narzędziami. Jeżeli chcemy wbić gwóźdź to weźmiemy przyrząd do wbijania gwoździ (na przykład młotek). Jeżeli potrzebujemy dodać dwie liczby, to weźmiemy funkcję do dodawania liczb. Funkcje to takie nasze narzędzia w warsztacie programisty.

Zobaczmy na przykład w języku JavaScript.

Jak widzisz przykład nie jest zbyt skomplikowany. Na początku definiujemy sobie naszą funkcję. Jej nazwa to “Suma” i w nawiasie określamy jakie parametry taka funkcja przyjmuje (“liczbaA” i “liczbaB”). Następnie w nawiasach klamrowych piszemy nasz powtarzalny kawałek kodu, który chcemy zawrzeć w naszej funkcji. W ten sposób stworzyliśmy funkcję, którą możemy wielokrotnie wykorzystywać w wielu miejscach naszego programu podając tylko jej nazwę.

W ostatnich dwóch linijkach widzimy w jaki sposób wywołać funkcję “Suma” podając jako parametry cyfry 1 i 2 oraz następnie 213 i 1231. Powyższy kawałek programu moglibyśmy zapisać nie używając funkcji w ten sposób:

Jak widzisz, wygląda to prościej, ale sam przykład jest prosty. Uwierz mi,że dla bardziej skomplikowanych przypadków funkcje są niezastąpione 🙂 Szczególnie, gdy chcemy w danej funkcji zrobić wiele rzeczy na raz. Spójrz tylko na kolejny przykład:

Teraz nasza funkcja jest już bardziej skomplikowana i wykorzystujemy ją aż 3 razy. Widzisz zapewne o ile mniej kodu napisaliśmy używając funkcji (w przeciwieństwie do kopiowania tego samego kodu kilkukrotnie) oraz że nasz program jest bardziej przejrzysty. Kolejną zaletą jest to, że patrząc na taki kod od razu widzimy co programista miał na myśli pisząc go.

Mała dygresja. Uwierz mi na słowo, że bywa tak, że po pewnym czasie (kilku miesięcy czy lat) samemu ciężko jest zrozumieć swój własny kod i to co wcześniej chciało się zrobić. A co dopiero gdy nasz kod czyta ktoś inny. Dlatego zawsze warto jest pisać go w taki sposób, aby jak najbardziej ułatwić jego zrozumienie. Dlatego też nadawajmy funkcjom nazwy, które dobrze opisują co one robią.

W języku JavaScript funkcje definiujemy za pomocą słowa kluczowego “function”. Następnie podajemy jej nazwę oraz dwa nawiasy. Opcjonalnie możemy pomiędzy nawiasami podać jeden lub więcej argumentów, które zostaną przekazane do funkcji. Po tych nawiasach następuje treść funkcji właściwej w nawiasach klamrowych. Funkcja w języku JavaScript może ale nie musi zwracać wartość (ang. return).

Nawias przy nazwie funkcji jest jej cechą charakterystyczną i zwykle jest wymagany w celu jej wywołania w innym miejscu programu.

Składnia definiowania funkcji w języku Java oraz C#  jest trochę inna. Poniżej przedstawiłem główne różnice w tych językach na przykładzie różnych funkcji.

Funkcje, które nic nie zwracają:

JavaScript

C#

Java

Python

Funkcje, które zwracają wartość:

JavaScript

C#

Java

Python

Jak widzisz definicje funkcji różnią się pomiędzy językami programowania. W JavaScript definicja funkcji zaczyna się od słowa kluczowego “function” a jej treść zawiera się pomiędzy nawiasami klamrowymi. W języku Python definicja funkcji zaczyna się od słowa kluczowego “def” a jej treść zaczyna się po dwukropku i koniecznie musi być wcięta (na przykład spacjami na początku linijki). Z kolei w języku Java każda funkcja musi być częścią klasy (o klasach już niedługo dowiemy się więcej).

Język Python ma bardzo ciekawą cechę z którą spotykamy się tutaj po raz pierwszy. Otóż poszczególne bloki kodu naszego programu określane są za pomocą wcięć. Na początku linijki muszą znaleźć się na przykład 4 spacje. W ten sposób nawiasy klamrowe z innych języków programowania znikają. W ich miejsce mamy wcięcie w kodzie. Na początku może to trochę mylić, ale z czasem podczas używania języka staje się intuicyjne.

Na koniec mała ciekawostka. Do tej pory w języku Java, również używaliśmy funkcji. Zobacz teraz na poprzednie posty z kodem pisanym w języku Java (na przykład tu lub tu) i zwróć proszę uwagę na to, że jest jedna główna funkcja. To jest taka funkcja startowa, bo każdy program musi mieć jakiś punkt wejścia. W języku Java wygląda on właśnie tak:

To tyle jeśli chodzi o funkcje. Zapamiętaj, że jest to pewien kawałek kodu, który możemy wykorzystywać w innym miejscu naszego programu. Pamiętaj też o odpowiednim nazywaniu swoich funkcji, aby pomagały zrozumieć co chcesz wykonać za pomocą danego kodu. Mam nadzieję, że już zauważasz jak przydatne w programowaniu są funkcje. A jeżeli nie, to myślę, że zobaczysz to w bardziej złożonych i ciekawszych przykładach.

1 reply

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *