codExplainings #1 Function 1 - hello world

|
Robert
| komentarze | Poradniki Inne

Nowy rok to dobry moment na próby reanimacji bloga który leży w agonii w związku z wiecznym brakiem czasu. :) Tym wpisem otwieram nową i w ogóle pierwszą serię wpisów na moim blogu w których prostym i przystępnym językiem będę wyjaśniał krok po kroku działanie poszczególnych części kodu. Tak więc jest to seria dla tych którzy są początkujący lub w ogóle chcą zacząć przygodę z jakimkolwiek programowaniem. Kod który będę objaśniał będzie pochodził z zadań na codewars, który uważam do dziś za świetne miejsce do przyswajania oraz utrwalania umiejętności programistycznych. Początkowo będę bazował na dwóch pospolitych i najpopularniejszych językach ostatnich lat czyli PHP (który nadal umiera i umrzeć nie może - totalnie jak mój blog) oraz JavaScript - język który jedni chwalą, inni przeklinają.

Function 1 - hello world

CodeWars wylosowało mi na rozgrzewkę całkiem prościutkie zadanie w którym należy napisać funkcję o nazwie greet, która zwraca za każdym razem ciąg znaków "hello world!".  Na początek objaśnijmy ogólnie budowę kodu, co to jest zmienna oraz co to jest funkcja.

Kod składa się z miejsc przechowujących informacje oraz mechanizmów wykonujących zadania. Miejsce w którym przechowujemy informacje jest zmienna. Zmienna może przyjmować różne wartości, zwykle będą to wartości tekstowe (string), liczbowe (number, integer, float) oraz logiczne (boolean) czy też tablice (array), a nawet obiekty (object). Kiedyś znalazłem bardzo fajny przykład - zmienna to taka szufladka na informacje. Informacje mogą być różne, skarpetka, bokserki albo koszulka. W takich szufladkach możesz zmieniać zawartość, należy również pamiętać, że każda szufladka ma ograniczone miejsce (czym nie musisz się na początku przejmować).

W programowaniu są również różne mechanizmy wykonujące zadania. Mamy różnego rodzaju pętle (w przypadku PHP najczęściej spotykane to for, foreach oraz (do)while) czy też funkcje. Skupmy się teraz na tych ostatnich - funkcja to część kodu który może przyjmować wartości wejściowe i może zwracać wartość wyjściową. Dla przykładu: możemy napisać funkcję która sumuje dwie liczby, przyjmie zatem dwa argumenty $a oraz $b, a zwróci nam sumę: return $a + $b.

W praktyce rozwiązanie dzisiejszego zadania wygląda następująco: funkcja greet która nie przyjmuje żadnej wartości każdorazowo zwraca ciąg znaków "hello world!".

function greet() {
  return "hello world!";
}

Przyjrzyjmy się budowie kodu. Funkcja zaczyna się słowem kluczowym function, następnie podana jest nazwa deklarowanej funkcji oraz nawias w którym mogłyby znaleźć się parametry wejściowe. Później mamy typowe dla języków klamry w których zwykle znajduje się blok kodu - ogólnie każda para "wąsów" (tak nazywam klamry) wewnątrz innej to kolejny poziom abstrakcji kodu - należy dążyć do tego by było ich jak najmniej. Patrząc dalej mamy słowo kluczowe return, które wskazuje na wartość jaką zwróci funkcja - ta zwraca "Hello world!". Z wyjątkiem funkcji oraz bloków logicznych if (te opiszę przy okazji innego zadania) zwykle na końcu każdej instrukcji wstawiamy średnik - dzięki temu interpreter wie, że kolejne polecenie kończy się.

PHP jest językiem słabo typowanym, to znaczy, deklarując zmienną czy też funkcje może ona w zależności od parametrów wejściowych zwracać różne typy danych - raz ciąg znaków, raz wartość liczbową. Może wprowadzić to ogromny chaos szczególnie w przypadku większych projektów. Na szczęście PHP od wersji 7 wprowadza skalarną deklarację typów, można zatem wskazać co konkretnego będzie znajdować się w danej zmiennej, jakiego typu funkcja przyjmuje parametry oraz jakiego typu wartość zwróci. Jako, że powyższy przykład zwraca ciąg znaków, możemy tą funkcję zatem zapisać w ten sposób:

function greet(): string {
    return 'hello world!';
}

Próba zwrócenia w takiej funkcji wartości innej niż ciąg znaków zakończy się błędem.

Jak wywołać taką funkcję? Następująco:

greet();
//lub
$zmienna = greet();
/* albo */
echo "Wynik zmiennej to " . greet();
// wyświetli: Wynik zmiennej to hello world!

W pierwszej linii mamy samo wywołanie funkcji. Jako, że ta zwraca ciąg, w tym miejscu zwraca go w nicość. :) następnie mamy komentarz "inline" - jest to część pliku pomijana przez interpreter języka więc może służyć jako informacja dla innych programistów lub komentarz. Uwaga, dobrze napisany kod nie potrzebuje komentarzy - broni się sam. Później mamy przypisanie wyniku funkcji do zmiennej $zmienna. Tutaj wynik zostanie przechowany. Później znów mamy komentarz ale w wariancie blokowym, w przeciwieństwie od komentarza jednoliniowego, który zaczyna się od dwóch slashy, ten zaczyna się i kończy slashem i gwiazdką w odpowiedniej kolejności, interpreter wtedy ignoruje wszystko co znajduje się pomiędzy. I znów mamy trzecie wywołanie funkcji - tym razem zawartość którą zwraca wyświetli się tak jak zostało to opisane w komentarzu w ostatniej linii. Zwróć uwagę, na słowo kluczowe echo oraz to, że ciągi znaków można łączyć za pomocą kropki.