Czym jest funkcja?

Wspomnieliśmy już, że funkcja jest wydzieloną częścią kodu, odpowiedzialną za wykonanie określonych zadań. Jeżeli piszemy rozbudowany program, stanie się on bardziej przejrzysty po rozbiciu całości na funkcje.

Co istotne, funkcje ułatwiają użycie tej samej sekwencji poleceń w różnych częściach programu. Zamiast powielać za każdym razem identyczne wycinki kodu, wywołujemy zawierającą je funkcję.

Gdybyśmy wreszcie chcieli edytować powtarzające się fragmenty kodu, dzięki zastosowaniu funkcji robimy to tylko raz. Poprawiamy wówczas samą funkcję, nie musząc zmieniać programu w wielu miejscach.

Pierwsza funkcja w języku Java

Oto deklaracja przykładowej funkcji w Javie:

Linia 1. public static int dodajLiczby otwórz nawias okrągły int argumentFunkcji przecinek int drugiArgumentFunkcji zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int wynikDoZwrocenia znak równości argumentFunkcji plus drugiArgumentFunkcji średnik. Linia 3. return wynikDoZwrocenia średnik. Linia 5. System kropka out kropka println otwórz nawias okrągły cudzysłów Ta linijka nie zostanie wykonana cudzysłów zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy.

Słowa kluczowe public oraz static omówimy w innym e‑materiale. Na razie musisz pamiętać, aby zawsze używać ich podczas deklarowania funkcji.

Przejdziemy do określenia typu danych zwracanego przez funkcję. Przede wszystkim trzeba podkreślić, że każda zmienna zdefiniowana wewnątrz funkcji jest zmienną lokalną. Oznacza to, że nie można odwołać się do niej spoza funkcji, a sama zmienna jest usuwana, gdy tylko funkcja zakończy działanie.

Co jednak zrobić w sytuacji, gdy funkcja ma wykonać jakieś obliczenia? Zapewne chcielibyśmy poznać ich wyniki, więc zależy nam na tym, aby nie zniknęły one z pamięci.

Otóż można sprawić, że funkcja przed zakończeniem działania zwróci jakąś wartość – na przykład przekaże programowi głównemu rezultat wykonanych operacji matematycznych. Musimy jednak poinformować kompilator, jakich danych powinien się spodziewać.

Wróćmy zatem do definicji funkcji. Tuż po słowach publicstatic musimy podać typ zwracanych wartości. Rezultatem działania przykładowej funkcji będzie liczba całkowita (int).

Jeżeli nie chcemy, aby funkcja zwracała jakąkolwiek wartość, jako typ danych wpisujemy void (czyli „pusty”). Robimy tak choćby w przypadku definiowania funkcji, której zadaniem jest wyświetlanie komunikatów; nie zwraca ona nic programowi głównemu.

Ważne!

Funkcja, dla której określimy typ zwracanych danych, musi takie właśnie dane zwrócić. W przeciwnym przypadku pojawią się błędy kompilacji.

Tuż za typem zwracanych wartości podajemy nazwę funkcji. W naszym przypadku brzmi ona: dodajLiczby. Będziemy się nią posługiwali podczas wywoływania funkcji.

Gdy funkcja nie będzie przyjmować żadnych parametrów, za nazwą stawiamy parę okrągłych nawiasów: () – i deklaracja jest gotowa. Kiedy jednak chcemy przekazać funkcji jakieś parametry, musimy je opisać.

Argument jest wartością przekazaną do parametru funkcji. Parametry deklarujemy wewnątrz nawiasów okrągłych, wskazując ich typy i nazwy. Nie ma ograniczeń co do liczby przekazanych parametrów; musimy tylko oddzielić je przecinkami. W zaprezentowanym przykładzie mamy dwa parametry typu całkowitego (int) o nazwach argumentFunkcji oraz drugiArgumentFunkcji.

Ważne!

Kiedy jako argument przekazujemy zmienną, funkcja tworzy lokalną kopię jej wartości. Oznacza to, że jeżeli wewnątrz funkcji zmienna zostanie zmodyfikowana, nie będzie miało to wpływu na jej oryginalną wartość.

Po deklaracji zapisujemy ciało funkcji, czyli instrukcje, które zostaną wykonane po jej wywołaniu. Polecenia te umieszczamy w parze nawiasów klamrowych. W przykładowej funkcji definiujemy zmienną lokalną wynikDoZwrocenia i przypisujemy jej sumę podanych argumentów.

Dalej pojawia słowo kluczowe returnreturnreturn. Jest to polecenie zatrzymania działania funkcji i zwrócenia programowi głównemu wskazanej wartości (w tym przypadku jest nią wynikDoZwrocenia). Podkreślmy to wyraźnie: polecenie return oznacza natychmiastowe opuszczenie funkcji. Ostatnia komenda w przykładzie – System.out.println... – jest więc przewrotna, bo nigdy nie zostanie wykonana, choć z punktu widzenia składni języka Java najzupełniej poprawna.

Ciekawostka

Jeżeli chcemy przerwać działanie funkcji, która nie zwraca żadnej wartości (czyli przed jej nazwą pojawiło się słowo void),  możemy zrobić to w dowolnym momencie, wydając polecenie return (i pamiętając aby nie podawać żadnej wartości do zwrócenia).

Wywołanie funkcji

Gdy chcemy użyć funkcji w którymkolwiek miejscu programu, po prostu podajemy jej nazwę (oraz argumenty, o ile są one niezbędne):

Linia 1. int wynikDzialaniaFunkcji znak równości dodajLiczby otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik.

Zdefiniowana wcześniej funkcja dodajLiczby zwraca wartość typu int. Przypisaliśmy ją zmiennej wynikDzialaniaFunkcji. Jeżeli funkcja nie oczekuje argumentów, za jej nazwą umieszczamy pustą parę okrągłych nawiasów.

Ważne!

Gdy funkcja wymaga podania argumentów, ale ich nie otrzyma (bądź przekażemy jej złą liczbę argumentów), mogą pojawić się błędy kompilacji.

Kolejną część lekcji poświęcimy przykładom wykorzystania funkcji.

Słownik

return
return

polecenie przerywające wykonywanie funkcji i zwracające wskazaną za nim wartość programowi nadrzędnemu

parametr funkcji
parametr funkcji

element składni języka, który jest definiowany przy deklaracji metody lub funkcji; deklarujemy go w nagłówku podprogramu; umożliwia komunikację pomiędzy podprogramem (funkcją/metodą), a programem go wywołującym

argument funkcji
argument funkcji

element składni w określonym języku programowania, który w wyniku wywołania podprogramu zostaje utożsamiony (skojarzony) z określonym parametrem podprogramu

prototyp funkcji
prototyp funkcji

zwany również deklaracją; funkcja która nie posiada ciała, a jedynie informuje kompilator o postaci parametrów oraz zwracanej wartości