Groovy
Logo | |
Paradigma | objektově orientovaný, imperativní, skriptovací, funkcionální |
---|---|
Vznik | 2003 |
Autor | James Strachan |
Vývojář | Guillaume LaForge, Jochen Theodorou, Paul King, Cedric Champeau |
Poslední verze | 2.4.14 (24. února 2018) |
Poslední nestabilní verze | 3.0.0 Alpha 1 (25. listopadu 2017) |
Typová kontrola | dynamická, statická, silná, „duck-typing“ |
Ovlivněn jazyky | Java, Python, Ruby, Perl, Smalltalk, Objective-C |
Ovlivnil jazyky | Kotlin |
OS | Jakýkoliv podporující JVM nebo interpret JavaScriptu |
Licence | Apache License v2.0 |
Web | groovy-lang.org |
Groovy (anglická výslovnost [ˈgruːvi]) je objektově orientovaný programovací jazyk pro platformu Java. Jde o alternativu k programovacímu jazyku Java. Lze na něj pohlížet jako na skriptovací jazyk pro javovskou platformu. Inspiraci čerpal z jazyků Python, Ruby, Perl a Smalltalk. Využívá výhody objektového programování, ale zároveň poskytuje zjednodušenou „skriptovací“ syntaxi, která umí „zabalit a rozbalit“ často opakované části kódu. Jedním z jeho cílů je redukovat „povinný“ kód a zjednodušit tak tvorbu webových, databázových či desktopových aplikací. Kompilace je prováděna přímo do bajtkódu, takže jej můžeme použít všude tam, kde funguje Java.
Nastavení prostředí
Pro vývoj v jazyce Groovy je potřeba stáhnout binární distribuci např. z domovské stránky. A mít nainstalováno vývojové prostředí Java. Pak už jen stačí nastavit některé proměnné prostředí:
- přidat GROOVY_HOME proměnnou na adresář, ve kterém je uložena distribuce
- do PATH proměnné přidat cestu do adresáře GROOVY_HOME/bin
- a nastavit JAVA_HOME proměnnou na adresář, ve kterém je vaše JDK.
Následně je možné spustit groovy shell příkazem groovysh nebo GUI konzolu příkazem groovyConsole.
Některé vlastnosti jazyka Groovy
Jednoduchým příkladem může být vypsání věty „Vítej světe!“ na konzolu. V Javě je potřeba kromě samotného příkazu definovat třídu a hlavní metodu:
class VítejSvěte {
public static void main(String[] args) {
System.out.println ("Vítej světe!");
}
}
Stejného výsledku je v jazyce Groovy možno dosáhnout například následujícím jednoduchým způsobem:
println "Vítej světe!"
Takže Groovy doplní všechen ostatní kód (definici třídy a hlavní metody, detaily syntaxe jako jsou závorky) potřebný pro překlad v Javě. Jednotlivé příkazy není zapotřebí zakončovat středníkem.
Dalším zjednodušením je oblast datových typů. Datový typ se implicitně nadefinuje dle vložené hodnoty. A co víc, v případě použití pole, seznamu atd. je možné libovolně vkládat různé datové typy jako je to v následujícím příkladě:
seznamČísel = [1776, -1, 33.3333, "pět", 928734928763]
Nebo můžeme vytvořit jednoduchou mapu následovně:
výška = ["Martin":190, "Helena":155, "Věra":"Neuvedla"]
Groovy častokrát umožňuje více variant správné syntaxe, jako v následujícím příkladě:
println "Martinova výška je: " + výška.Martin
println "Martinova výška je: " + výška["Martin"]
println "Martinova výška je: ${výška.Martin}"
V posledním řádku je proměnná volána zevnitř složených závorek díky znakům ${}, které upozorňují, že uvnitř se nachází Groovy výraz. Dále můžeme vložit jednoduchý cyklus na procházení výše uvedené mapy včetně podmínky pro vypsání obsahu:
výška.each {
if (it.value == "Neuvedla") {
println it.key + " neuvedl/a svou výšku."
} else {
if (it.value < 170) {
println it.key + " měří méně než 170 cm."
} else {
println it.key + " měří nejméně 170 cm."
}
}
}
Klíčové slovo it představuje automatickou proměnnou, do které se ukládá aktuální hodnota nebo objekt. V tomto případě je to aktuální záznam v mapě. V příkladu je vidět i použití booleanovských operátorů, které jsou podobné jako v Javě a zahrnují následující možnosti:
==
!=
>
>=
<
<=
Na rozdíl od Javy však v Groovy operátor == znamená logickou rovnost pro všechny typy atributů. V Javě se např. pro porovnání obsahu dvou atributů obsahujících řetězec musí použít metoda equals().
Closures
Dalším zjednodušujícím prvkem Groovy je tzv. „closure“ [ˈkləužə(r)]. V následujícím příkladu je vidět, jak můžeme celou třídu nahradit jednoduchým closure:
Třída
public class DruháMocnina {
public static int umocni(int číslo) {
return číslo * číslo;
}
}
Closure
def c = { číslo -> číslo * číslo }
V prvním případě musíme pro vypsání mocniny čísla zavolat statickou metodu třídy DruháMocnina. U closure je metoda uložena v atributu c a pro vypsání mocniny např. čísla 99 nám stačí následující příkaz:
println c(99)
Atribut, ve kterém je closure uložena pak můžeme předávat napříč programu, jako kterýkoliv jiný atribut. Closure se na první pohled podobá klasickému bloku. Blok je však prováděn hned jak na něj překladač natrefí. Closure je potřeba explicitně zavolat.
Předcházející closure můžeme definovat ještě jednodušeji s využitím klíčového slova it.
def c = { it * it }
Proměnná „it“ v sobě automaticky ukládá parametr, který je při volání closure zadán.
Práce se soubory
Relativně jednoduchá je i práce se soubory. Následujícím scriptem vypíšeme na konzolu obsah textového souboru test.txt, přičemž každý řádek bude začínat řetězcem Řádek souboru:
soubor = new File("C:\\test.txt")
tiskniŘádekSouboru = { println "Řádek souboru: " + it }
soubor.eachLine(tiskniŘádekSouboru)
V definici cesty k souboru je stejně jako v Javě použito dvou lomítek, jelikož se jedná o escape sekvenci.
GUI
V Groovy je možné využít všechny třídy z Javovské knihovny AWT či Swing. Avšak Groovy poskytuje i svůj vlastní „SwingBuilder“, který umí vytvářet plnohodnotný GUI deklarativním způsobem. Využívá přitom tzv. Builders, které se postarají o vytváření komplexních objektů, jako například vytváření instancí potomků či volání Swingových metod. Následující příklad vytvoří malé aplikační okno s tlačítkem, které po každém stisknutí vypíše součet všech stisknutí od začátku aplikace.
import groovy.swing.SwingBuilder
import java.awt.BorderLayout as BL
počet = 0
new SwingBuilder().edt {
frame(title:'Okno', size:[300,300], show: true) {
borderLayout()
textlabel = label(text:"Click the button!", constraints: BL.NORTH)
button(text:'Click Me',
actionPerformed: { počet++; textlabel.text = "Kliknuto ${počet} krát."; println "kliknuto" },
constraints:BL.SOUTH)
}
}
Grails framework
Jedním z frameworků postavených na Groovy jazyce je Grails framework. Ten umožňuje rychlejší vytváření náročných webových aplikací. V současnosti je tento framework přímo podporován například i ve vývojovém prostředí NetBeans (od verze 6.8), které se o většinu základní konfigurace postará, a tak si můžete snadno vyzkoušet ukázkové příklady, které v sobě zahrnuje, nebo které jsou k dispozici na domovské stránce Grails. Samotný vývoj pomocí tohoto frameworku je postaven na principu „Convention over Configuration“. To znamená, že vývojář je co nejvíce odlehčen od zdlouhavého rozhodování a konfigurování, přičemž se však musí uspokojit s přednastavenou implementací.
Grails se vyznačuje tzv. architektonickým přístupem model-view-controller (MVC). Výsledkem je přehledně strukturovaná aplikace, která si, i v případě velké robustnosti, zachovává relativně snadnou obsluhu a modifikovatelnost.
Reference
- (česky) český portál o jazyku Groovy Archivováno 18. 2. 2013 na Wayback Machine.
- (anglicky) domovská stránka frameworku Grails