Jason. Cała informatyka w jednym miejscu!

Otwieram dzisiaj następne zagadnienie z języka Java jakim jest funkcja w języku Java! Definicja funkcji, wyjaśnienie do czego ona służy oraz jak bardzo jest ważnym elementem każdego kodu źródłowego. Czy muszę dalej przekonywać do zajrzenia do środka 😄?

FUNKCJA W JĘZYKU JAVA I WSZYSTKO, CO MUSISZ O NIEJ WIEDZIEĆ!

Nie będę ukrywał - oto stoimy przed kolejnym podstawowym budulcem niemalże każdego programu jaki powstał w języku Java, już nieważne jak rozbudowany. Dla porównania, funkcja jest tak regularnie stosowana w programowaniu jak operacja dodawania w matematyce. Używasz tego co chwilę. Funkcji też będziesz używać co chwilę 🙂.

Funkcja w języku Java, jak w każdym innym języku programowania, to podprogram do którego umieszcza się blok określonych instrukcji do wykonania i czyni się tak z dwóch istotnych przyczyn:

  • żeby oddzielić fragment kodu od całej reszty,
  • żeby umożliwić wykonywanie tego samego kodu nieskończoną liczbę razy.

Pierwszy punkt odnosi się do dekompozycji. Jest to umiejętność rozdzielania od siebie instrukcji w celu uniknięcia tworzenia gigantycznych funkcji mających po 20,000 linijek kodu 😬. Przyczyna jest prosta do wywnioskowania, ale gdyby nie przyszła do głowy, chodzi o to, że nikt przy zdrowych zmysłach nie zniesie potencjalnych napraw takiego kodu, jeżeli się wysypie 😉. O samej funkcji ogólnie też napisałem odrębny artykuł.

Punkt drugi to otwarcie furtki do wykonywania powtarzalnych czynności przy pomocy pętli, które już opisałem w poprzednich artykułach ("for", "while" i "do while"). Wyjaśnię to w momencie przedstawiania wywoływania funkcji.

TROCHĘ TERMINOLOGII, KTÓRA (MOŻE) NIE ZASZKODZI

Trzeba sobie wyjaśnić garść terminów z jakimi będziesz mieć styczność. Na początku termin "metoda". Metoda to też funkcja z tym, że przyjęło się rozróżniać jedno od drugiego, gdy funkcja jest częścią klasy, tak zwaną składową (o klasach więcej w innym artykule). Jeżeli funkcja należy do jakiejś klasy, to jest już metodą. Właściwie, każda funkcja w języku Java jest metodą. Nawet funkcja "main" (ta, od której zaczyna się każdy program), bo ona też musi znaleźć się wewnątrz klasy 😄!

Od tej pory będę używać zamiennie zwrotów "funkcja" i "metoda".

Drugie pojęcie to wywoływanie. Wywoływaniem metody określamy jej wykonanie, a konkretniej, wykonanie wszystkich poleceń wchodzących w jej skład. Jeżeli w dowolnym miejscu naszego kodu źródłowego chcemy nakazać wykonanie jakiejś funkcji, mówimy że ją wywołujemy.

Parametr formalny (parametr) jest trzecim pojęciem, bez którego nie można się obejść. To jest zmienna występująca jedynie w obrębie funkcji. Są takie sytuacje, że metoda, aby wykonać swoje instrukcje, musi posiłkować się różnymi danymi, które naturalnie mogą się różnić zależnie od funkcjonalności. Na przykład za pierwszym razem będzie potrzebować liczby całkowitej wpisanej jako stałej, a za innym może być potrzebne pobranie liczby z pliku (czysto hipotetycznie). Wtedy idealnym rozwiązaniem będzie narzucenie wymagalności podania liczby w ramach każdorazowego wywołania funkcji.

Pojęcie nr 4: parametr aktualny (argument). To jest wartość wprowadzana w momencie wywołania funkcji. Parametr formalny stanowi takie "gniazdo", do którego należy wprowadzić wartość, a parametr aktualny byłby takim "przewodem", które do niego wpinamy. Sugerując się przykładem u góry, to byłyby te liczby całkowite typu "int".

DEFINICJA FUNKCJI

OK, mamy za sobą wstęp i terminy, teraz przedstawię Ci wzór kodu źródłowego 🙂. Funkcja w języku Java jako postać ogólna wygląda następująco:

[modyfikator dostępu] [inne opcjonalne modyfikatory] [typ zwracanej wartości] [nazwa funkcji](typ_parametru_1 nazwa_parametru_1, typ_parametru_2 nazwa_parametru_2, ...,  typ_parametru_n nazwa_parametru_n) {
	// instrukcje
}

Rozumiem, że to może wyglądać całkowicie nieczytelnie, dlatego dam od razu podstawienie pod metodę "main" poznaną w artykule wprowadzającym:

public static void main(String[] args) {
	// instrukcje
}

Teraz czytaj uważnie.

MODYFIKATOR DOSTĘPU

ZAWSZE zaczynamy od modyfikatora dostępu. Jednym z nich jest publiczny ("public"), prywatny ("private") jest drugim z jakiego będziesz korzystać najczęściej. Po więcej informacji na temat modyfikatorów odeślę do odrębnego wpisu. Jednym zdaniem to kontroluje zasięg widoczności funkcji na zewnątrz klasy, która ją posiada. Publiczny oznacza, że będzie możliwe wywołanie metody z poziomu innej klasy poprzez zmienną typu tej klasy.

INNE OPCJONALNE MODYFIKATORY

Dalej mamy kolejne modyfikatory, które co ważne, nie muszą się tam znajdować. Dla "main" mamy słówko "static" i ono musi się tam znaleźć. Statyczność oznacza to, że metoda będzie dostępna poprzez klasę, a nie jej obiekty, a co za tym idzie, nie potrzeba żadnych obiektów, żeby taką metodę wywołać. "main" musi być statyczne, ponieważ wirtualna maszyna (JVM) nie dysponuje żadnymi obiektami z chwilą uruchomienia programu (muszą one dopiero zostać zainicjowane przez metodę "main"). Nie tylko funkcja w języku Java może być statyczna - więcej info na temat statyczności w załączonym artykule.

TYP ZWRACANEJ WARTOŚCI

Typ zwracanej wartości jest kolejną obowiązkową częścią definicji. Wstawiamy co innego w zależności od tego, czy funkcja ma coś zwracać, czy nie. Jeżeli ma tylko wykonywać polecenia, to wpisujemy "void", co w dosłownym tłumaczeniu będzie oznaczać "zwracanie niczego". Natomiast jeżeli funkcja ma zwrócić jakąś wartość np. wynik działania mnożenia, to w tym miejscu musimy to oznaczyć wstawiając odpowiedni typ danych, który w tym przypadku byłby liczbą całkowitą ("int") bądź zmiennoprzecinkową ("double"). Pamiętaj również, że kiedy zaznaczysz, że funkcja ma coś zwracać, to musisz to uwzględnić w kodzie używając słowa kluczowego "return":

public int square(int n) {
	return n*n;
}

Bez tego będzie błąd kompilacji! W przypadku typu "void" RÓWNIEŻ możesz użyć "return", jednak wtedy nie wstawiasz po nim ŻADNEJ wartości:

public void doSomething() {
	// instrukcje
	
	return;
}

W obu przypadkach będzie to oznaczało natychmiastowe przerwanie wykonywania tutaj instrukcji.

NAZWA (ETYKIETA) FUNKCJI

Po wstawieniu typu zwracanej wartości wpisujesz nazwę, za pomocą której będziesz mógł/mogła się na nią powoływać w razie chęci jej wywołania. To wyjątkowo nie wymaga chmury wyrazów 😀.

PARAMETRY FORMALNE

Zaraz po nazwie ma się znaleźć para nawiasów okrągłych. Wewnątrz nich dodajemy parametry formalne jakie funkcja ma przyjmować. Ważne jest aby wiedzieć, że nawiasy mają się tam znaleźć bez względu na liczbę parametrów. Nawet jeśli nie ma ich wcale, i tak trzeba je dodać!

Nie ma jakiegoś limitu parametrów, natomiast też nie powinniśmy przeginać i należy ograniczać się do ich jak najmniejszej liczby. Parametr formalny składa się z dwóch części: najpierw podajesz typ danych jaki ma reprezentować, a zaraz po nim nazwę. Jeżeli życzymy sobie dodania następnego parametru, to oddzielamy je od siebie przecinkiem:

public double multiplication(double a, double b) {
	return a*b;
}

Przecinek pomiędzy nazwą jednego parametru, a typem danych kolejnego - i nie inaczej!

TREŚĆ

Całość wieńczy para klamerek i wewnątrz nich osadzamy instrukcje jakie metoda ma wykonywać w chwili jej wywołania. Moja rada jest taka: im mniej, tym lepiej. Najlepiej, żebyś od samego początku zaczął/zaczęła sobie trenować umieszczanie nie więcej instrukcji niż 10 wierszy. Dekompozycja jest bardzo mile widziana w praktykach pisania dobrego kodu, zwłaszcza w oczach pracodawców. Wykorzystaj ten zbawienny wpływ dzielenia kodu na jak najmniejsze części, a w przyszłości zrozumiesz dlaczego to jest aż tak ważne.

WYWOŁYWANIE FUNKCJI

Teraz przedstawię jak taką metodę wywoływać. Przypominam, że to prostymi słowy nakazanie funkcji, żeby wykonała wszystkie swoje instrukcje. Wystarczy podać jej nazwę razem z parą nawiasów okrągłych (znowu, nie ma znaczenia ile ma parametrów, wstawiamy je zawsze!):

doSomething();

int result = square(5);

Jest ważna zasada! Jeżeli funkcja nie zwraca żadnej wartości, to poprzestajemy na samej nazwie z parametrami (i średnik na końcu, bo to też jest instrukcja!). Natomiast jeżeli zwraca wartość, to z reguły chcemy przechować wartość w jakiejś zmiennej przy czym nie jest to wymaganie. Można wstawić wywołanie funkcji zwracającej wartość od razu jako parametr wejściowy innej funkcji:

square(multiplication(3, 6));

W takim wypadku najpierw wykona się funkcja "multiplication", a potem dopiero "square", ponieważ żeby "square" wykonało swoje zadanie, musi najpierw mieć informację na temat wyniku mnożenia liczb 3 i 6 😊.

W Javie nie ma siły, żeby kompilacja się udała bez zgodności przekazywanych parametrów od strony zarówno ich liczby, jak i typów danych! "No way" 🙃!

A teraz pokażę na przykładzie pętli dlaczego bez funkcji nie byłoby możliwe wielokrotne wykonywanie tych samych instrukcji. Weźmy sobie pętlę "while", żeby jeszcze bardziej to uzmysłowić. Mając gotową metodę, wystarczy że sobie dodamy jej wywołanie wewnątrz pętli:

while (notFoundExit()) {
	doSomething();
}

Jak był(a)byś w stanie wpisać te same instrukcje niewiadomą liczbę razy, jeśli liczba iteracji jest nieregularna 😁?

KONWENCJE

Ostatnie słowa o zaleceniach co do zapisu. Funkcja w języku Java winna być pisana małą literą na samym początku, a każde następne słowo ma mieć wielką literę - trzeba jakoś je oddzielać z powodu braku możliwości oddzielania przy użyciu spacji. Opisaną konwencję znajdziesz pod hasłem "camelCase". Sama nazwa powinna być czasownikiem typu "zrób coś" albo "wyślij do czegoś".

Funkcja w języku Java

Funkcja w języku Java jest podprogramem wykonującym szereg swoich instrukcji. Może zwracać wartość wyjściową i przyjmować parametry w ramach danych wejściowych.


W taki sposób zamykam temat funkcji 🤗!

PODOBNE ARTYKUŁY