Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00054 006142 19007375 na godz. na dobę w sumie
Kotlin. Rusz głową! - książka
Kotlin. Rusz głową! - książka
Autor: , Liczba stron: 472
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-5869-0 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> java - programowanie
Porównaj ceny (książka, ebook (-30%), audiobook).

Kariera Kotlina nabrała rozpędu, gdy w 2017 roku na konferencji Google ogłoszono go jednym z oficjalnie wspieranych języków programowania aplikacji dla Androida. Jest lubiany za zwartą składnię, elastyczność i ścisłą integrację z kodem Javy. Oczywiście odpowiada też kryteriom nowoczesnego i innowacyjnego języka programowania. Jest bardzo dobrym wyborem dla każdego, kto chce się stać profesjonalnym programistą, ale też osoby programujące hobbystycznie będą zadowolone z jego możliwości. Problemów z tym idealnym językiem programowania jest niewiele: trzeba poznać Kotlina, zrozumieć kilka niuansów i nauczyć się kodowania...

Ta książka, podobnie jak inne pozycje z serii Rusz głową!, została przygotowana zgodnie z jedyną w swoim rodzaju metodyką nauczania wykorzystującą zasady funkcjonowania ludzkiego mózgu. Dzięki niej nauczysz się myśleć jak najlepsi programiści i niepostrzeżenie zaczniesz tworzyć wydajny kod w Kotlinie. Autorzy zastosowali najlepsze osiągnięcia psychologii, neurologii i innych nauk o uczeniu się, stąd niecodzienny wygląd i struktura książki. W efekcie zamiast klasycznego podręcznika otrzymujesz polisensoryczne doświadczenie poznawcze zaprojektowane tak, aby już wkrótce Kotlin stał się pewnym, niezawodnym narzędziem w Twoich rękach!

W tej książce między innymi:

Kotlin: oto radość z pisania kodu!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Head First Kotlin: A Brain-Friendly Guide Tłumaczenie: Piotr Rajca ISBN: 978-83-283-5869-0 © 2020 Helion SA Authorized Polish translation of the English edition of Head First Kotlin ISBN 9781491996690 © 2019 Dawn Griffiths and David Griffiths. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/kotrug Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści (podsumowanie) Wprowadzenie Zaczynamy. Szybki skok Typy proste i zmienne. Być zmienną Funkcje. Wychodzimy poza main Klasy i obiekty. Trochę klasy Klasy pochodne i bazowe. Stosowanie dziedziczenia Klasy abstrakcyjne i interfejsy. Poważny polimorfizm Klasy danych. Używanie danych 1 2 3 4 5 6 7 8 Wartość null i wyjątki. Cały i zdrów 9 10 Typy sparametryzowane. Odróżniaj wariancję od kontrawariancji 11 Lambdy i funkcje wyższego rzędu. Kod używany jak dane 12 Wbudowane funkcje wyższego rzędu. Wzmocnij swój kod A Koprocedury. Współbieżne wykonywanie kodu B C Kolekcje. Zorganizuj się Testowanie. Pociągnij swój kod do odpowiedzialności Pozostałości. Dziesięć najważniejszych rzeczy (których nie opisaliśmy) Spis treści xxi 1 31 59 91 121 155 191 219 251 289 325 363 397 409 415 Spis treści (z prawdziwego zdarzenia) Wprowadzenie Twój mózg myśli o Kotlinie. Choć Ty starasz się czegoś nauczyć, Twój mózg robi Ci przysługę, dbając o to, by te informacje się nie utrwaliły. Twój mózg myśli sobie: „Lepiej zostawię miejsce na coś naprawdę ważnego, na przykład: jakich dzikich zwierząt lepiej unikać albo dlaczego jeżdżenie na snowboardzie nago nie jest najlepszym pomysłem”. A zatem jak możesz oszukać swój mózg, by myślał, że Twoje życie zależy od nauczenia się programowania w Kotlinie? Dla kogo jest przeznaczona ta książka? Wiemy, co sobie myślisz Wiemy, co sobie myśli Twój mózg Metapoznanie — myślenie o myśleniu Oto co zrobiliśmy Przeczytaj to Zespół recenzentów technicznych Podziękowania xxii xxiii xxiii xxv xxvi xxviii xxx xxxi v Poleć książkęKup książkę Spis treści 1 Zaczynamy Szybki skok Kotlin robi dużo szumu. Od momentu pojawienia się pierwszej wersji Kotlina język ten urzekł programistów swoją przyjazną składnią, spójnością, elastycznością oraz możliwościami. W tej książce nauczymy Cię pisać w Kotlinie własne aplikacje, a zaczniemy od pokazania, jak stworzyć i uruchomić prosty program. Po drodze przedstawimy podstawy składni Kotlina, takie jak instrukcje, pętle oraz konstrukcje warunkowe. Twoja podróż właśnie się zaczyna… Witamy w Kotliczynie Kotlina można używać niemal wszędzie Co zrobimy w tym rozdziale Instalowanie IntelliJ IDEA (Community Edition) Stwórzmy prostą aplikację Właśnie utworzyłeś swój pierwszy projekt w Kotlinie Dodaj do projektu nowy plik Kotlina Anatomia funkcji main Dodaj funkcję main do pliku App.kt Jazda próbna Co możemy nakazać w funkcji main? W kółko i w kółko, i w kółko… Przykład pętli Rozgałęzienia warunkowe Używanie if do zwracania wartości Aktualizujemy funkcję main Stosowanie interaktywnej powłoki Kotlina W REPL można wpisywać fragmenty mające wiele wierszy kodu Wymieszane komunikaty Twój przybornik do Kotlina 2 3 4 7 8 11 12 13 14 15 16 17 18 19 20 21 23 24 27 30 Możliwość wyboru platformy docelowej, na którą zostanie skompilowany kod napisany w Kotlinie, oznacza, że można go uruchamiać na serwerach, w chmurze, w przeglądarce, na urządzeniach mobilnych i nie tylko. IntelliJ IDEA vi Poleć książkęKup książkę 2 Typy proste i zmienne Być zmienną Jest takie coś, od czego zależy każdy kod — zmienne. W tym rozdziale zajrzymy za kulisy i pokażemy Ci, jak naprawdę działają zmienne w Kotlinie. Poznasz w nim proste typy danych, takie jak Int, Float oraz Boolean, i dowiesz się, jak kompilator Kotlina może inteligentnie wywnioskować typ zmiennej na podstawie wartości, którą jej przypiszemy. Dowiesz się także, jak można używać szablonów łańcuchowych do tworzenia złożonych łańcuchów przy wykorzystaniu krótkiego kodu oraz jak tworzyć tablice, w których będzie można przechowywać wiele wartości. I w końcu dowiesz się także, jak wielkie znaczenie dla życia w Kotliczynie mają obiekty. Twój kod potrzebuje zmiennych Co się dzieje, kiedy zadeklarujesz zmienną? Zmienna zawiera referencję do obiektu Typy proste Kotlina Jak jawnie zadeklarować typ zmiennej? Używaj wartości dostosowanej do typu zmiennej Przypisywanie wartości innej zmiennej Trzeba skonwertować wartość Co się dzieje podczas konwertowania wartości? Uważaj na przepełnienie Zapisywanie wielu wartości w tablicy Tworzymy aplikacje HasłoMator Dodaj kod do pliku HasloMator.kt Kompilator domyśla się typu tablicy na podstawie jej wartości var oznacza, że zmienna może wskazywać na inną tablicę val oznacza, że zmienna zawsze będzie wskazywać tę samą tablicę… Zamotane referencje Twój przybornik do Kotlina 32 33 34 35 37 38 39 40 41 42 45 46 47 49 50 51 54 58 Byte Short Int Long R EF x var Int 5 Int vii Spis treściPoleć książkęKup książkę 3 Funkcje Wychodzimy poza main Czas zrobić kolejny krok i poznać funkcje. Jak na razie cały kod, który pisałeś, był umieszczany wewnątrz funkcji main. Jednak chcąc pisać kod, który będzie lepiej zorganizowany i łatwiejszy do utrzymania, musisz nauczyć się, jak dzielić kod na części i umieszczać go w odrębnych funkcjach. W tym rozdziale nauczysz się, jak pisać funkcje oraz jak prowadzić interakcje z aplikacją, a wszystko to w ramach tworzenia gry! Dowiesz się także, jak pisać zwarte funkcje jednowyrażeniowe. W tym rozdziale zobaczysz także, jak przeglądać zakresy i kolekcje, używając potężnej pętli for. 60 61 63 64 65 66 67 68 75 76 78 79 81 83 87 89 Napiszmy grę: Kamień, nożyce, papier Ogólny projekt gry Wybieranie opcji przez grę Jak się tworzy funkcje? Do funkcji można przekazywać więcej informacji Pobieranie informacji z funkcji Funkcje, których ciałem jest jedno wyrażenie Dodajemy funkcję getGameChoice do pliku Game.kt Funkcja getUserChoice Jak działają pętle for? Zapytaj gracza, jaką opcję wybiera Pomieszane komunikaty Musimy sprawdzić dane wpisane przez gracza Dodajemy getUserChoice do pliku Game.kt Dodajemy funkcję printResult do pliku Game.kt Twój przybornik do Kotlina „Kamień” „Papier” String String R EF 0 R EF 1 R EF 2 „Nożyce” String R EF options val Array String viii Spis treściPoleć książkęKup książkę Spis treści 4 Klasy i obiekty Trochę klasy Nadszedł czas, byśmy przestali ograniczać się do prostych typów Kotlina. Wcześniej czy później nadejdzie czas, kiedy zechcesz użyć czegoś więcej niż jedynie typów prostych Kotlina. I właśnie w tym momencie pojawiają się klasy. Klasy są wzorcami pozwalającymi na tworzenie własnych typów obiektów i definiowanie ich właściwości oraz funkcji. W tym rozdziale dowiesz się, jak projektować i definiować klasy oraz jak używać ich do tworzenia nowych typów obiektów. Przy okazji spotkasz konstruktory, bloki inicjalizatora, akcesory get i set oraz dowiesz się, jak można ich używać do zabezpieczania właściwości. W końcu dowiesz się także, że ukrywanie danych jest wbudowane w cały kod pisany w Kotlinie, co oszczędza nam czasu, wysiłku i mnóstwa pisania na klawiaturze. Jedna klasa Dog name weight breed bark() Wiele obiektów Typy obiektowe są definiowane przy użyciu klas Jak projektować własne klasy? Zdefiniujmy klasę Dog Jak utworzyć obiekt Dog? Jak można odwoływać się do właściwości i funkcji? Tworzymy aplikację Piosenki Cud tworzenia obiektu Jak są tworzone obiekty? Za kulisami: Wywoływanie konstruktora Dokładniejsze poznawanie właściwości Elastyczna inicjalizacja właściwości Jak używać bloków inicjalizatora? Właściwości MUSZĄ zostać zainicjowane Jak można weryfikować wartości właściwości? Pisanie własnego akcesora get Pisanie własnego akcesora set Kompletny kod projektu Psy Twój przybornik do Kotlina R EF myDog name: “Azor” weight: 70 breed: “mieszaniec” Dog Dog name weight breed bark() 92 93 94 95 96 97 98 99 100 105 106 107 108 111 112 113 115 120 ix Poleć książkęKup książkę Spis treści 5 Klasy pochodne i bazowe Stosowanie dziedziczenia Czy kiedykolwiek zdarzyło Ci się uznać, że jakiś obiekt byłby wprost idealny do Twoich celów, gdyby tylko zmienić w nim parę rzeczy? No cóż, to jest właśnie jedna z zalet dziedziczenia. W tym rozdziale pokażemy Ci, jak można tworzyć klasy pochodne i dziedziczyć właściwości i funkcje po klasach bazowych. Dowiesz się w nim, jak przesłaniać funkcje i właściwości, aby Twoje klasy działały tak, jak sobie tego życzysz, a przy okazji uzyskasz wiedzę na temat tego, kiedy to będzie właściwe (a kiedy nie). I w końcu przekonasz się, jak dziedziczenie pomaga w unikaniu powielania kodu oraz jak dzięki polimorfizmowi można poprawiać elastyczność. 122 Dziedziczenie umożliwia unikanie powielania kodu 123 Co mamy zamiar zrobić? 124 Projektujemy strukturę dziedziczenia klas zwierząt 125 Używaj dziedziczenia, by unikać powielania kodu w klasach pochodnych 126 Co powinny przesłaniać klasy pochodne? 127 Możemy pogrupować niektóre zwierzęta 128 Dodajemy klasy Canine i Feline 129 Sprawdzaj hierarchie klas, używając testu JEST 130 Test JEST działa w dowolnym miejscu drzewa dziedziczenia Stworzymy parę kotliczyńskich zwierząt 133 Deklarujemy klasę bazową oraz jej właściwości i funkcje jako otworzone 134 135 Jak klasa pochodna dziedziczy po bazowej? Jak (i kiedy) przesłaniać właściwości? 136 Przesłanianie właściwości pozwala na więcej niż tylko określanie wartości domyślnych Jak przesłaniać funkcje? Przesłonięte funkcje i właściwości pozostają otworzone… Dodajemy klasę Hippo do projektu Zwierzęta Dodajemy klasy Canine i Wolf Która funkcja zostanie wywołana? Kiedy wywołujemy funkcję na rzecz zmiennej, wywoływana jest funkcja obiektu Typów bazowych można używać w parametrach funkcji i jako typu zwracanego wyniku Zaktualizowany kod pliku Animals.kt Twój przybornik do Kotlina 137 138 139 140 143 144 146 147 148 153 Animal image food habitat hunger makeNoise() eat() roam() sleep() Canine roam() Wolf image food habitat makeNoise() eat() Hippo image food habitat makeNoise() eat() x Poleć książkęKup książkę Spis treści 6 Klasy abstrakcyjne i interfejsy Poważny polimorfizm Hierarchia dziedziczenia klasy bazowej to dopiero początek. Jeśli chcesz w pełni wykorzystać możliwości, jakie zapewnia polimorfizm, musisz zacząć projektować, używając klas abstrakcyjnych i interfejsów. W tym rozdziale odkryjesz, jak używać klas abstrakcyjnych, by kontrolować klasy projektowanej hierarchii i określać, które z nich będą pozwalać na tworzenie obiektów, a które nie. Przekonasz się, w jaki sposób mogą one wymuszać, by klasy pochodne dostarczały własne implementacje funkcji. Dowiesz się także, jak używać interfejsów do współdzielenia zachowań pomiędzy niezależnymi klasami. Przy okazji przekonasz się także, czym są: is, as oraz when. (interface) Roamable roam() Vehicle roam() Wiesz, że jestem wilkiem, więc traktuj mnie jak wilka! R EF item val Roamable Wolf Hierarchia klasy Animal raz jeszcze Obiektów niektórych klas po prostu nie powinno się tworzyć Abstrakcyjna czy konkretna? Klasy abstrakcyjne mogą mieć abstrakcyjne właściwości i funkcje Klasa Animal ma dwie funkcje abstrakcyjne Jak zaimplementować klasę abstrakcyjną? TRZEBA zaimplementować wszystkie abstrakcyjne właściwości i funkcje Zaktualizujmy kod projektu Zwierzęta Niezależne klasy mogą mieć wspólne zachowania Interfejsy pozwalają definiować wspólne zachowania POZA hierarchią klasy bazowej Zdefiniujmy interfejs Roamable Jak definiować właściwości w interfejsach? Zadeklaruj, że klasa implementuje interfejs… Jak implementować wiele interfejsów? Jak określić, czy stworzyć klasę, klasę pochodną, klasę abstrakcyjną czy interfejs? Aktualizujemy projekt Zwierzęta Interfejsy pozwalają na stosowanie polimorfizmu Gdzie używać operatora is? Używaj when do porównywania zmiennej z grupą opcji Operator is zazwyczaj wykonuje inteligentne rzutowanie Używaj operatora as w celu jawnego rzutowania Aktualizujemy projekt Zwierzęta Twój przybornik do Kotlina 156 157 158 159 160 162 163 164 169 170 171 172 173 174 175 176 181 182 183 184 185 186 189 xi Poleć książkęKup książkę Klasy danych Używanie danych Nikt nie chce spędzać życia na ponownym wymyślaniu koła. Większość aplikacji zawiera klasy, których jedynym zadaniem jest przechowywanie danych. Dlatego, aby ułatwić nam życie, twórcy Kotlina wymyślili pojęcie klas danych. W tym rozdziale dowiesz się, jak klasy danych pozwalają na pisanie kodu, który jest bardziej przejrzysty i zwięzły, niż mógłbyś to sobie wyobrazić. Poznasz w nim także funkcje pomocnicze klas danych i dowiesz się, jak przeprowadzać destrukturyzację obiektów danych na poszczególne komponenty. A w międzyczasie dowiesz się, w jaki sposób domyślne wartości parametrów pozwalają pisać bardziej elastyczny kod, i poznasz Any — matkę wszystkich klas bazowych. Operator == wywołuje funkcję o nazwie equals Funkcja equals pochodzi z klasy bazowej Any Wspólne zachowania zdefiniowane w klasie Any Możemy chcieć, by funkcja equals sprawdzała, czy obiekty są równoważne Klasa danych pozwala na tworzenie obiektów danych Klasy danych przesłaniają odziedziczone zachowania Kopiowanie obiektów danych przy użyciu funkcji copy Klasy danych definiują funkcje componentN… Tworzymy projekt Przepisy Pomieszane komunikaty Wygenerowane funkcje używają jedynie właściwości zdefiniowanych w konstruktorze Inicjalizowanie wielu właściwości może powodować powstawanie kłopotliwego kodu Jak używać domyślnych wartości konstruktora? Także funkcje mogą używać wartości domyślnych Przeciążanie funkcji Zaktualizujmy projekt Przepisy Ciąg dalszy kodu… Twój przybornik do Kotlina 192 193 194 195 196 197 198 199 201 203 205 206 207 210 211 212 213 217 Spis treści 7 Any equals() hashCode() toString() ... ToTwojaKlasa Domyślnie funkcja equals sprawdza, czy dwa porównywane obiekty są w rzeczywistości tym samym faktycznym obiektem. xii Poleć książkęKup książkę 8 Wartość null i wyjątki Cały i zdrów Nikt nie chce pisać kodu, który nie będzie bezpieczny. Na szczęście mamy doskonałą wiadomość: Kotlin został zaprojektowany pod kątem bezpieczeństwa kodu. Zaczniemy od pokazania Ci, dlaczego stosowanie w Kotlinie typów akceptujących wartości puste oznacza, że podczas swojego pobytu w Kotliczynie prawie nigdy nie będziesz miał do czynienia z wyjątkami NullPointerException. Dowiesz się także, jak wykonywać bezpieczne wywołania oraz jak to się dzieje, że dostępny w Kotlinie operator Elvis pozwoli Ci spać spokojnie. A kiedy już skończymy z wartościami pustymi, dowiesz się, jak zgłaszać i obsługiwać wyjątki jak stary wyjadacz. Dziękuję bardzo. ? : To jest operator Elvis. SPRÓBUJĘ wykonać ten ryzykowny kod, ale PRZECHWYCĘ się, gdyby mi się nie udało. Jak usuwać ze zmiennych referencje do obiektu? Referencje usuwamy, używając null Typów akceptujących null możesz używać wszędzie tam, gdzie typów, które null nie akceptują Jak utworzyć tablice typu akceptującego null? Jak odwoływać się do funkcji i właściwości typów akceptujących null? Dbaj o bezpieczeństwo, używając bezpiecznych wywołań Bezpieczne wywołania można łączyć w łańcuch Ciąg dalszy historii… Bezpiecznych wywołań można używać do przypisywania wartości… Używaj let, by wykonywać kod, jeśli wartości będą różne od null Stosowanie let z elementami tablic Zamiast używać wyrażenia if… Operator !! celowo zgłasza wyjątek NullPointerException Tworzymy projekt Wartości Null Ciąg dalszy kodu… Wyjątki są zgłaszane w wyjątkowych sytuacjach Przechwytuj wyjątki, używając try i catch Użyj finally, by określić czynności, które mają być wykonane zawsze Wyjątek to obiekt typu Exception Wyjątki można zgłaszać jawnie Try i catch to wyrażenia Twój przybornik do Kotlina 220 221 222 223 224 225 226 227 228 231 232 233 234 235 236 239 240 241 242 244 245 250 xiii Spis treściPoleć książkęKup książkę 9 Kolekcje Zorganizuj się! Czy kiedykolwiek marzyłeś o czymś elastyczniejszym niż tablice? Kotlin udostępnia sporo użytecznych kolekcji zapewniających większą elastyczność i kontrolę nad sposobami przechowywania i zarządzania grupami obiektów. Może przydałaby Ci się lista o zmiennej wielkości, do której bezustannie mógłbyś dodawać nowe elementy? A może chciałbyś mieć możliwość sortowania kolekcji albo zapisywania jej elementów w odwrotnej lub losowej kolejności? Może chciałbyś móc odnajdywać elementy na podstawie nazwy? A może potrzebujesz kolekcji, która będzie automatycznie odnajdywać i usuwać duplikaty bez najmniejszej ingerencji z Twojej strony? Jeśli chciałbyś zyskać takie możliwości, a nawet jeszcze większe, to czytaj dalej… Znajdziesz tu wszystkie informacje… R E F R E F R E F 0 1 2 List String String “Herbata” “Kawa” Kolekcje typu List pozwalają na występowanie duplikatów. “WartośćA” “WartośćB” R E F R E F R E F “KluczA” “KluczB” “KluczC” Map Kolekcje typu Map pozwalają na występowanie powtarzających się wartości, ale nie powtarzających się kluczy. xiv Tablice mogą być przydatne… …są jednak rzeczy, których tablice nie potrafią Jeśli masz wątpliwości, sięgnij do Biblioteki List, Set oraz Map Fantastyczne listy… Tworzenie listy MutableList… Możemy usunąć wartość… Można zmieniać kolejność i operować na większych grupach elementów… Utwórz projekt Kolekcje Listy dopuszczają duplikaty Jak tworzyć zbiory? Jak zbiory wyszukują duplikaty? Kody mieszające i równość Reguły przesłaniania funkcji hashCode i equals Jak używać klasy MutableSet? Aktualizujemy projekt Kolekcje Czas na mapy Sposoby korzystania z map Tworzenie map MutableMap Z mapy MutableMap można usuwać elementy Mapy Map i MutableMap można kopiować Kompletny kod projektu Kolekcje Wymieszane komunikaty Twój przybornik do Kotlina 252 253 254 255 256 257 258 259 260 263 264 265 266 267 268 270 276 277 278 279 280 281 285 287 Spis treściPoleć książkęKup książkę Spis treści 10 Typy sparametryzowane Odróżniaj wariancję od kontrawariancji Każdy lubi kod, który jest spójny. A jednym ze sposobów pisania spójnego kodu, który będzie bardziej odporny na problemy, jest stosowanie typów sparametryzowanych. W tym rozdziale przyjrzymy się, w jaki sposób kolekcje Kotlina korzystają z typów sparametryzowanych, by uchronić nas przed zapisywaniem obiektów Kapusta w kolekcjach typu List Mewa . Dowiesz się, jak i kiedy pisać własne klasy, interfejsy i funkcje sparametryzowane oraz jak ograniczyć typ parametru do konkretnej klasy bazowej. I w końcu dowiesz się także, jak używać kowariancji i kontrawariancji, by SAMEMU kontrolować zachowania typów sparametryzowanych. W razie zastosowania typów sparametryzowanych obiekty są zapisywane W kolekcji jedynie jako referencje do obiektów typu Duck… Duck Duck Duck Duck MutableList Duck Duck Duck Duck Duck …i są odczytywane z kolekcji także jako referencje do obiektów typu Duck. Vet T: Pet treat(t: T) Kolekcje używają typów sparametryzowanych Jak jest zdefiniowany typ MutableList? Stosowanie parametrów typów w MutableList Co można robić ze sparametryzowanymi klasami i interfejsami? Oto co mamy zamiar zrobić Tworzymy hierarchię klasy Pet Definiujemy klasę Contest Dodajemy właściwość scores Tworzymy funkcję getWinners Tworzymy kilka obiektów Contest Tworzymy projekt TypySparametryzowane Hierarchia typu Retailer Definiujemy interfejs Retailer Możemy tworzyć obiekty CatRetailer, DogRetailer i FishRetailer… Użyj out, by typ sparametryzowany był kowariantny Aktualizujemy projekt TypySparametryzowane Potrzebujemy klasy Vet Tworzenie obiektów Vet Użyj in, by typ sparametryzowany był kontrawariantny Typ sparametryzowany może być lokalnie kontrawariantny Aktualizujemy projekt TypySparametryzowane Twój przybornik do Kotlina 290 291 292 293 294 295 296 297 298 299 301 305 306 307 308 309 313 314 315 316 317 324 xv Poleć książkęKup książkę Spis treści 11 Lambdy i funkcje wyższego rzędu Kod używany jak dane Chciałbyś pisać kod, który jest jeszcze bardziej potężny i elastyczny? Jeśli chcesz, będziesz do tego celu potrzebował lambd. Lambdy, czy też wyrażenia lambda, to bloki kodu, które można przekazywać jak zwyczajne obiekty. W tym rozdziale dowiesz się, jak definiować lambdy, jak zapisywać je w zmiennych oraz jak je wykonywać. Dowiesz się także o typach funkcyjnych oraz w jaki sposób pomagają one w tworzeniu funkcji wyższego rzędu, czyli funkcji, których parametrami lub wartościami wynikowymi są lambdy. Przy okazji przekonasz się także, że nieco syntaktycznego cukru może osłodzić Twoje programistyczne życie. Prezentacja lambd Jak wygląda kod lambdy? Lambdy można zapisywać w zmiennych Wyrażenia lambda mają typ Kompilator może wywnioskować typ parametrów lambdy Używaj lambdy dostosowanej do typu zmiennej Tworzenie projektu Lambdy Możesz przekazać lambdę do funkcji Wywołanie lambdy w ciele funkcji Co się dzieje podczas wywołania funkcji? Lambdę można przenieść poza nawiasy ()… Aktualizujemy projekt Lambdy Funkcje mogą zwracać lambdy Piszemy funkcję, która pobiera I zwraca lambdy Jak można używać funkcji combine? Użyj typealias, by nadać inną nazwę istniejącemu typowi danych Aktualizujemy kod projektu Twój przybornik do Kotlina 326 327 328 331 332 333 334 339 340 341 343 344 347 348 349 353 354 361 λ Kg na funty λ Funty na tony amerykańskie Napiszemy funkcję, która łączy dwa wyrażenia lambda w jedno. combine() λ Kg na tony amerykańskie Mam dwa parametry typu Int o nazwach x i y. Zwracam sumę ich wartości. { x: Int, y: Int - x + y } λ Lambda xvi { it + 5 } λ (Int) - Int R EF add Five val (Int) - Int Poleć książkęKup książkę Spis treści 12 Wbudowane funkcje wyższego rzędu Wzmocnij swój kod Kotlin zawiera wiele wbudowanych funkcji wyższego rzędu. A w tym rozdziale przedstawimy kilka najbardziej użytecznych spośród nich. Zapoznasz się tu z elastyczną rodziną funkcji filter i dowiesz, jak mogą Ci pomóc w ograniczaniu rozmiarów kolekcji. Dowiesz się, jak przekształcać kolekcje, używając funkcji map, jak przeglądać wszystkie elementy kolekcji, używając funkcji forEach oraz jak grupować elementy kolekcji, używając funkcji groupBy. Użyjesz nawet funkcji fold do wykonywania złożonych obliczeń w jednym wierszu kodu. Pod koniec tego rozdziału będziesz potrafił pisać kod, który będzie potężniejszy, niżbyś kiedykolwiek przypuszczał. Kotlin udostępnia sporo funkcji wyższego rzędu Funkcje min i max operują na prostych typach danych Bliższe spojrzenie na parametry funkcji minBy i maxBy Funkcje sumBy i sumByDouble Tworzymy projekt Spożywczak Poznaj funkcję filter Używaj funkcji map, by przekształcać kolekcje Co się dzieje podczas wykonywania kodu? Ciąg dalszy historii… Funkcja forEach działa jak pętla Funkcja forEach nie zwraca wyniku Aktualizujemy projekt Spożywczak Użyj groupBy, by podzielić kolekcję na grupy Funkcji groupBy można używać w łańcuchach wywołań Jak używać funkcji fold Za kulisami: funkcja fold Więcej przykładów użycia funkcji fold Aktualizujemy projekt Spożywczak Pomieszane komunikaty Twój przybornik do Kotlina Wyjeżdżamy… Te elementy nie mają żadnego naturalnego porządku. Aby znaleźć wśród nich wartość największą lub najmniejszą, musimy określić jakieś kryterium, takie jak wartość właściwości unitPrice lub quantity. Funkcja fold zaczyna od pierwszego elementu kolekcji. R E F R E F R E F 0 1 2 List Int 1 2 3 Int Int Int 364 365 366 367 368 371 372 373 374 375 376 377 381 382 383 384 386 387 391 394 395 xvii Poleć książkęKup książkę Spis treści A Koprocedury Współbieżne wykonywanie kodu Niektóre rzeczy najlepiej jest wykonywać w tle. Jeśli musisz odczytać dane z wolnego serwera zewnętrznego, to najprawdopodobniej nie będziesz chciał, by reszta kodu czekała bezczynnie na zakończenie takiej operacji. W takich sytuacjach Twoim najlepszym przyjacielem są koprocedury. Koprocedury pozwalają na pisanie kodu, który jest wykonywany asynchronicznie. To z kolei oznacza mniej czasu straconego na oczekiwanie, lepsze doznania użytkownika, jak również możliwość poprawienia skalowalności aplikacji. Czytaj dalej, a poznasz sekret, jak rozmawiać z Kubą, jednocześnie słuchając Zuzanny. Bam! Bam! Bam! Bam! Bam! Bam! Tss! Tss! Dźwięki tom-tomu i talerzy są odtwarzane jednocześnie, jednak teraz używamy bardziej wydajnego sposobu odtwarzania plików dźwiękowych. B Testowanie Pociągnij swój kod do odpowiedzialności. Wszyscy wiedzą, że dobry kod musi działać. Jednak każda zmiana wprowadzana w kodzie pociąga za sobą ryzyko wystąpienia błędów, które uniemożliwią jego prawidłowe działanie. To właśnie dlatego konieczne jest dokładne testowanie: dzięki niemu dowiesz się o wszelkich problemach występujących w kodzie, jeszcze zanim zostanie wdrożony w środowisku produkcyjnym. W tym dodatku przedstawimy JUnit oraz KotlinTest — dwie biblioteki, których możesz używać do tworzenia testów jednostkowych i sprawdzania za ich pomocą swojego kodu, dzięki czemu zawsze będziesz miał pod ręką koło ratunkowe. xviii Poleć książkęKup książkę Spis treści C Pozostałości Dziesięć najważniejszych rzeczy (których nie opisaliśmy) Choć opisaliśmy już tak dużo, to wciąż jeszcze trochę zostało. Jest jeszcze parę rzeczy, o których warto wiedzieć. Nie czulibyśmy się w porządku, gdybyśmy pominęli je bez słowa, a naprawdę zależy nam na tym, by oddać w Twoje ręce książkę, po której przeczytaniu nie będziesz musiał chodzić na lokalną siłownię. Dlatego zanim odłożysz tę książkę na półkę, przeczytaj to, co jeszcze zostało. 1. Pakiety i importowanie 2. Modyfikatory widoczności 3. Klasy wyliczeniowe 4. Klasy zapieczętowane 5. Klasy zagnieżdżone i wewnętrzne 6. Deklaracje obiektów i wyrażenia 7. Rozszerzenia 8. Return, break i continue 9. Więcej zabawy z funkcjami 10. Współdziałanie x: String y: String Outer Inner Obiekty Inner i Outer są ze sobą powiązane w szczególny sposób. Klasa Inner może używać składowych klasy Outer i na odwrót. 416 418 420 422 424 426 429 430 432 434 xix Poleć książkęKup książkę Poleć książkęKup książkę 1. Zaczynamy Szybki skok Wskakuj, woda jest świetna! Popłyniemy od razu na głęboką wodę, napiszemy trochę kodu i przyjrzymy się podstawom składni Kotlina. Nawet się nie zorientujesz, kiedy zaczniesz kodować. Kotlin robi dużo szumu. Od momentu pojawienia się pierwszej wersji Kotlina język ten urzekł programistów swoją przyjazną składnią, spójnością, elastycznością oraz możliwościami. W tej książce nauczymy Cię pisać w Kotlinie własne aplikacje, a zaczniemy od pokazania, jak stworzyć i uruchomić prostą aplikację. Po drodze przedstawimy podstawy składni Kotlina, takie jak instrukcje, pętle oraz konstrukcje warunkowe. Twoja podróż właśnie się zaczyna… to jest nowy rozdział� 1 Poleć książkęKup książkę Kotlin przegląd Witamy w Kotliczynie Kotlin błyskawicznie podbija świat programowania. Choć jest to jeden z najmłodszych języków dostępnych w programistycznym światku, to jednak wielu programistów go preferuje. Co zatem sprawia, że jest on tak wyjątkowy? Kotlin dysponuje wieloma cechami nowoczesnych języków programowania, które sprawiają, że jest on atrakcyjny dla programistów. Cechy te przedstawimy bardziej szczegółowo w dalszej części książki, a na razie tylko ogólnie opiszemy kilka z nich. Kotlin jest zwięzły, zrozumiały i czytelny W odróżnieniu od niektórych innych języków kod pisany w Kotlinie jest bardzo zwięzły i pozwala na wykonywanie złożonych operacji nawet w jednym wierszu kodu. Udostępnia on skrócone sposoby realizacji najczęściej wykonywanych czynności, dzięki czemu nie trzeba pisać długich, powtarzających się fragmentów kodu, jak również dysponuje obszerną biblioteką funkcji, których można używać. Co więcej, ponieważ jest mniej kodu, przez który trzeba się przedzierać, kod w Kotlinie można szybciej czytać, pisać i analizować, dzięki czemu pozostaje nam więcej czasu na inne rzeczy. Pozwala korzystać z programowania obiektowego i funkcyjnego Nie możesz się zdecydować, czy chcesz uczyć się programowania obiektowego czy funkcyjnego? A czemu by nie obu tych sposobów programowania jednocześnie? Kotlin pozwala na pisanie kodu obiektowego korzystającego z klas, dziedziczenia i polimorfizmu, dokładnie tak samo jak Java. Jednocześnie daje także możliwość programowania w stylu funkcyjnym, łącząc w sobie najlepsze cechy obu tych światów. Kompilator zapewnia nam bezpieczeństwo Nikt nie lubi niebezpiecznego kodu rojącego się od błędów, a kompilator Kotlina wkłada wiele wysiłku w to, by zapewnić, że tworzony kod będzie możliwie jak najbardziej przejrzysty, i zapobiega wielu błędom, które mogłyby się pojawić w innych językach programowania. Kotlin jest językiem korzystającym ze statycznego określania typów, dzięki czemu nie możemy na przykład wykonać nieodpowiedniej czynności dla danego typu danych, doprowadzając przez to do awarii programu. Co więcej, w większości przypadków nie trzeba nawet jawnie podawać typów, gdyż kompilator może je określać samodzielnie A zatem Kotlin jest nowoczesnym, potężnym i elastycznym językiem programowania, zapewniającym bardzo dużo korzyści. Ale to jeszcze nie koniec historii. 2 Rozdział 1. Język zaprojektowany z myślą o komputerach I ludziach? Fantastyczne! Kotlin niemal w całości eliminuje wiele rodzajów błędów, które powszechnie występują w innych językach programowania. A to oznacza solidniejszy, bardziej niezawodny kod i mniej czasu spędzonego na tropienie i usuwanie błędów. Poleć książkęKup książkę Zaczynamy Możliwość wyboru platformy docelowej, na którą zostanie skompilowany kod napisany w Kotlinie, oznacza, że można go uruchamiać na serwerach, w chmurze, w przeglądarce, na urządzeniach mobilnych i nie tylko. Kotlina można używać niemal wszędzie Kotlin jest tak potężny i elastyczny, że można go używać w bardzo wielu kontekstach, jako języka ogólnego przeznaczenia. Jest to możliwe dlatego, że pozwala on wybrać platformę docelową, na którą będzie kompilowany jego kod źródłowy. Wirtualne maszyny Javy (JVM) Kod w Kotlinie można kompilować do postaci kodów bajtowych Javy i wykonywać w wirtualnej maszynie Javy (JVM — Java Virtual Machine). Oznacza to, że Kotlina można używać praktycznie wszędzie tam, gdzie Javy. Kotlin zapewnia stuprocentowe współdziałanie z Javą, dzięki czemu można w nim używać już istniejących bibliotek napisanych w Javie. Jeśli pracujemy nad aplikacją zawierającą wiele kodu w Javie, nie musimy wyrzucać tego kodu — nowy kod napisany w Kotlinie będzie z nim doskonale współdziałał. A jeśli zechcemy używać kodu napisanego w Kotlinie w kodzie Javy, to z tym także nie będziemy mieć żadnego problemu. Android Wraz z innymi językami, takimi jak Java, Kotlin ma pełne wsparcie ze strony twórców Androida. Można go używać do pisania w Android Studio, jak również korzystać z jego wszystkich zalet podczas pisania aplikacji na Androida. JavaScript — po stronie klienta i serwera Można także tłumaczyć i kompilować (czyli „transpilować”) kod napisany w Kotlinie do postaci kodu napisanego w JavaScripcie i wykonywać na przykład w przeglądarkach WWW. Takiego kodu można używać do korzystania zarówno z technologii serwerowych, jak i klienckich, takich jak Node.js czy WebGL. Aplikacje rodzime Jeśli chcemy pisać kod, który będzie błyskawicznie wykonywany na słabszych urządzeniach, to kod w Kotlinie można kompilować bezpośrednio do rodzimego kodu maszynowego. Dzięki temu można pisać kod, który będzie działał na przykład na iOS-ie lub Linuksie. W tej książce skoncentrujemy się na tworzeniu w Kotlinie aplikacji przeznaczonych do wykonywania w JVM, gdyż to najprostszy sposób na opanowanie możliwości tego języka. Później jednak będziesz mógł zastosować tę wiedzę do pisania kodu działającego także na innych platformach. Choć będziemy pisać aplikacje działające w JVM, to by w pełni skorzystać z tej książki, wcale nie musisz znać Javy. Zakładamy co prawda, że dysponujesz pewnym ogólnym doświadczeniem z zakresu programowania, ale to wszystko. A zatem dajmy nurka na głęboką wodę. jesteś tutaj� 3 Poleć książkęKup książkę Kroki Co zrobimy w tym rozdziale? W tym rozdziale pokażemy Ci, jak napisać w Kotlinie bardzo prostą aplikację. W tym celu trzeba będzie wykonać kilka czynności: 1 Utworzyć nowy projekt aplikacji w Kotlinie. Zaczniemy od zainstalowania IntelliJ IDEA (Community Edition), bezpłatnego zintegrowanego środowiska programistycznego (IDE) obsługującego pisanie aplikacji w języku Kotlin. Następnie użyjemy go do utworzenia projektu aplikacji w Kotlinie: To jest projekt, który utworzymy, używając IDE. 2 3 4 Dodać funkcję, która wyświetla jakiś tekst. Do projektu aplikacji dodamy nowy plik źródłowy Kotlina i napiszemy prostą funkcję main, która wyświetla tekst „Hau!”. Zaktualizować funkcję, tak by robiła nieco więcej. Kotlin udostępnia podstawowe konstrukcje językowe, takie jak instrukcje, pętle oraz rozgałęzienia warunkowe. Skorzystamy z nich, by nasza funkcja robiła coś więcej. Wypróbować kod w interaktywnej powłoce Kotlina. I w końcu dowiemy się, w jaki sposób można sprawdzać fragmenty kodu w interaktywnej powłoce Kotlina (REPL). Już zaraz zainstalujemy IDE, najpierw jednak wykonaj pewne ćwiczenie. 4 Rozdział 1. Poleć książkęKup książkę Zaostrz ołówek Wiemy, że jeszcze nie pokazaliśmy Ci żadnego kodu napisanego w Kotlinie, przekonajmy się jednak, czy będziesz potrafił odgadnąć, co robią poszczególne wiersze poniższego fragmentu kodu. Aby nieco Ci to ułatwić, opiszemy pierwszy wiersz kodu. Zaczynamy val name = ”Zouza” val height = 27 Deklaruje zmienną o nazwie „name” i nadaje jej wartość „Zouza”. println(”Siema”) println(”Mój kot nazywa się $name”) println(”Mój kot ma $height centymetrów wysokości”) val a = 6 val b = 7 val c = a + b + 10 val str = c.toString() val numList = arrayOf(1, 2, 3) var x = 0 while (x 3) { println(”Elementem nr $x jest ${numList[x]}”) x = x + 1 } val myCat = Cat(name, height) val y = height - 3 if (y 5) myCat.miaow(4) while (y 26) { myCat.play() y = y + 1 } jesteś tutaj� 5 Poleć książkęKup książkę Rozwiązanie ćwiczenia Zaostrz ołówek Rozwiązanie Wiemy, że jeszcze nie pokazaliśmy Ci żadnego kodu napisanego w Kotlinie, przekonajmy się jednak, czy będziesz potrafił odgadnąć, co robią poszczególne wiersze poniższego fragmentu kodu. Aby nieco Ci to ułatwić, opiszemy pierwszy wiersz kodu. val name = ”Zouza” Deklaruje zmienną o nazwie „name” i nadaje jej wartość „Zouza”. val height = 27 Deklaruje zmienną o nazwie „height” i nadaje jej wartość 27. println(”Siema”) Wyświetla „Siema” na standardowym wyjściu. println(”Mój kot nazywa się $name”) Wyświetla „Mój kot nazywa się Zouza”. println(”Mój kot ma $height centymetrów wysokości”) Wyświetla „Mój kot ma 27 centymetrów wysokości”. val a = 6 val b = 7 Deklaruje zmienną o nazwie „a” i nadaje jej wartość 6. Deklaruje zmienną o nazwie „b” i nadaje jej wartość 7. val c = a + b + 10 Deklaruje zmienną o nazwie „c” i nadaje jej wartość 23. val str = c.toString() Deklaruje zmienną o nazwie „str” i przypisuje jej tekstową wartość „23”. val numList = arrayOf(1, 2, 3) Tworzy tablicę zawierającą wartości: 1, 2 i 3. var x = 0 Deklaruje zmienną o nazwie „x” i nadaje jej wartość 0. while (x 3) { Każe wykonywać pętlę, dopóki x jest mniejsze od 3. println(”Elementem nr $x jest ${numList[x]}”) Wyświetla indeks i wartość każdego elementu tablicy. x = x + 1 Dodaje 1 do x. } To jest koniec pętli. val myCat = Cat(name, height) Deklaruje zmienną o nazwie „myCat” i tworzy obiekt Cat. val y = height - 3 Deklaruje zmienną o nazwie „y” i nadaje jej wartość 24. if (y 5) myCat.miaow(4) Jeśli y jest mniejsze od 5, obiekt Cat ma miauknąć 4 razy. while (y 26) { myCat.play() Każe wykonywać pętlę, dopóki y jest mniejsze od 26. Wywołuje funkcję play() obiektu myCat. y = y + 1 Dodaje 1 do y. } To jest koniec pętli. 6 Rozdział 1. Poleć książkęKup książkę Instalowanie IntelliJ IDEA (Community Edition) Najprostszym sposobem pisania i wykonywania kodu w języku Kotlin jest skorzystanie z IntelliJ IDEA (Community Edition). To darmowe zintegrowane środowisko programistyczne (IDE) zostało stworzone przez firmę JetBrains, która opracowała także sam język Kotlin i dysponuje wszystkim, czego potrzeba do pisania aplikacji w Kotlinie, w tym: Jesteś tutaj Zaczynamy ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Edytorem kodu Edytor jest wyposażony w mechanizm uzupełniania kodu, który pomaga w pisaniu kodu w Kotlinie, kolorowaniu składni i podkreślaniu kolorami ułatwiającymi czytanie i analizę kodu. Potrafi także pokazywać wskazówki dotyczące usprawniania kodu. Narzędziami do budowy Kod można kompilować i uruchamiać, korzystając z łatwo dostępnych skrótów. IntelliJ IDEA IntelliJ IDEA ma wiele innych możliwości i narzędzi, a wszystkie ułatwiają życie programistom. Kotlin REPL IntelliJ IDEA zawiera narzędzie Kotlin REPL, które pozwala na testowanie fragmentów kodu poza główną bazą kodu projektu. Kontrolą wersji IntelliJ IDEA potrafi współpracować ze wszystkimi głównymi systemami kontroli wersji, takimi jak: Git, SVN, CVS i inne. Abyś mógł razem z nami wykonywać przykłady i ćwiczenia prezentowane w książce, musisz zainstalować IntelliJ IDEA (Community Edition). Program ten można pobrać ze strony: https://www.jetbrains.com/idea/download/index.html Koniecznie wybierz opcję do pobrania bezpłatnej wersji Community Edition IntelliJ IDEA. Po zainstalowaniu IDE uruchom je. Na ekranie zostanie wyświetlone powitalne okno dialogowe. Teraz masz już wszystko, czego Ci potrzeba do napisania pierwszej aplikacji w Kotlinie. To jest powitalne okno dialogowe IntelliJ IDEA. jesteś tutaj� 7 Poleć książkęKup książkę Tworzenie projektu Stwórzmy prostą aplikację Skoro już masz zintegrowane środowisko programistyczne, jesteś gotów, by napisać swoją pierwszą aplikację w Kotlinie. Będzie to naprawdę bardzo prosta aplikacja, której działanie sprowadza się do wyświetlenia na ekranie tekstu „Hau!”. Pisanie aplikacji w IntelliJ IDEA zawsze należy zacząć od utworzenia nowego projektu. Upewnij się zatem, że IDE działa, i wykonuj wraz z nami opisywane czynności. 1. Utworzenie projektu Powitalne okno dialogowe IntelliJ IDEA udostępnia kilka opcji pozwalających określić, co chcemy zrobić. Ponieważ chcemy utworzyć nowy projekt, musimy kliknąć przycisk Create New Project. ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Tu będą się pojawiały wszystkie tworzone projekty. Dopiero utworzymy nasz pierwszy projekt, więc na razie ten obszar jest pusty. Kliknij ten przycisk, by utworzyć nowy projekt. 8 Rozdział 1. Poleć książkęKup książkę Tworzenie prostej aplikacji (ciąg dalszy) 2. Określenie typu projektu Teraz będziesz musiał powiedzieć IntelliJ IDEA, jakiego rodzaju projekt chcesz utworzyć. IntelliJ IDEA pozwala na tworzenie projektów pisanych w różnych językach i przeznaczonych na różne platformy, na przykład pisanych w Javie aplikacji na Androida. Nam chodzi o utworzenie projektu w Kotlinie, więc zaznacz opcję Kotlin. Zaczynamy ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Oprócz tego trzeba określić, jaka ma być docelowa platforma projektu. My utworzymy aplikację przeznaczoną do wykonywania w wirtualnej maszynie Javy, a zatem musisz także zaznaczyć opcję JVM/IDEA. Dostępne są także inne opcje, jednak w tej książce skoncentrujemy się na tworzeniu aplikacji przeznaczonych na wirtualną maszynę Javy (JVM). Naszą aplikację będziemy uruchamiać w JVM, zatem trzeba także zaznaczyć opcję JVM/IDEA. Tworzymy projekt w języku Kotlin, trzeba zatem zaznaczyć opcję Kotlin. Kliknij Next, by przejść do następnego kroku. jesteś tutaj� 9 Poleć książkęKup książkę Konfiguracja projektu Tworzenie prostej aplikacji (ciąg dalszy) 3. Konfiguracja projektu Teraz musisz skonfigurować projekt — określić, jak ma się on nazywać, gdzie mają być przechowywane jego pliki oraz jakie pliki mają być przez niego używane. Dostępne opcje pozwalają także określić, jakiej wersji Javy ma używać JVM oraz jakiej biblioteki Kotlina należy użyć. Nadaj projektowi nazwę MojaPierwszaApka i zaakceptuj domyślne ustawienia wszystkich innych opcji. Po kliknięciu przycisku Finish IntelliJ IDEA utworzy projekt. Nadaj projektowi nazwę „MojaPierwszaApka” ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Zaakceptuj domyślne wartości tych opcji. Kiedy klikniesz przycisk Finish, IDE utworzy projekt. 10 Rozdział 1. Poleć książkęKup książkę Właśnie utworzyłeś swój pierwszy projekt w Kotlinie Po wykonaniu wszystkich czynności związanych z tworzeniem nowego projektu IntelliJ IDEA przygotuje go i wyświetli. Tak wygląda projekt przygotowany dla nas przez IDE: Zaczynamy Właśnie zakończyliśmy ten etap prac, zaznaczamy go zatem jako wykonany. ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL To jest eksplorator katalogów. Można go używać do przechodzenia pomiędzy plikami i katalogami wchodzącymi w skład projektu. Treść wszelkich plików pisanych w języku Kotlin będzie wyświetlana tutaj. Jak widać, IntelliJ IDEA udostępnia narzędzie eksploratora, którego można używać do poruszania się po plikach i katalogach wchodzących w skład projektu. IDE tworzy tę strukturę katalogów podczas zakładania projektu. W skład struktury katalogów wchodzą pliki konfiguracyjne, używane zarówno przez samo IDE, jak i przez niektóre biblioteki zewnętrzne stosowane w aplikacji. Znajduje się w niej także katalog src, używany do przechowywania kodów źródłowych. Większość naszego pobytu w Kotliczynie spędzimy właśnie, pracując w tym katalogu. Na razie katalog src jest jeszcze pusty, gdyż nie dodaliśmy do niego żadnego pliku źródłowego. Już niebawem się tym zajmiemy. Wszelkie pliki źródłowe pisane w Kotlinie muszą być dodawane do katalogu src. jesteś tutaj� jesteś tutaj� 11 11 Poleć książkęKup książkę ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Dodajemy plik Dodaj do projektu nowy plik Kotlina Zanim będziesz mógł zacząć pisać kod w Kotlinie, musisz utworzyć dla niego plik źródłowy. Aby dodać do projektu nowy plik źródłowy języka Kotlin, musisz zaznaczyć katalog src w eksploratorze InetlliJ IDEA, kliknąć w menu głównym opcję File, a następnie wybrać opcję New/Kotlin File/Class. W efekcie zostaniesz poproszony o podanie nazwy i typu pliku. W polu Name wpisz App, a z listy Kind wybierz opcję File, jak pokazaliśmy na poniższym rysunku: Nowemu plikowi nadaj nazwę „App”. Z listy rodzaju pliku wybierz opcję „File”. Po kliknięciu przycisku OK IntelliJ IDEA utworzy nowy plik Kotlina o nazwie App.kt i doda go do katalogu src projektu: Nowy plik o nazwie „App.kt” został dodany do katalogu src projektu. Zobaczmy teraz, jaki kod musimy dodać do pliku App.kt, aby zaczął on cokolwiek robić. 12 Rozdział 1. Poleć książkęKup książkę Anatomia funkcji main Aktualnie chodzi nam o napisanie w Kotlinie kodu, który w oknie wyników IDE wyświetli łańcuch „Hau!”. W tym celu dodamy do pliku App.kt funkcję. Pisząc aplikację w języku Kotlin, zawsze musisz dodać do niej funkcję o nazwie main, której zadaniem jest uruchomienie tej aplikacji. Podczas uruchamiania kodu JVM szuka tej funkcji i wykonuje ją. Funkcja main wygląda tak jak na poniższym przykładzie: Zaczynamy ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL „fun” oznacza, że to jest funkcja. Ciąg znaków „//” oznacza komentarz. Ten komentarz należy zastąpić dowolnym kodem, który funkcja ma wykonać. To jest nazwa tej funkcji. fun main (args: Array String ) { Otwierający nawias klamrowy funkcji. // tu umieść swój kod... } Zamykający nawias klamrowy funkcji. Parametry funkcji, umieszczone wewnątrz pary nawiasów. Do tej funkcji jest przekazywana tablica łańcuchów, przy czym nosi ona nazwę „args”. Funkcja rozpoczyna się od słowa fun, które informuje kompilator Kotlina, że to jest funkcja. Słowa kluczowego fun musisz używać podczas tworzenia w Kotlinie każdej nowej funkcji. Za słowem kluczowym fun zostaje podana nazwa funkcji — w tym przypadku jest to main. Nadanie funkcji tej nazwy oznacza, że funkcja ta zostanie automatycznie wykonana po uruchomieniu aplikacji. Kod umieszczony wewnątrz nawiasów () podanych za nazwą funkcji informuje kompilator, jakie argumenty funkcja będzie akceptować (o ile w ogóle jakieś będą). W naszym przypadku kod args: Array String określa, że funkcja przyjmuje tablicę łańcuchów (String) oraz że tablica ta będzie dostępna pod nazwą args. Kod, który chcemy wykonywać, musi być umieszczony pomiędzy nawiasami klamrowymi {} funkcji main. W naszym przypadku chcemy, by funkcja ta wyświetliła w IDE łańcuch „Hau!”. Możemy to zrobić w następujący sposób: Ta nazwa informuje, że tekst należy wyświetlić na standardowym wyjściu. fun main(args: Array String ) { println (”Hau!”) } To jest tekst, który chcemy wyświetlić. Funkcja println(”Hau!”) wyświetla łańcuch znaków, czy też String, na standardowym wyjściu. Ponieważ nasz program będziemy wykonywać w IDE, tekst zostanie wyświetlony w jego panelu wyników. Skoro już wiemy, jak wygląda funkcja, dodajmy ją do naszego projektu. Bezparametrowe funkcje main Jeśli używasz Kotlina w wersji 1.2 lub starszej, to aby można było uruchomić aplikację, funkcja main musi przyjąć następującą postać: fun main(args: Array String ) { // tu umieść swój kod } Jednak zaczynając od wersji 1.3, parametry funkcji main można pomijać, a zatem może ona wyglądać jak na poniższym przykładzie: fun main() { // tu umieść swój kod } W dalszej części tej książki zazwyczaj będziemy używać tej dłuższej wersji funkcji main, gdyż będzie ona działać we wszystkich wersjach Kotlina. jesteś tutaj� 13 Poleć książkęKup książkę Funkcja main Dodaj funkcję main do pliku App.kt Aby dodać funkcję main do projektu, otwórz plik App.kt, dwukrotnie klikając go w eksploratorze IntelliJ IDEA. Spowoduje to otworzenie pliku w edytorze kodu, jak pokazaliśmy poniżej: ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Ta zakładka pokazuje nazwę edytowanego pliku — w tym przypadku jest to App.kt. To jest panel edytora kodu IntelliJ IDEA. Na razie jest on pusty, gdyż nasza wersja App.kt nie zawiera jeszcze żadnego kodu. Następnie zaktualizuj swoją wersję pliku App.kt tak, by odpowiadała naszej, przedstawionej poniżej: fun main(args: Array String ) { println(“Hau!”) } Spróbuj teraz wykonać program. MojaPierwszaApka src Plik App.kt możesz znaleźć w tym katalogu. App.kt Nie istnieją głupie pytania P: Czy funkcję main muszę dodawać do każdego tworzonego pliku Kotlina? O: Nie. Aplikacje pisane w Kotlinie mogą składać się z dziesiątek, a nawet setek plików, jednak tylko w jednym z nich może się znajdować funkcja main — w tym, który ma rozpoczynać wykonywanie aplikacji. 14 Rozdział 1. Poleć książkęKup książkę Zaczynamy ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Jazda próbna Aby wykonać kod w IntelliJ IDEA, należy wybrać z menu głównego opcję Run, a następnie polecenie Run. Kiedy zostaniesz o to poproszony, wybierz opcję AppKt. To spowoduje zbudowanie projektu i wykonanie kodu. Po krótkim oczekiwaniu w oknie wyników u dołu głównego okna IntelliJ IDEA zostanie wyświetlony tekst „Hau!”: To jest okno wyników IDE. Co robi polecenie Run? Po wykonaniu polecenia Run, zanim zostaną wyświetlone wyniki, IntelliJ IDEA wykonuje kilka czynności: 1 2 IDE kompiluje kod napisany w Kotlinie do postaci kodów bajtowych Javy. Zakładając, że w naszym kodzie nie będzie żadnych błędów, jego skompilowanie spowoduje utworzenie jednego lub wielu plików klasowych, które będzie można wykonać w JVM. W naszym przypadku skompilowanie pliku App.kt spowoduje utworzenie pliku klasowego AppKt.class. Kompilator Kotlina App.kt AppKt.class IDE uruchamia JVM, a następnie wykonuje klasę AppKt.class. JVM przekształca plik AppKt.class w coś, co będzie w stanie zrozumieć używana platforma systemowa, a następnie to coś wykonuje. W efekcie w oknie wyników IDE zostanie wyświetlony napis „Hau!”. Hau! AppKt.class Skoro już wiemy, że nasza funkcja działa, zobaczmy, jak sprawić, by mogła robić coś więcej. Mówiąc bardziej konkretnie, IDE kompiluje nasz kod źródłowy do kodów bajtowych JVM, gdyż podczas tworzenia projektu zaznaczyliśmy opcję JVM. Gdybyśmy wybrali uruchamianie projektu w innym środowisku, to kompilator skompilowałby plik źródłowy do kodów dostosowanych do wskazanego środowiska. jesteś tutaj� 15 Poleć książkęKup książkę Instrukcje, pętle, rozgałęzienia Co możemy nakazać w funkcji main? Kiedy już znajdziemy się wewnątrz funkcji main (czy też jakiejkolwiek innej), zaczyna się prawdziwa zabawa. Aby nasz program coś zrobił, możemy w niej nakazać wykonanie wszystkich działań, jakie znamy z większości innych języków programowania. ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Oto co nasz kod może:  Coś zrobić (instrukcje) var x = 3 val name = ”Onufry” x = x * 10 print(“x ma wartość $x.”) // To jest komentarz  Zrobić coś znowu i znowu, i znowu (pętle) while (x 20) { x = x - 1 print(”Teraz x ma wartość $x.”) } for (i in 1..10) { x = x + 1 print(”Teraz x ma wartość $x.”) }  Zrobić coś pod warunkiem (rozgałęzienia) if (x == 20) { println(”x musi wynosić 20.”) } else { println(”x jest różne od 20.”) } if (name.equals(”Onufry”)) { println(”$name Mościpański”) } Tym fragmentom przyjrzymy się nieco dokładniej na kilku następnych stronach książki. 16 Rozdział 1. Składnia pod lupą Poniżej zamieściliśmy kilka ogólnych wskazówek i rad dotyczących składni dla osób po raz pierwszy poruszających się po Kotliczynie: ¬ Komentarz zajmujący jeden wiersz rozpoczyna się od sekwencji dwóch znaków ukośnika: // To jest komentarz ¬ W większości przypadków odstępy nie mają znaczenia: x = 3 ¬ Aby zdefiniować zmienną, należy użyć słowa kluczowego var lub val, a następnie podać nazwę zmiennej. Słowa var używamy do tworzenia zmiennych, których wartości chcemy zmieniać, a val — do tworzenia zmiennych, których wartość ma pozostać taka sama. Więcej o zmiennych dowiesz się w rozdziale 2. var x = 100 val serialNo = ”AS498HG” Poleć książkęKup książkę Zaczynamy ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Jeśli w bloku pętli znajduje się tylko jeden wiersz kodu, to nawiasy klamrowe można pominąć. W kółko i w kółko, i w kółko… Kotlin udostępnia trzy standardowe instrukcje pętli: while, do-while oraz for. Na razie skoncentrujemy się na pętli while. Jej składnia jest stosunkowo prosta. Tak długo, jak jakiś warunek jest spełniony, należy wykonywać wszystko, co jest umieszczone w bloku pętli. Blok pętli jest wyznaczany przez parę nawiasów klamrowych, a w nim musi się znaleźć to, co chcemy powtarzać. Kluczowe znaczenie dla prawidłowego działania pętli ma jej test warunkowy, nazywany także po prostu warunkiem. Warunek pętli to wyrażenie, które zwraca wartość logiczną — coś, co jest prawdą (true) lub fałszem (false). Na przykład jeśli powiemy coś takiego: „Tak długo, jak sąLodyWWafelku, liżemy”, będzie to zrozumiały test warunkowy. Lody w wafelku mogą być lub może ich w nim już nie być. Jeśli jednak powiemy: „Tak długo jak Ferdek, oglądamy”, to tak naprawdę nie jest to żaden test. Musielibyśmy go zmienić na coś w rodzaju: „Tak długo jak Ferdek leci w TV, oglądamy”, aby stwierdzenie miało sens. Proste testy logiczne Prosty test logiczny można wykonać, sprawdzając zmienną przy użyciu operatora porównania. Oto operatory porównań: (mniejszy od) (większy od) == (równy) = (mniejszy lub równy) = (większy lub równy) Do sprawdzania równości używamy dwóch znaków równości, a nie jednego. Koniecznie musisz zwrócić uwagę na różnicę pomiędzy operatorem przypisania (pojedynczym znakiem równości) a operatorem równości (dwoma znakami równości). Oto przykładowy kod, który używa testów logicznych: var x = 4 // Przypisujemy x wartość 4. while (x 3) { // Kod w pętli będzie wykonywany tak długo, jak x jest większe od 3. println(x) x = x - 1 } var z = 27 while (z == 10) { // Ta pętla nie zostanie wykonana, gdyż z jest równe 27. println(z) z = z + 6 } jesteś tutaj� 17 Poleć książkęKup książkę Zapętlamy się… Przykład pętli Zaktualizujemy kod w pliku App.kt, umieszczając w nim nową wersję funkcji main. Funkcję tę zmodyfikujemy w taki sposób, by wyświetlała komunikat przed uruchomieniem pętli, podczas każdej iteracji pętli oraz po jej zakończeniu. Zaktualizuj zatem swoją wersję pliku App.kt tak, by odpowiadał naszej, przedstawionej poniżej (zmiany wyróżniliśmy pogrubioną czcionką). ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Usuń ten wiersz — nie jest już nam potrzebny. fun main(args: Array String ) { println(“Hau!”) var x = 1 println(”Przed pętlą. x = $x.”) while (x 4) { println(”Wewnątrz pętli. x = $x.”) x = x + 1 } println(”Za pętlą. x = $x.”) } Ten zapis wyświetla wartość zmiennej x. MojaPierwszaApka src App.kt Jazda próbna Wykonaj kod, wybierając z menu głównego opcję Run/Run ‘AppKt’. W oknie wyników u dołu okna IntelliJ IDEA zostaną wyświetlone następujące komunikaty: Przed pętlą. x = 1. Wewnątrz pętli. x = 1. Wewnątrz pętli. x = 2. Wewnątrz pętli. x = 3. Za pętlą. x = 4. Skoro już wiesz, jak działa pętla while i testy warunkowe, czas zająć się instrukcją if. print kontra println Pewnie zauważyłeś, że czasami używamy funkcji print, a czasami println. Na czym polega różnica pomiędzy nimi? Otóż println wstawia nowy wiersz (pomyśl, że jej nazwa to print line — wyświetl nowy wiersz), natomiast print wyświetla wszystko w jednym wierszu. Jeśli chcesz, by każdy wyświetlany tekst znalazł się w odrębnym wierszu, to używaj println. Jeżeli chcesz wyświetlać kolejne teksty w jednym wierszu — używaj print. 18 Rozdział 1. Poleć książkęKup książkę Rozgałęzienia warunkowe Test if jest podobny do testu logicznego używanego w pętli while, z tym że zamiast rozumieć go jako „Tak długo jak wciąż są lody…”, należy go rozumieć jako „Jeśli są lody…”. ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL Abyś mógł przekonać się, jak to działa, poniżej zamieściliśmy kod, który wyświetla łańcuch, jeśli jedna liczba jest większa od drugiej: Jeśli w bloku if znajduje się jeden wiersz, to nawiasy klamrowe można pominąć. fun main(args: Array String ) { val x = 3 val y = 1 if (x y) { println(“x jest większe od y”) } println(”Ten wiersz zostanie wykonany niezależnie od wszystkiego...”) } Ten wiersz zostanie wykonany wyłącznie, jeśli x będzie większe od y. Powyższy kod wykona wiersz wyświetlający komunikat „x jest większe od y” tylko wtedy, gdy warunek (x jest większe od y) będzie spełniony. Jednak ostatni wiersz, wyświetlający komunikat „Ten wiersz zostanie wykonany niezależnie od wszystkiego…”, zostanie wykonany bez względu na wartość tego warunku. Dlatego też zależnie od wartości zmiennych x i y zostanie wyświetlony jeden komunikat lub dwa. Do warunku można także dodać klauzulę else, dzięki której można powiedzieć coś podobnego do: „Jeśli wciąż są lody w wafelku, to je zjedz, a w przeciwnym razie kup sobie następne”. Poniżej przedstawiliśmy zaktualizowaną wersję kodu, w którym zastosowaliśmy klauzulę else: fun main(args: Array String ) { val x = 3 val y = 1 if (x y) { println(“x jest większe od y”) } else { println(”x nie jest większe od y”) } println(”Ten wiersz zostanie wykonany niezależnie od wszystkiego...”) } Ten wiersz kodu jest wykonywany, jeśli warunek x y nie zostanie spełniony. W większości innych języków programowania to by było mniej więcej wszystko, co można powiedzieć o instrukcji if — używamy jej do wykonania kodu, jeśli zostanie spełniony jakiś warunek. Jednak Kotlin idzie o krok dalej. 19 jesteś tutaj�ZaczynamyPoleć książkęKup książkę Wyrażenia if Używanie if do zwracania wartości W Kotlinie if można używać jako wyrażenia, czyli do zwracania wartości. To tak, jakby powiedzieć: „Jeśli w wafelku wciąż są lody, to zwróć jedną wartość, a w przeciwnym wypadku zwróć inną wartość”. Tej formy if można używać do pisania kodu, który będzie bardziej zwarty. Aby zobaczyć, jak działa forma if, zmodyfikujemy kod przedstawiony na poprzedniej stronie. Wcześniej do wyświetlania komunikatu używaliśmy następującego fragmentu kodu: if (x y) { println(”x jest większe od y”) } else { println(”x nie jest większe od y”) } ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL W przypadku stosowania if jako wyrażenia, MUSISZ użyć także klauzuli else. Ten sam efekt co przy korzystaniu z wyrażeń if możemy uzyskać, używając kodu o następującej postaci: println(if (x y) ”x jest większe od y” else ”x nie jest większe od y”) Fragment kodu: if (x y) ”x jest większe od y” else ”x nie jest większe od y” jest właśnie wyrażeniem if. W pierwszej kolejności sprawdza on podany warunek, czyli: x y. Jeśli warunek ten zostanie spełniony, to wyrażenie zwróci łańcuch ”x jest większe od y”. W przeciwnym razie, czyli jeśli warunek nie zostanie spełniony (co odpowiada klauzuli else), wyrażenie zwróci łańcuch ”x nie jest większe od y”. Po określeniu wartości wyrażenia if zostaje ona wyświetlona przez funkcję println: println(if (x y) ”x jest większe od y” else ”x nie jest większe od y”) A zatem jeśli x jest większe od y, to zostanie wyświetlony komunikat ”x jest większe od y”. Jeśli jednak x nie jest większe od y, to kod wyświetli komunikat ”x nie jest większe od y”. Jak widzisz, taki sposób stosowania wyrażeń if daje dokładnie takie same efekty jak użycie kodu przedstawionego na poprzedniej stronie, jednak pozwala na pisanie kodu, który jest bardziej zwięzły. Na następnej stronie przedstawimy kompletny kod naszej funkcji main. Jeśli x jest większe od y, to kod wyświetli komunikat „x jest większe od y”. Jeżeli natomiast x nie jest większe od y, to kod wyświetli komunikat „x nie jest większe od y”. 20 Rozdział 1.Poleć książkęKup książkę Aktualizujemy funkcję main Zaktualizujmy kod pliku App.kt, zapisując w nim nową wersję funkcji main korzystającą z wyrażenia if. Zastąp kod w swoim pliku tak, by był identyczny jak ten przedstawiony poniżej: ¨ Zbudowanie aplikacji ¨ Dodanie funkcji ¨ Aktualizacja funkcji ¨ Zastosowanie REPL fun main(args: Array String ) { var x = 1 println(“Przed pętlą. x = $x.”) while (x 4) { println(”Wewnątrz pętli. x = $x.”) x = x + 1 } println(”Za pętlą. x = $x.”) val x = 3 val y = 1 println(if (x y) ”x jest większe od y” else ”x nie jest większe od y”) println(”Ten wiersz zostanie wykonany niezależnie od wszystkiego...”) } Usuń te wiersze kodu. Weźmy teraz ten kod na jazdę próbną. Jazda próbna Uruchom kod, wybierając z menu głównego opcję Run/Run ‘AppKt’. W oknie wyników u dołu IDE powinny zostać wyświetlone następujące teksty: x jest większe od y Ten wiersz zost
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Kotlin. Rusz głową!
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: