Na začátek jeden vtip.

Špatní fotog­ra­fové se baví o objek­ti­vech, dobří o fotog­ra­fiích a ti slavní o ženských.

Dalo by se to vztáh­nout i na programátory, že ti špatní se baví o progra­mo­vacích jazycích. Největším dnešním úskalím softwa­rového inženýrství rozhodně není zdrojový kód, přesto věnuji tento příspěvek jazyku Groovy. Java mě živí, ale Groovy mě baví víc, je to příjemné zpestření. Dočetl jsem druhé vydání knihy Groovy in Action (čekali jsme na druhé vydání této bible dlouhých 6 let). Udělal jsem si pár poznámek, které by se mohly hodit i vám, ať už s Groovy začínáte nebo ho už nějakou chvilku používáte.

Groovy je stále aktuální i přesto, že už vyšla Java 8. Používám Groovy v Gradle, na mockování webových služeb v Soap UI a nejčas­těji při psaní testů. Napíšu tak mnohem méně kódu. A není to cvičení pro cvičení, ale znamená to menší pravděpo­dob­nost, že uděláte chybu, a méně kódu na čtení. Přičemž netrpí čitel­nost, ba právě naopak. Jako příklad uveďme inicia­li­zaci objektů či práci s kolekcemi.

Dynamický jazyk

Trocha teorie nikoho nezabije, malé opakování spíše prospěje všem. Groovy je dynamický jazyk, ale co to znamená? Připo­meňme si, že typování můžeme dělit na slabé a silné, či statické (typ proměn­ných se speci­fi­kuje v době kompi­lace) a dynamické. Silně a staticky je typovaná třeba Java. Slabě a dynamicky například JavaS­cript (piš, co chceš). Oproti tomu jazyk C je sice staticky typovaný, takže vás kompilátor klepne přes prsty, pokud byste chtěli používat API, které typu nepřís­luší, ale na druhou stranu už vás nic neome­zuje v tom, přety­povat proměnnou na úplně jiný typ. Dynamický jazyk nezna­mená slabě typovaný, jak si možná mnozí myslí. Groovy je dynamicky a přesto silně typovaný jazyk. Kompilátor vám tedy ledacos dovolí, ale běhové prostředí vás případně zastaví.

Z knihy jsem si vypůjčil příklad, jak jsou v Groovy a v Javě dispat­cho­vané metody (hrozný termín, ale překlad nemám).

Protože Groovy dispa­chuje podle typu za běhu, je v druhém případě použita imple­men­tace oracle(String). Použi­je­te-li v Javě statický typ Object, ztrácíte sílu static­kého typování.&l­t;b­loc­kquo­te>Pokud jste ve své kariéře zatím neviděli moc dynamic­kého progra­mování, můžete se ptát, k čemu to je, když jste se bez toho doposud očividně obešli.</blockquote>

Statické typování

Mnoho programátorů žije v domění, že dynamické jazyky jsou vždy pomalejší než ty staticky kompilované. To není vždy pravda. Groovy je obecně téměř stejně rychlé jako Java. Ovšem jsou situace, kdy se cena za dynamický výběr metody stane relevantní jako při optimalizaci výkonu tight loop na kritické cestě.

Anotace @TypeChecked zapíná typovou kontrolu při kompi­laci. Jedno­duše vysvět­leno třeba zde. Nicméně přijdete tak o dost dynamic­kých vychytávek a možnost přidávat metody za běhu díky metaclass, viz přiložený příklad převodu jednotek.

Number.metaClass {
    getMm = { delegate }
    getCm = { delegate * 10.mm }
    getM = { delegate * 100.cm }
}
assert 1.m + 20.cm - 8.mm == 1.192.m

Oproti tomu anotace @CompileStatic zajistí, že kód bude staticky zkompi­lo­vaný téměř do stejného byte code jako Java. Bohužel se budete muset vzdát síly Groovy meta object protokolu. Doporučuji podrob­nější vysvět­lení na InfoQ.

API

Když v práci narazíte na něco nízkoúrovňového jako třeba výrobu biomet­ric­kých cestov­ních pasů, oceníte, že Groovy má slušné API na konverzi z/do hex či base64 kódování.

Líbí se mi anotace @Delegate, díky které jsem zjedno­dušil práci s error­Collec­torem v JUnit (i když s JUnit 5 to už bude jinak).

Potře­bu­je­te-li iterovat přes všechny prvky kolekce a znát i index, použijte metodu eachWithIndex ['Petr', 'Aleš', 'Václav'].eachWithIn­dex{ item, index -> println "$index: $item" }

Stacko­verflow chybu můžete při rekurzi dostat i když máte dobře napsanou ukonč­o­vací podmínku, prostě jste potře­boval příliš mnoho paměti. Pokud máte tail-recursive funkci, to jest takovou, která posledním řádkem volá sama sebe a už nedělá nic jiného, mohli byste zásobník uvolnit. JVM takovou podporu bohužel nemá, proto je tu anotace TailRecursive, která funkci převede na itera­tivní volání. Koukněte na příklad. Ověřit můžete v GroovyConsole, kde stiskem vyvoláte ctrl + t AST (Abst­ract Syntax Tree) browser.

Při psaní paramet­ri­zo­vaných testů jsem potře­boval převést list listů na list polí foo.collect{ it as Object[] } Zjistil jsem, že to lze udělat ještě jinak a to foo*.toArray()

V GStringu zvlád­nete i lazy evaluation.

def x = 1
def y = "$x"
def z = "${ -> x}"//lazy evaluation
x = 2
assert y == "1"
assert z == "2"

Potře­bu­je­te-li synch­ro­ni­zovat metodu pro čtení, sáhněte po anotaci @WithReadLock. Pod pokličkou se používá ReentrantReadWriteLock z java.util.concurrent, ale nepotře­bu­jete psát ten balast okolo.

Groovy frameworky

Naučit se syntaxi je otázka dní, naučit se idiomy nového jazyka možná vyžaduje pár týdnů, ale pracovat s novou knihovnou může lehce zabrat několik měsíců.

Asi není potřeba vyzdvi­hovat Gradle a Grails, ale existuje spoustu další frameworků posta­vených na Groovy, které stojí za povšim­nutí. Zatím jsem nepoužil, tak si pozna­menávám i pro sebe, kdyby se mi to v budoucnu hodilo.

Deskto­pové aplikace nemusíte psát v čistém Swingu, od toho je to Griffon, který se inspi­roval u Grails.

Není nutné se učit .NET, abyste mohli vytvářet ActiveX nebo COM Windows kompo­nenty, mrkněte na Scriptom

Mám klidné spaní, jelikož nepíšu paralelní zpracování. Nicméně, pokud bych musel, sáhl bych po vyšší míře abstrakce, než jsou vlákna, třeba aktory a knihovnu GPars. Mimochodem na jeho vzniku se podílel Václav Pech.

Gebish spojuje sílu WebDri­veru (Sele­nium) s dotazo­vacími schop­nostmi jQuery, robust­ností návrhového vzoru Page Object a možnostmi jazyka Groovy.

PillarOne by měl být nástroj na modelování risku v pojišťovnictví.

Je možné psát Android aplikace v Groovy, ale vyžaduje to speciální verzi kompilátoru. Groovy posky­tuje jar soubory s klasi­fikátorem grooid.

Pustíte-li se více do Groovy, Gradle… budete potře­bovat rozum­nější zprávu insta­lací. Od toho tu je užitečný nástroj SDKMAN!, dříve GVM (Groovy enVironment Manager), inspi­ro­vaný RVM (Ruby). Milov­níci Windows mají bohužel smůlu.

Související