Lekce 2 - První objektová aplikace v Dartu - Hello object world
Minulá lekce, Úvod do objektově orientovaného programování v Dartu, nás uvedla do objektově orientovaného programování v jazyce Dart. Již víme, že objekty mají vlastnosti a metody. Také víme, že k vytvoření objektu vytvoříme nejprve třídu. Ta je vzorem, podle kterého následně tvoříme její instance.
Na začátku kurzu se základními konstrukcemi jazyka Dart jsme si vytvořili program Hello world. Udělejme si nyní podobný program jako úvod do objektově orientovaného programování. Naprogramujme si Hello object world!
Založme si v IntelliJ IDEA novou konzolovou aplikaci tak, jak jsme to
dělali doposud. Do složky lib/src/
si přidáme nový soubor
zdravic.dart
. Připomeneme si, že název souboru vždy píšeme
malými písmeny se slovy oddělenými podtržítkem. Název třídy je naopak
vždy velbloudí notací bez mezer a na rozdíl od proměnných má každé
slovo velké první písmeno, tedy i první. Název je samozřejmě také bez
diakritiky, tu v programu používáme max. uvnitř textových řetězců,
nikoli v identifikátorech.
Podle této třídy později vytvoříme objekt zdravic
, který
nás bude umět pozdravit. Vidíme, že se na program již díváme úplně
jinak, za každou akci je zodpovědný nějaký objekt, nestačí pouze něco
"nabušit". V našem případě vám to může přijít zbytečné, u
složitějších aplikací si to budete pochvalovat.
class Zdravic {
}
Připomenu, že ve složce bin/
potřebujeme náš spustitelný
soubor, například main.dart
, ve kterém budeme mít metodu
main()
.
void main() {
}
Nyní si do třídy Zdravic
přidáme metodu
pozdrav()
, bude veřejně viditelná a nebude mít žádnou
návratovou hodnotu ani parametry.
Deklarace metody v Dart je tedy následující:
[návratový typ] [[_]jmenoMetody]([parametry])
Metoda nebude vracet žádnou hodnotu, toho docílíme klíčovým slovem
void
. Dále bude následovat samotný název metody, metody
píšeme stejně jako třídy velbloudí notací s malým poč. písmenem. Pokud
je první znak názvu podtržítko, taková metoda není veřejně viditelná.
Závorka s parametry je povinná, my ji necháme prázdnou, protože metoda
žádné parametry mít nebude. Do těla metody zapíšeme kód pro výpis na
konzoli.
Naše třída bude nyní vypadat takto:
class Zdravic { void pozdrav() { print('Hello object world!'); } }
Zde jsme prozatím skončili, přejdeme do main.dart
.
Importujeme si naši třídu Zdravic
. Pro ukázku budeme
předpokládat, že se náš balíček jmenuje prvni_oop_aplikace
,
případně si název upravte podle svého projektu:
import 'package:prvni_oop_aplikace/src/zdravic.dart';
Nyní si v těle metody main()
vytvoříme
instanci třídy Zdravic
. Bude to tedy ten objekt
zdravic
, se kterým budeme pracovat. Objekty se ukládají do
proměnných, název třídy slouží jako datový typ. Instance má zpravidla
název třídy, jen má první písmeno malé. Deklarujme si proměnnou a
následně v ní založme novou instanci třídy Zdravic
.
Zdravic zdravic;
zdravic = new Zdravic();
První řádek říká: "Chci proměnnou zdravic, ve které bude instance třídy Zdravic". S proměnnými jsme vlastně již takto pracovali.
Na druhém řádku je klíčové slovo new
, které nám založí
novou instanci třídy Zdravic
. Tuto instanci přiřadíme do
naší proměnné.
Při vytvoření nové instance se zavolá tzv. konstruktor. To je speciální metoda na třídě, proto při vytvoření instance píšeme ty prázdné závorky, jelikož voláme tuto "vytvářecí" metodu. Konstruktor zpravidla obsahuje nějakou inicializaci vnitřního stavu instance (např. dosadí výchozí hodnoty do proměnných). My jsme v kódu žádný konstruktor nedeklarovali, Dart si proto vytvořil tzv. implicitní bezparametrický konstruktor. Vytvoření instance objektu je tedy podobné volání metody. Celý zápis můžeme samozřejmě zkrátit na:
Zdravic zdravic = new Zdravic();
Jelikož v proměnné nyní máme opravdu instanci třídy
Zdravic
, můžeme instanci nechat pozdravit. Zavoláme na ni metodu
pozdrav a to jako zdravic.pozdrav()
. Kód metody
main()
bude tedy nyní vypadat následovně:
Zdravic zdravic = new Zdravic();
zdravic.pozdrav();
Program spustíme.
Konzolová aplikace
Hello object world!
Máme tedy svou první objektovou aplikaci!
Dejme nyní naší metodě pozdrav()
parametr
jmeno
, aby dokázala pozdravit konkrétního uživatele:
void pozdrav(String jmeno) { print('Ahoj uživateli $jmeno'); }
Vidíme, že syntaxe parametru metody je stejná, jako syntaxe proměnné.
Kdybychom chtěli parametrů více, oddělujeme je čárkou. Upravíme nyní
naši metodu main()
:
Zdravic zdravic = new Zdravic(); zdravic.pozdrav('Karel'); zdravic.pozdrav('Petr');
Náš kód je nyní v metodě a my ho můžeme jednoduše pomocí parametrů volat znovu s různými parametry. Nemusíme 2x opisovat "Ahoj uživateli...". Kód budeme odteď dělit logicky do metod.
Konzolová aplikace
Ahoj uživateli Karel
Ahoj uživateli Petr
Třídě přidáme nějakou vlastnost, nabízí se text, kde bude uložen text pozdravu. Vlastnosti se definují stejně, jako proměnné. Jako u metod platí, že pokud je první znak podtržítko, vlastnost není veřejně přístupná, bez něj jí Dart bere jako veřejně přístupnou. Upravme naši třídu:
class Zdravic { String text; void pozdrav(String jmeno) { print('$text $jmeno'); } }
Text nyní musíme pochopitelně nastavit vytvořené instanci v
main.dart
:
Zdravic zdravic = new Zdravic(); zdravic.text = 'Ahoj uživateli'; zdravic.pozdrav('Karel'); zdravic.pozdrav('Petr'); zdravic.text = 'Vítám tě tu programátore'; zdravic.Pozdrav('Richard');
Výstup programu:
Konzolová aplikace
Ahoj uživateli Karel
Ahoj uživateli Petr
Vítám tě tu programátore Richard
Vzhledem k objektovému návrhu není nejvhodnější, aby si každý objekt
ovlivňoval vstup a výstup, jak se mu zachce. Pochopitelně narážím na naše
vypisování do konzole. Každý objekt by měl mít určitou kompetenci a tu by
neměl překračovat. Pověřme náš objekt pouze sestavením pozdravu a jeho
výpis si zpracujeme již mimo, v našem případě v metodě
main()
. Výhodou takto navrženého objektu je vysoká
univerzálnost a znovupoužitelnost. Objekt doposud umí jen psát do konzole,
my ho však přizpůsobíme tak, aby daná metoda text pouze vracela a bylo na
jeho příjemci, jak s ním naloží. Takto můžeme pozdravy ukládat do
souborů, psát na webové stránky nebo dále zpracovávat.
Jelikož chceme, aby metoda vracela hodnotu a to String
,
změníme její dosavadní typ void
na String
. K
návratu hodnoty použijeme příkaz return
. Return metodu ukončí
a navrátí hodnotu, jakýkoli kód v těle metody po return
se
již neprovede! Upravme oba soubory:
Metoda pozdrav()
v zdravic.dart
:
String pozdrav(String jmeno) { return '$text $jmeno'; }
Tělo metody main()
v main.dart
:
Zdravic zdravic = new Zdravic(); zdravic.text = 'Ahoj uživateli'; print(zdravic.pozdrav('Karel')); print(zdravic.pozdrav('Petr')); zdravic.text = 'Vítám tě tu, programátore'; print(zdravic.pozdrav('Richard'));
Nyní je náš kód dle dobrých praktik. Ještě naši třídu okomentujme,
jak se sluší a patří. Komentáře budeme psát nad název třídy a nad
název každé vlastnosti a metody. Tyto komentáře pro dokumentaci píšeme za
trojlomítko ///
. Komentáře lokálních
proměnných a lokálního kódu píšeme za dvojlomítko
//
. Pokud bychom chtěli dočasně zakomentovat část kódu,
můžeme použít blokové komentáře /* */
. Všechny komentáře
píšeme prózou a výrazy (proměnné, metody, třídy atp.) zvýrazníme
do hranatých závorek.
Zdokumentovaná třída může vypadat např. takto:
/// Třída reprezentuje zdravič, který slouží ke zdravení uživatelů. class Zdravic { /// Text pozdravu. String text; /// Pozdraví uživatele textem pozdravu [text] a jeho jménem [jmeno]. /// /// Vrací text s pozdravem. String pozdrav(String jmeno) { return '$text $jmeno'; } }
Podíváme se, že nám IDEA opravdu popisky zobrazí (popisky se dají vyžádat zkratkou CTRL + Q):

A jsme u konce. Námi napsaný program má již nějakou úroveň, i když
vlastně nic nedělá. Za úkol máte předělat si naši konzolovou kalkulačku
do objektů. V příští lekci, Řešené úlohy k 1.-2. lekci OOP v Dartu, si uděláme takovou jednoduchou
hříčku - necháme dva objekty (bojovníky) soupeřit v aréně (také
objektu). Máte se na co těšit.
V následujícím cvičení, Řešené úlohy k 1.-2. lekci OOP v Dartu, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 8x (2.45 kB)
Aplikace je včetně zdrojových kódů v jazyce Dart