dla Początkujących
6 godz. 26 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykProgramowanie to szeroka dziedzina, która nieustannie się rozwija. Rozpoczynając naukę możemy opierać się głównie na wskazówkach bardziej doświadczonych osób, bądź autorach kursów i nauczycielach. W praktyce najważniejsze na początku jest dobre zrozumienie tego, czym jest programowanie, jakie możliwości daje oraz jakie możemy wybrać ścieżki rozwoju. W tym kursie spojrzymy na programowanie z szerokiej perspektywy, dając Ci solidne podstawy do dalszej nauki.
To kolejne trudne pytanie, na które nie ma jednoznacznej odpowiedzi. Dobra wiadomość jest taka że języki programowania, podobnie jak angielski, niemiecki czy hiszpański mają cechy wspólne. Nie oznacza to że nauka jednego, da Ci dostęp do wszystkich ale poznasz ogólne mechanizmy, które spotkasz w niemal wszystkich pozostałych technologiach. W tym kursie skupiamy się właśnie na takich obszarach, opierając przykłady o obecnie najpopularniejszy język jakim jest JavaScript.
Być może zastanawiasz się jak dokładnie wygląda praca programisty? Czym różni się front-end od back-endu i czy wysokie umiejętności analityczne są wymagane niezależnie od obszaru programowania, którym się zajmujemy? Dodatkowo samo zostanie programistą to tylko początek drogi. Możliwości jakie przed nami stoją nie tylko są ogromne, ale również nieustannie się rozwijają, stawiając przed nami nowe wyzwania.
Ten kurs podzielony jest na dwie części - teoretyczną, która przedstawi Ci szerokie spojrzenie na programowanie oraz praktyczną, w której samodzielnie będziesz w stanie przekonać się jak pisać programy z wykorzystaniem języka JavaScript - najpopularniejszego języka na świecie. To, że będziemy przerabiać przykłady w JavaScript, nie stanowi przeszkody a wręcz lepiej przygotuje Cię do pracy z innymi językami jak Python, C# czy C++ lub Kotlin. To wszystko ułatwi Ci podejmowanie decyzji dotyczących dalszej nauki i rozwoju jako programista.
W pierwszych lekcjach części praktycznej kursu dowiesz się jak skonfigurować środowisko pracy wraz z edytorem, w którym przyjdzie Ci pracować. Pomożemy Ci w dobraniu odpowiednich ustawień i wtyczek, które przyspieszą naukę i pomogą w lepszym zrozumieniu podstawowych koncepcji programistycznych. Krok po kroku dowiesz się jak przygotować środowisko i rozpocząć komfortową pracę.
Mimo, że będziemy pracować z JavaScript, posłuży nam on do przedstawienia najważniejszych koncepcji programowania w każdym innym języku. Nie będziemy uczyć się tworzenia stron i środowiska przeglądarki a jedynie przećwiczymy najważniejsze koncepcje języków programowania w środowisku konsolowym. Dzięki temu zdobyte umiejętności z łatwością przełożysz na inne języki jak Python, Java czy Swift, bo wszystkie posiadają identyczne konstrukcje, a poznać należy wyłącznie różnice.
OOP to jeden z najważniejszych paradygmatów programowania, który powinien poznać każdy aspirujący Programista. Dzięki temu będziesz mógł zdecydowanie lepiej zrozumieć możliwości i powiązania klas i obiektów, które tworzą programiści a także pisać kod, który jest prostszy i reużywalny. To koncepcja, którą także wyjaśnimy obrazowo w kursie. Oczywiście, poza teorią w kursie pokażemy Ci przykłady tworzenia funkcjonalnych klas w JavaScript.
Kolejną ważną koncepcją, którą musi znać każdy początkujący Programista jest praca z błędami - innymi słowy obsługa błędów lub debugowanie naszej aplikacji. To niezwykle ważne, bo oszczędzi Ci mnóstwa frustracji oraz wielu godzin rozpoznawania, co w kodzie nie działa poprawnie. Z kursu w praktyce dowiesz się, jak testować swoje aplikacje, łatwo wykrywać błędy i korzystać z narzędzi, które będą je dla nas wykrywać lub automatycznie poprawiać!
Ten kurs przygotowaliśmy tak, aby był fundamentem wiedzy o Programowaniu, którego używamy w wielu naszych ścieżkach na eduweb.pl. To znaczy, że kurs który masz przed sobą rozpoczyna ścieżkę Python, JavaScript, Ruby i wiele innych. Wiemy, że w sieci jest mnóstwo materiałów na temat podstaw programowania i chcieliśmy przygotować wyjątkowy kurs, który da Ci spokój w natłoku wielu informacji w sieci. Zaangażowaliśmy w to najlepszych autorów eduweb oraz naszym zdaniem jednych z najlepszych programistów w Polsce. To, co jest jednak najważniejsze - kurs omawia programowanie bardzo prostym językiem, dzięki czemu jest przystępny dla każdego!
Kurs przeznaczony jest dla osób początkujących, które stawiają swoje pierwsze kroki na scieżce programisty lub programistki. Jednak skorzystają z niego także te osoby, które myślą o nauce programowania w celu uzupełnienia innych umiejętności, na przykład internetowi przedsiębiorcy, freelancerzy, UI/UX i web designerzy. Jeżeli czujesz się zagubiony lub przytłoczony dużą ilością często sprzecznych informacji - ten materiał pozwoli Ci szerzej spojrzeć na programowanie. To z kolei przełoży się na lepsze decyzje, które będziesz podejmować w kontekście swojego rozwoju. W kursie znajdziesz wskazówki i porady dotyczące efektywnej nauki programowania, które pomogą Ci szybciej zdobyć nowe umiejętności i pracę w zawodzie. Najważniejszą z nich jest fakt, że programowanie to dynamicznie rozwijająca się dziedzina, która wymaga od Ciebie nieustannej nauki. Zatem wypracowanie odpowiednich nawyków i technik nauki jest niezwykle istotne, niezależnie od miejsca w którym aktualnie się znajdujesz.
Skoro wiesz już jak tworzyć funkcje i że
można w nich zawrzeć dowolną ilość kodu a następnie taką funkcję wywołać by ten kod
się wykonał to teraz pokaże Ci, że funkcje mogą być dużo bardziej przydatne.
Po pierwsze dlatego, że mogą zwracać
wartości a po drugie dlatego, że mogą przyjmować parametry. Więc funkcja może
stać się tak naprawdę pewnego rodzaju szablonem, do którego możemy przekazać dane,
te dane zostaną w jakiś sposób przetworzone i ta funkcja nam coś zwróci.
żeby to pokazać to na początek utworzymy
jeszcze prostą funkcję, której nadał nazwę Hello.
Ona tutaj nic nie przyjmuje ale będę
chciał nie tylko tak jak wcześniej w console.logu wykonać takie polecenie w tej
funkcji ale chciałbym żeby ona zwróciła nam string.
Więc użyjemy słowa kluczowego return aby
powiedzieć, że z tej funkcji chcemy coś zwrócić.
I tutaj powiemy Hello I teraz co to oznacza.
Stworzyliśmy taką funkcję po zapisanie nic
się nie dzieje nawet jeśli wykonamy taki program,
zauważ, że nadal nic się nie dzieje.
Ale jeżeli wywołaliśmy tą funkcję to ona zwróciła wartość Hello.
Tutaj można zwracać wszystko. Zmienne
gdybyśmy coś mieli pod zmienną to można zwrócić wartość, tablice, wszystkie rzeczy,
które w funkcji mogą być zawarte można zwrócić z tej funkcji.
Ale co to oznacza, że coś jest zwracane.
Otóż, że możemy z tego skorzystać jak z wartości.
To oznacza, że cały ten zapis
będzie tutaj zamieniony na Hello bo ta funkcja to zwraca.
Więc gdybyśmy utworzyli stałą np.
res i wywołali po tej stronie funkcję hello,
ta funkcja zwraca taki string to byłoby to dokładnie tak samo jak byśmy
tutaj wewnątrz tego res mieli właśnie taki ciąg.
Zobacz. Jeżeli teraz w console.logu będę chciał wyświetlić zawartość res, zobaczymy
Hello.
A więc z funkcji za pomocą takiego słowa można coś zwracać.
Teraz pokażę Ci, że funkcja może również
przyjmować pewne parametry. Więc jeżeli utworzymy nową funkcję, którą nazwę
add, pamiętaj cały czas, że te nazwy są dowolne tak jak w przypadku zmiennych,
add czyli dodaj,
i tutaj mogę powiedzieć, że ta funkcja powinna przyjmować pewne parametry.
To może być jeden parametr, znowu możesz je
nazywać dowolnie z tego powodu, że to jest tak jak ze zmiennymi. To będą takie lokalne
zmienne. Więc możesz to nazwać liczba 1 i potem liczba 2 itd.
Ja to nazwę a i
to by oznaczało, że ta funkcja przyjmuje jeden parametr, natomiast po przecinku
możemy powiedzieć b lub dowolną inną nazwę.
To oznacza, że ta funkcja przy swoim wywołaniu przyjmie dwa parametry.
Nazwaliśmy je a i b.
A to oznacza tylko tyle, że wewnątrz tej funkcji będziemy mieli dwie takie lokalne
zmienne, które się nazywają po prostu a i b. I teraz będę chciał zrobić rzecz
następującą, będę chciał zwrócić z tej funkcji dodawanie a + b.
Wyobraź sobie, że a to jest jakaś zmienna,
gdybyśmy tego tutaj nie mieli ale napisali byśmy const a = 1, const b = 3
no to widzisz, że mielibyśmy po prostu
jeden plus trzy to by zostało zamienione na 4 i zwrócone z tej funkcji.
Ale jeżeli tutaj nie mamy takich oto stałych tylko przyjmujemy parametry w ten
sposób to oznacza, że przy wywoływanie tej funkcji musimy je podać.
I teraz jak to zrobić. Zapiszemy sobie to znowu bo skoro ta funkcja coś zwraca to chcemy ten
wynik zapisać do stałej res i wywołamy funkcje add przekazując jej np.
1, 3.
Zauważ, że to oznacza, że wartość 1 chcemy
podstawić pod a, a wartość 3 pod b. I wewnątrz tej funkcji
te zmienne a tak naprawdę są to parametry
ale dokładnie tak jak zmienne należy je traktować, będą miały takie wartości 1 +3
więc jeżeli to dodamy to ta funkcja zwróci nam 4. Zobaczmy to sobie w konsoli.
Zauważ mamy wynik 4 więc stworzyliśmy funkcję, która jest uniwersalna bo możemy
przy jej wywoływaniu podawać sobie dowolne wartości. Mogę powiedzieć np.
5 i 6. i to nam zwróci 11
więc to jest potęga funkcji, że my w funkcji możemy mieć dowolny kod, pętle,
instrukcje warunkowe cokolwiek i możemy tej funkcji przekazywać
najróżniejsze parametry. I to co jest bardzo ważne to
wcale nie musimy przekazać liczb.
Oczywiście ta funkcja skupia się na tym że
je dodaje, ale wszystko tutaj można przekazać co w języku JavaScript jest
reprezentowalne więc możesz tu ciągi znaków przekazywać, tablice itd.
Jeśli byśmy tu przekazali tablice to pod a po prostu znalazłaby się tablica. Tak samo
jak wcześniej mieliśmy ją zapisaną w zmiennej.
Stwórzmy sobie jakąś bardziej jeszcze przydatną funkcję np.
taką, która nam zwraca wartość absolutną liczby.
Chodzi o to, że jak podamy na przykład -10 to chcemy żeby zwróciło 10.
Jak podamy 10 to też żeby to było 10 czyli po prostu wartość dodatnią takiej liczby.
Więc stworzymy funkcję function, którą nazwiemy abs jak wartość absolutna
i ona będzie przyjmować parametr, który nazwę value.
Cały czas tutaj uczulał na to, że ta nazwa
jest dowolna, możesz ją nazwać jak chcesz i te nazwy
tutaj też są dowolne bo są to tak jakby
nazwy zmiennych, które ty tworzysz. I teraz co będziemy chcieli zrobić. Tu
będziemy chcieli mieć troszkę więcej logiki niż w tej funkcji powyżej,
mianowicie będziemy chcieli sprawdzić czy przekazana przez kogoś do tej funkcji
wartość jest mniejsza od zera czyli czy jest to wartość ujemna.
Jeżeli tak to będziemy ją chcieli zamienić na wartość dodatnią.
I teraz jak to zrobić.
Jeżeli ktoś by nam przekazał,
tutaj mogę to policzyć na przykład -5
to jak to zamienić na wartość dodatnią? otóż trzeba to pomnożyć przez -1.
I to da nam wtedy piątkę.
Więc w takim przypadku jeżeli wartość jest
mniejsza od zera chcemy zwrócić, zróbmy tutaj return w tej funkcji
value razy -1. Natomiast w przeciwnym wypadku moglibyśmy powiedzieć else jeżeli
ktoś przekazał wartość, która nie jest mniejsza od zera np.
piątkę no to wartością absolutną będzie
również piątka a więc wtedy zwracamy nie zmodyfikowaną wartość w taki oto sposób.
Natomiast teraz Ci powiem o jednej bardzo ważnej rzeczy, nie musimy tu mieć bloku else.
Dlaczego? Dlatego, że polecenie return kończy funkcję. Podobnie jak w przypadku
pętli mieliśmy break to to zakończało funkcję czy continue, może pamiętasz
przechodziło do kolejnej iteracji pętli i nic co jest poniżej się nie wykonywało.
Więc jeżeli tutaj ten warunek będzie
prawdziwy i powiemy return to to słowo sprawia, że ta funkcja zwraca wartość, którą
tutaj podaliśmy i na pewno nie wykona już nic co jest poniżej tego słowa.
A więc w takim przypadku jeśli return się wykona
nie ma problemu, ten drugi się nie wykona na pewno. Natomiast jeżeli wartość nie
będzie mniejsza od -1 ta linijka się wtedy nie wykona i wykona się ta linijka.
Możemy teraz bez przechwytywania tego do zmiennej czy stałej od razu powiedzieć
console.log wywołać sobie naszą funkcję i podać jej wartość np.
-10, zapiszemy
i widzimy tutaj, że jest to 10 Więc wszystko działa poprawnie.
I teraz znowu tu może to wyglądać dziwnie
ale należy na to patrzeć tak, że tu wywołaliśmy funkcję i to co ona zwróci czyli
10 to dopiero przekazaliśmy do console.loga.
Mogliśmy to oczywiście przechwycić w zmiennej np.
res2, wtedy mielibyśmy w tej zmiennej taką wartość i moglibyśmy ją tutaj podstawić.
To jest dokładnie tak samo ale jeżeli tej zmiennej nie potrzebuje czy tej stałej
żeby z niej korzystać później to mogę bezpośrednio do console.loga ale nie tylko,
oczywiście do każdej innej funkcji również to przekazać. Język JavaScript jakby tutaj o to nie
dba. Nie ma znaczenia, po prostu to zostanie zamienione na wartość jaką zwraca ta funkcja
i następnie zostanie to podstawione do console.loga.
I jeszcze jedna bardzo ważna uwaga. W
przypadku języka JavaScript jeżeli funkcja by nic nie zwróciła
czyli gdybyśmy powiedzieli po prostu return i nic tutaj nie podali, albo jeżeli
by w ogóle nie było tego return, to wtedy funkcja domyślnie zwraca undefined.
Czyli gdybyśmy wywołali taką funkcję i podali jej wartość 10
wiemy, że ten warunek się tutaj nie wykona czyli nie zwrócimy 10 razy -1
więc przejdziemy niżej i skoro ta funkcja nic nie zwraca to domyślnie zwraca
undefined. I o tym warto pamiętać.
Zazwyczaj jednak powinniśmy z funkcji coś zwracać.
Oczywiście to zależy od tego jaka to jest
funkcja ale zapamiętaj, że jak nic nie zwrócimy to funkcja zwraca
undefined lub jeżeli zrobimy return i nic tutaj nie podamy.
Ok. Na koniec chciałbym Ci pokazać jeszcze
jedną rzecz, a mianowicie przerobić jeden z przykładów, który mieliśmy na funkcję żebyś
jeszcze lepiej zobaczył do czego te funkcje cały czas mogą nam się przydawać.
Więc ja tutaj teraz wkleję fragment znanego nam już kodu,
wrzucę to tutaj i zrobię trochę miejsca w ten sposób.
Być może to pamiętasz może jeszcze tutaj
zrobimy trochę miejsca, w przypadku pętli pokazywałem Ci jak można w
tablicy wyszukać czy znajduje tam się zero.
Oczywiście to było po to żeby pokazać Ci jak działa break.
Mamy trochę prostsze sposoby na to aby wyszukiwać elementów w tablicach, ale to
nie jest teraz istotne. Ale mieliśmy jakąś tablicę
i potem tworzyliśmy taką zmienną containsZero sprawdzaliśmy czy to zero tam jest
i na tym etapie tutaj wywołania w containsZero
mieliśmy true lub false czy w tej tablicy znajduje się zero.
Pokażę Ci teraz jak możemy to wszystko
zawrzeć w reużywanej funkcji i wywoływać ją tyle razy ile chcemy.
Zobacz wszystko to co tutaj mamy ja sobie wytnę
oprócz naszej tablicy i stworzę funkcję, którą nazwiemy po prostu contains.
I ta funkcja będzie przyjmowała dwa parametry.
Pierwszy to będzie tablica więc ja ją
nazwę arr ale możesz to nazywać jak chcesz,
a druga to będzie rzecz, której szukamy czyli np.
może to nazwiemy po prostu item jak rzecz.
Czyli do tej funkcji będziemy podawać
tablice taką jak wyżej i rzecz, której szukamy w tej tablicy.
Teraz jeżeli to tutaj wstawie
sformatujemy tu trochę lepiej, to znowu utworzymy sobie tutaj zmienną containsZero,
w zasadzie nie nazwiemy jej containsZero tylko
może po prostu found czy zostało coś znalezione.
Teraz będziemy chcieli iterować no właśnie po czym? Już nie po numbers
ale po tym co nam ktoś przekaże czyli będzie to arr
tego console.loga tu nie musimy robić.
Tutaj też to musimy podstawić, podmienić
na arr, nie martw się za moment to wytłumaczę i containsZero zamienimy na found.
Na końcu będę chciał zrobić return found.
Czyli żeby zwrócić wartość tej zmiennej ona będzie miała albo false albo tutaj true.
I po co to numbers nam jest potrzebne? Po to, że
teraz będziemy chcieli zrobić sobie coś takiego np.
rezultat trzeci i wywołamy naszą funkcję contains
i zobacz, że ona przyjmuje dwa parametry.
Pierwszy jest to tablica, w której chcemy szukać więc możemy tą tablicę tu wpisać
ręcznie albo skoro mamy ją pod stałą numbers to ją tutaj przekażmy, numbers
przecinek i musimy podać drugi parametr a więc rzecz, której szukamy.
My wcześniej szukaliśmy czy w takiej
tablicy znajduje się zero. Więc podam tutaj zero. Zapisałem to w res3
i jeśli zrobię console.log(res3) mamy true bo w tej tablicy zero się znajduje.
Natomiast teraz będę chciał Ci jeszcze
wytłumaczyć co tutaj się tak naprawdę stało.
Na tym etapie możesz zapomnieć tutaj o tym numbers bo wcale nie musi być tutaj,
to nie jest takie istotne,
tutaj zrobię również trochę miejsca,
zapiszmy to i teraz tak, wywołujemy funkcje contains przekazując jej tablicę.
Ta tablica wpada pod nazwany parametr arr,
który my nazwaliśmy, natomiast zero wpada pod item i teraz widzę jeszcze tutaj błąd bo my
tutaj porównywaliśmy do zera a żeby to było dynamiczne trzeba porównać do item.
Więc jeszcze raz,
numbers to jest tablica, którą tu mamy,
ona znajdzie się pod arr.
Czyli w całej tej funkcji w środku pod zmienną arr będzie numbers bo to właśnie
przekazaliśmy a pod item będzie zero, które przekazaliśmy. I tu wykonujemy sobie to
sprawdzenie, które mieliśmy wcześniej więc wyszukujemy
czy w tej przekazanej tablicy znajduje się item.
Jeżeli tak to zmienną found ustawiamy na true.
Na samym końcu zwracamy zmienną found czyli
tak naprawdę zwracamy wartość true lub false. I stworzyliśmy dzięki temu tablicę
czy w zasadzie funkcję, która jest bardzo dynamiczna bo możemy przekazać jej tablicę
i zapytać czy tam jest zero i nam zwróci true lub false.
Ale równie dobrze możemy zapytać czy tam
jest szóstka zmieniając tylko ten jeden parametr.
Jeżeli zapisze nadal jest true ale jak
zapytam czy jest tam 99 zwróci mi false bo nic takiego tam nie ma.
Zauważ, że w ten sposób jeżeli zapomnimy o tej funkcji ale mamy ją zdefiniowaną
możemy łatwo sprawdzić. Wywołujemy contains podajemy tablicę i rzecz, której szukamy i
całe to wyrażenie zwróci nam tutaj do zmiennej true lub false w zależności od tego
czy w tej tablicy znajduje się taka oto liczba, którą podaliśmy.
Jak widzisz funkcje są bardzo przydatne bo pozwalają nam również przyjmować jakieś
parametry wykonywać na nich operacje i je zwracać.
I w funkcji możemy zawrzeć wszystko co do tej pory robiliśmy czyli pętle tworzenie
zmiennych, takich lokalnych tutaj wewnątrz, instrukcje warunkowe itd.
I funkcje pozwalają nam zapisać kawałek
logiki i używać go ponownie. Mogliśmy raz tutaj użyć contains, w kolejnej linijce
mógłbym podać inną tablicę albo tą samą i
zapytać czy tam jest jakaś inna liczba itd.
To jednak jeszcze nie wszystko bo w
kolejnej lekcji porozmawiamy sobie o zakresie zmiennych.