Lekce 14 - Ekosystém a konvence Dartu
V minulé lekci, Dynamic, var, null a null aware operátory, jsme si vysvětlili něco o datovém typu
dynamic
, hodnotě null
a jak s ní pracovat. Tato
lekce bude v kurzu základních konstrukcí Dartu poslední a již se nebude
věnovat kódu, ale povíme si něco o ekosystému Dartu a jaké konvence bychom
měli dodržovat.
Ekosystém
Dart je relativně nový jazyk, který se při svém návrhu mohl poučit z mnoha chyb jiných technologií. A i přes to, že je open source, Dart tým každou změnu pečlivě rozmýšlí.
Ať už je Dart váš první jazyk, který se učíte, nebo již máte s programováním několik zkušeností, Dart je jedna z mála technologií, která má konzistentní postupy a konvence pro vývoj. Pokud se podíváme ku příkladu na již zmiňovaný Javascript nebo Javu, najdete stovky či tisíce nejrůznějších nástrojů od hromady různých vývojářů, kterými si můžete ulehčit vývoj - ať už to jsou nástroje na automatizaci, testování, kompilaci, generování dokumentace atp.
V Dartu, podobně jako v C#, se tento fenomén nevyskytuje (alespoň ne v takovéto míře) a existují tak jasně stanovené konvence a další podpůrné nástroje, čímž je celkový ekosystém zdravější a v celkovém pohledu nabývá ucelenějšího dojmu. A navíc všechen kód vypadá stejně (nebo by alespoň měl být, jelikož bychom měli dodržovat konvence, samozřejmě ne nutně 100%).
Struktura Dart projektu
Nejprve, než si povíme něco o nástrojích, bychom si měli vysvětlit,
jak vlastně strukturovat naše projekty. Každý projekt v Dartu je balíček a
již víme, že hlavní soubor, kterým se balíček konfiguruje, je
pubspec.yaml
. V tom definujeme závislosti, závislosti nutné k
vývoji a třeba i verzi Dart sdk. Tento soubor je vlastně to, co říká, že
tento projekt bude Dart balíček.
Mimochodem, i když budete importovat soubory v rámci vašeho balíčku,
pořád byste měli používat package:
prefix:
import 'package:moje_hra/src/hrac.dart';
Po stažení závislostí (příkaz pub get
) se vytvoří
lockfile soubor pubspec.lock
, který obsahuje informace, na čem
konkrétně je daný balíček závislý. Pokud je váš balíček aplikace,
měl by se tento soubor pubspec.lock zálohovat spolu s kódem. Aplikace je
takový balíček, který nemá být určen jako závislost ostatních, a tedy
ho plánujete spouštět přímo - např. konzolová aplikace, webová aplikace
a pod.
Stažení závislostí také vytvoří soubor .packages
, který
však nezálohujte.
Pokud chcete vydat svůj kód jako Open Source, měl by obsahovat i další
soubory jako README.md
, LICENSE
,
CHANGELOG
atp. Těmito soubory se však zabývat nebudeme. Pokud
vás Open Source zajímá, doporučuji se podívat na Open Source Guides (v angličtině).
bin/
Jak již víme, do složky bin/
přidáváme spustitelné
soubory (např. soubor, který spustí konzolovou aplikaci), které může
každý spustit.
Skripty v této složce můžete spustit pomocí příkazu
pub run
.
lib/
Do složky lib/
přidáme volně dostupné zdroje. Ty můžeme
využít jak my v našem kódu, tak někdo jiný, kdo používá náš
balíček.
Implementační soubory (tedy ty soubory, které jsou určeny pouze pro běh
naší aplikace) se dávají do složky lib/src/
. Soubory v této
složce nejsou volně dostupné a tedy byste ani vy neměli nikdy importovat nic
z této složky jiných balíčků.
web/
Pro webové balíčky využijete složku web/
, do které se
umisťují soubory vstupního bodu webové aplikace - Dart skripty s metodou
main()
a další potřebné soubory, jako např.
index.html
, style.css
atp.
Implementační kód webu (tedy veškerý kód, který není volán přímo
ze vstupních bodů jako jsou HTML soubory a podobné) by však stále měl být
ve složce lib/src/
.
test/
Každý balíček by měl být řádně otestován. V Dartu se umisťují
všechny testy do složky test/
a tyto soubory by měly mít suffix
_test
, např. tedy muj_prvni_test.dart
. Testy typicky
používají balíček
test.
benchmark/
Speciální druh testů, které netestují správnost kódu, ale jeho
rychlost (nebo třeba práci s pamětí), jsou "benchmarky". Ty se umisťují do
složky benchmark/
.
doc/
Dokumentace, kterou byste měli psát, patří do složky doc/
.
Pokud spustíte nástroj dartdoc
, vygeneruje se automaticky
dokumentace do složky doc/api/
. Jelikož se generuje automaticky,
neměli byste ji verzovat.
Pro ostatní typy dokumentace, např. pokud si ji chcete udržovat ručně,
nejsou žádné konvence, jen by neměla být ve složce
doc/api/
.
example/
Kód, testy, dokumentace a pořád to není dost. Ukázky reálného
používání vašeho balíčku patří do složky example/
.
tool/
Do složky tool/
je vhodné vkládat různé podpůrné
spustitelné soubory, jako jsou různé skripty, generátory, automatizační
pomocníci atp.
Oproti spustitelným souborům ve složce bin/
nejsou tyto
soubory určené pro externí použití.
Nástroje Dartu
pub
Pub je nástroj, díky kterému můžeme stahovat (pub get
)
cizí balíčky a nahrávat ty své. Ale umí toho i mnohem více. Váš
balíček dokáže sestavit (pub build
), spustit
(pub run
), watchovat (opakovaně sestavovat a spouštět při
každé změně - pub serve
) atp.
dartanalyzer
Dartanalyzer provádí statickou analýzu kódu. Jelikož se jedná o nezávislý nástroj, lze lehce využít v jiných aplikacích a tak třeba i IntelliJ IDEA využívá právě tento nástroj pro kontrolu.
dart2js a dartdevc
Dart má 2 nástroje určené pro kompilaci Dartu do Javascriptu. Nástroj
dartdevc
je rychlejší, jednodušší, čitelnější, má
silnější kontrolu a umí spolupracovat s debugovacími nástroji. Nástroj
dart2js
je oproti tomu optimalizovaný na sestavení produkční
verze webové aplikace.
dartdoc
Dartdoc generuje HTML dokumentaci z Dart kódu, kterou vygeneruje do
doc/api/
.
dartfmt
Dartftml formátuje Dart kód podle konvencí.
DartPad
Čas od času má každý z nás potřebu svůj kód sdílet. Ať už kvůli radě od kamaráda, nebo aby mohl projekt hezky ukázat. K těmto účelům slouží webový nástroj DartPad, který samozřejmě využívá i dartanalyzer, takže informuje o všech chybách a má v sobě několik efektních ukázek, jak Dart lze použít.
Konvence
Dart má poměrně rozsáhlé konvence týkající se zápisu, dokumentace, používání a návrhu. Všechny konvence, jelikož jich je opravdu mnoho a nebudeme si je všechny vypisovat, najdete na oficiálních stránkách Effective Dart.
V rámci této lekce si uvedeme jednu věc, a to sice názvy souborů. Jak
již jste si určitě všimli, názvy souborů v Dartu se píší malými
písmeny a slovy oddělenými podtržítky, což je oproti jiným jazykům
docela rozdíl. Píšeme tedy muj_program.dart
, nepíšeme
MujProgram.dart
.
Na psaní dobrého kódu jsou 2 zásadní pravidla:
Být konzistentní
Na spoustu věcí není žádné zlaté pravidlo, jak je psát dobře. Pokud však budete dostatečně konzistentní, objektivně se celý kód zdá lepší a čitelnější. A pokud už něco musí být jiné, mělo by to být z dobrého důvodu.
Být stručný
Dart je navržen tak, aby byl jednoduchý. A pokud existuje více způsobů, jak vyjádřit jednu věc, vyberte ten nejjednodušší. To ale samozřejmě neznamená, že byste měli napsat vždy co nejkratší kód. Kód by měl být napsán přehledně, ne "nahňácaný" na sobě.
Naše výuka Dartu teď vlastně teprve začíná, nicméně tento on-line kurz těch nejzákladnějších konstrukcích jazyka již dokončujeme. Dart kurz nyní pokračuje v sekci Základy objektově orientovaného programování v Dartu. Příště si tedy představíme objektový svět a pochopíme mnoho věcí, které nám až doteď byly utajovány.