Groovy

Podobné dokumenty
PowerPoint Presentation

enum

PowerPoint Presentation

História

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Identity Lifecycle Management

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

Identity Lifecycle Management

Microsoft PowerPoint - OOP_prednaska_10.pptx

DediĊnosť

Objektovo orientované programovanie

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

midterm2019

03_ControlFlow.dvi

Princípy tvorby softvéru Programovacie paradigmy

midterm2014_1

Konkurentné programovanie

NÁVRH UČEBNÝCH OSNOV PRE 1

Písomný test k predmetu Tvorba informačných systémov, pondelok, 16.januára 2012, čas: 120 minút. Odpovede píšte priamo k otázkam, ak potrebujete viac

Identity Lifecycle Management

Súkromné gymnázium, Česká 10, Bratislava INFORMATIKA

Katalóg cieľových požiadaviek k maturitnej skúške

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

Microsoft Word - prirucka_katedry_nova

Výnimky

(Microsoft Word Zadanie na s\372\235a\236 KROS DESIGN AWARD .doc)

MO_TČOZ_TLY_2018_2019

PowerPoint Presentation

MO_pred1

7/1/2015 Úvod do databáz, skúškový test, max 25 bodov, 90 min

ECDL Syllabus V50 SK-V01

Pravidelné úlohy verzia ku dňu SEAL IT Services, s.r.o. Kontakt: SEAL IT Services, s.r.o., Topoľová 4, Bratislava 1, tel.:

PowerPoint Presentation

IT NEWS

Súťaž Vráťme knihy do škôl je tu už po 8-krát! O súťaži Občianske združenie Učenie s úsmevom v spolupráci s partnermi internetové kníhkupectvo abcknih

Vývoj geografických aplikácií v GIS

Funkcie viac premenných

bakalarska prezentacia.key

OPIdS - finančné riadenie

Matej Kendera - PDF, word, lucene, java

GEODETICKÝ A KARTOGRAFICKÝ ÚSTAV BRATISLAVA Chlumeckého 4, Bratislava II Obsah 1. Export údajov ZBGIS do CAD formá

Microsoft Word - Priloha_1.docx

Snímka 1

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

Používateľská príručka POUŽÍVATEĽSKÁ PRÍRUČKA Generátor XML dávok pre Informačný systém kontrolných známok z MS Excel šablóny Dátum: Verzia

NSK Karta PDF

Import absencí z ASC

Metódy násobenie v stredoveku

Databázy (1) - Prednáška 03

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Identity Lifecycle Management

Style Sample for C&N Word Style Sheet

Poloautomatická anotácia stránok internetových obchodov Dávid Varga 4Ib, Abstrakt. Bakalárska práca sa zaoberá vytvorením metód na indukciu

Intellectual Property, Psychology and Sociology

PowerPoint Presentation

gis5 prifuk

Predstavenie tímu Náš tím pozostáva zo siedmich členov: Andrej Hucko, Jakub Domian, Ľubomíra Trnavská, Ján Karaffa, Ľudovít Popelka, Dušan Janeček a Z

Slovenská technická univerzita v Bratislave FAKULTA INFORMATIKY A INFORMAČNÝCH TECHNOLÓGIÍ Ilkovičova 3, Bratislava Tímový projekt Ponuka Grafi

Riesenie_zasielkovna

Tomáš Jelínek - včely vyhľadávanie

eKasa

Microsoft Word - o09_Používateľská príručka ku kontrole kupónov na webe_v4.doc

Relačné a logické bázy dát

Teória pravdepodobnosti Zákony velkých císel

Microsoft Word - skripta3b.doc

Úvod do mobilného operačného systému ANDROID

(Microsoft Word - Registr\341cia \372\350tu Hik-Connect.docx)

Navigácia po úvodnej stránke elektronickej schránky Dátum zverejnenia: Verzia: 10 Dátum aktualizácie: Navigácia po úvodnej st

Operačná analýza 2

Slide 1

Republika Srbsko MINISTERSTVO OSVETY, VEDY A TECHNOLOGICKÉHO ROZVOJA ÚSTAV PRE HODNOTENIE KVALITY VZDELÁVANIA A VÝCHOVY VOJVODINSKÝ PEDAGOGICKÝ ÚSTAV

Úvod do lineárnej algebry Monika Molnárová Prednášky 2006

iot business hub whitepaper isdd_em_New.pdf

prijimacky 2014 MAT 4rocne ver A.doc

dFlex Nitra spol. s r.o.

4. Pravidlo ret azenia. Často sa stretávame so skupinami premenných, ktoré zložitým spôsobom závisia od iných skupín premenných. Pravidlo ret azenia p

(Microsoft Word - Tuzemsk\341 a zahrani\350n\341 jazda \232tandardn\341 jazda.docx)

Pracovný postup pre vypĺňanie údajov elektronického formulára IŠIS pre spravodajskú jednotku 1

Snímka 1

Distance search Ján Garaj Fakulta informatiky a informačných technológií Slovenská technická univerzita Školský rok: 2008/09 Popis problému a motiváci

eKasa

INTERNET BANKING Ako zrealizovať hromadný prevod VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

eKasa

Algoritmizácia a programovanie - Príkazy

Microsoft Word - 6 Výrazy a vzorce.doc

10 tipov pre tvoj forex úspech

Akreditácia vzdelávacích programov – projekt MVP

MEN Kvapka informácií pre chlapcov

Spustenie založenej VM mimo vmware ESX

Microsoft PowerPoint - SLIDES_02DTD.ppt

SAEAUT SNMP OPC Server

Metódy dokazovanie v matematike 1 Základné pojmy Matematika exaktná veda vybudovaná DEDUKTÍVNE ZÁKLADNÉ POJMY základy každej matematickej teórie sú in

Prepis:

Groovy Agilný dynamický jazyk pre platformu Java Róbert Novotný (apríl 2013)

Skriptovacie jazyky cieľ klasické jazyky: udržovateľnosť / výkonnosť nízkoúrovňové: C, C++: výkonnosť obvykle objektové jazyky: Java, C#,...: určené na megaprojekty existuje však kopa úloh, kde je dôležité,,rýchlo niečo zbúchať", aby to fungovalo udržovateľnosť ide bokom výkon programu nie je dôležitá rapid prototyping: nástrel softvéru, na ktorom sa odladí dizajn a utrasú používateľské požiadavky

História Dávno-pradávno: Unix napísaný v C, C napísané v Unixe Písať programčeky v C však nie je ktoviečo UNIX našťastie: mnoho jednoúčelových nástrojov spájaných do kolóny shell skripting Čo keby sme mali jazyk, ktorý niečo také zvláda? prelom 80./90 rokov: Perl

Niektoré piliere skriptovacích jazykov Hlavne nech to ide! Časté veci do knižnice! Účel svätí prostriedky Kompilácia nie je nutná Dátové typy zdržujú nie rýchlosť spracovanie textu práca so zoznamami ľahké IO XML procedurálne funkcionálne objektové skript sa interpretuje dokola typy sa určia za behu alebo vôbec neexistujú

Expanzia skriptovacích jazykov PHP Ruby Perl skriptovacie jazyky AWK Python AWK: spracovanie textových súborov Perl: praotec PHP: pôvodne webový, dnes univerzálny pôvodne výhonok Perlu Python: objektovoorientovaný, integrácia s C fyzici ho milujú Ruby:,,silnejší než Perl, viac OO než Python"

Java a skriptovacie jazyky Java je stabilne top jazyk na vývoj veľkých systémov lenže má nevýhody ukecaná treba virtuálny stroj bez IDE sa takmer nič zmysluplné nedá napísať lenže má výhody multiplatformnosť tona knižníc bublajúci kotol nových technológií istota v zamestnanosti

Čo keby sme spojili výhody? multiplaformnosť + knižnice + jednoduchosť skriptovania riešenie už existuje Jython = Python na Jave JRuby = Ruby na Jave Rhino = JavaScript na Jave Groovy!

dynamicky typovaný OOP jazyk beží nad JVM Groovy základná idea: keďže poznáme Javu, odpichneme sa od nej a dodáme veci, ktoré poznáme z iných jazykov a chceme ich mať v Jave Groovy = Java++

Java public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Groovy public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Java vs Groovy: nájdi 2 rozdiely kde je rozdiel? println "Hello World" HelloWorld.groovy c:\java\groovy\bin> groovy HelloWorld.groovy skript bude interpretovaný!

Integrácia s Javou integrácia s Javou funguje magicky! ľubovoľnú triedu importneme a ideme klasické balíčky sú automaticky importnuté (java.util, java.net...) ale i naopak: skompilovaný Groovy súbor je klasický.class vieme ho tak normálne používať v bežnej Jave

Dynamicky typovaný jazyk dátové typy nemusíme uvádzať message = "Hello" println message všimnime si bodkočiarky nemusíme písať dátový typ pre message sa určí automaticky println je voľne poletujúca funkcia (sťa Pascal) dokonca ani zátvorky netreba písať

Dynamicky typovaný jazyk dátový typ sa určí podľa priradzovanej hodnoty v situácii keď nepoznáme dátový typ, použijeme def def message = "Ahojte!" println message String message = "Ahojte!" println message v skriptoch môžeme def vynechať premenná sa stane globálnou

Kolekcie: skrátený zápis Java má svojský zápis pre inicializáciu kolekcií List<String> mená = Arrays.asList( "John", "Graham", "Terry"); Groovy zoznam: mená = ["John", "Graham", "Terry"] kľúč sa automaticky prevedie na String Groovy mapa: mapa = [meno: "Iron", priezvisko: "Maiden"]

Kolekcie získanie hodnoty: C# / PHP style println mená[0] println mapa[meno] ak chceme, môžeme klasicky mená.get(0) pridanie prvku mená << "Ringo" // alebo novémená = mená + "Ringo"; ak chceme, môžeme klasicky mená.add()

Preťažovanie operátorov objekt má metódy, na ktoré sa mapuje volanie operátorov << sa mapuje na leftshift() na java.util.collection [] sa mapuje na getat()... preťažovanie bolo z Javy zámerne vynechané (zlé skúsenosti z C++)

Triedy opäť jednoduchá syntax class Pes { def rasa; def vek; def pes = new Pes(rasa: "chrt", vek: 10) println pes.rasa println pes.vek automaticky generované konštruktory inštančné premenné môžeme uviesť s typom alebo cez def ak neuvedieme modifikátor viditeľnosti (private...), automaticky sa vygenerujú gettre a settre

Prístup k premenným používame bodkovú notáciu, automaticky sa volajú gettre a settre pes.majiteľ.meno pes.majiteľ.meno = "Jozef"; pes.getmajiteľ().getmeno() existuje bezpečná navigácia pes?.majiteľ?.meno = funguje aj v prípade, že je pes.getmajiteľ() == null inak by sme dostali NullPointerException

Reťazce reťazce fungujú klasicky, ale môžeme v nich používať odkazy na premenné class Pes { def rasa def vek String tostring() { return "Rasa: ${rasa Vek: ${vek"; Interpolácia. Dosadia sa skutočné hodnoty.

Intervaly (ranges) a cykly for(i in 0..2) { println "Hello" interne reprezentované ako zoznamy 0..<3 sprava otvorený 0..<3.contains(3) == false interval je zoznam

Funkcie funkcie môžeme pchať kam len chceme, nemusia byť v metódach ak nevieme, aký typ vraciame, píšeme def parametre môžu mať implicitné hodnoty def vypíš(hodnota, opakovaní = 3) { for(i in 0..<opakovaní){ println hodnota vypíš("budem si robiť DÚ")

Kamenitá cesta k funkcionálku Úloha! Z daného poľa vráťte len tie prvky, ktoré spĺňajú podmienku klasické riešenie: vytvorme nové pole prechádzame pôvodné pole for-om if (prvok spĺňa podmienku) potom hoď do výsledného poľa vráť výsledné pole napríklad žiakov, ktorých mená sa začínajú na "Z"

Kamenitá cesta k funkcionálku čo ak chceme raz študentov "Z"-ovcov? potom zase študentov, ktorých mená začínajú na "A" potom študentov, ktorí majú aspoň 1 predmet? potom študentov, ktorí... zbesilo kopírujeme cyklus, mení sa len podmienka úloha typu: zober dáta a niečo s nimi sprav zoznam študentov iteruj filtruj

Kamenitá cesta k funkcionálku podmienka "začína na Z" je vlastne pravdivostná funkcia berie študenta, vracia true/false všetky úlohy sú potom o: zober dáta, zober funkciu na každý prvok dát aplikuj funkciu ak sú dáta objektami, prečo aj funkcia nemôže byť objektom? Funkcia môže mať ľubovoľný kód, nielen pravdivostný Kód sa stáva objektom!

Funkcionálna mentalita našu úlohu vyrieši funkcionálnik takto: funkcionálnik vytvorí inštanciu funkcie... lambda výraz a.k.a. closure...ktorá má jeden parameter a vracia parameter metóda filtrujúca študentov potom dostane 1 zoznam (dáta) 1 closure (funkcia) môžeme tak zuniverzálniť problém

Funkcionálna mentalita def hľadajštudentov(list<student> dáta, Closure funkcia) { def filtrovanistudenti = [] for(student s : dáta) { if(funkcia.call(s)) { filtrovanistudenti << s def podmienka = { Student student -> def študenti =... return student.priezvisko.startswith("z") println hľadajštudentov(študenti, podmienka)

Closures sú na každom kroku Úloha! Vypíšte trikrát Ahoj svet! for(int i = 0; i < 3; i++) { System.out.println("Ahoj svet!"); Java mentalita Trikrát vykonaj closure, ktorý nemá parameter a vracia nič! Groovy mentalita 3.times { println "Ahoj svet!"

Closures sú na každom kroku Úloha! Vypíšte trikrát Ahoj svet! 3.times { println "Ahoj svet!" Groovy mentalita 3 je konštanta čísla v Groovy sú objekty (v Jave: primitívy) s metódami times() je metóda na čísle ako parameter berie closure, ktorý sa má vykonať

Closures sú objekty def druhámocnina = { Integer číslo -> return číslo * číslo println druhámocnina(2) naľavo od šípky: deklarácia argumentov funkcie napravo od šípky: kód sťa v normálnej metóde println druhámocnina.call(2) closure je objekt typu groovy.lang.closure

Closures sú objekty def druhámocnina = { Integer číslo -> return číslo * číslo def druhámocnina = { číslo -> return číslo * číslo dátový typ netreba def druhámocnina = { return it * it closure má automatický parameter it def druhámocnina = { it * it návratovou hodnotou je výsledok posledného vykonaného výrazu

Iterovanie cez kolekcie: each def mená = ["John", "Graham", "Terry"] mená.each { println it each berie parameter typu closure it automaticky dostupná premenná v closure, tu obsahuje aktuálny prvok

Hľadanie prvého prvku spĺňajúceho podmienku: find def mená = ["John", "Graham", "Terry"] def gmeno = mená.find { it.startswith("g") find berie parameter typu closure closure určuje booleovskú podmienku pre hľadaný prvok it automaticky dostupná premenná v closure, tu obsahuje aktuálne skúmaný prvok

Hľadanie všetkých prvkov spĺňajúcich podmienku: findall def mená = ["John", "Graham", "Terry"] def gmená = mená.findall { it.startswith("g") findall berie parameter typu closure it automaticky dostupná premenná v closure, tu obsahuje aktuálne skúmaný prvok

Transformácie vstupných prvkov: collect veľkémená = mená.collect{ it.touppercase() Terry John Michael Graham TERRY JOHN MICHAEL GRAHAM vráti nový zoznam, kde každý prvok prejde nejakou transformáciou transformácia je daná pomocou closure

Transformácie vstupných prvkov: collect alternatívny zápis veľkémená = mená*.touppercase() samozrejme, môžeme mapovať prvok na úplne iný typ vhodné pre úlohy, kde mapujeme prvok na číslo

Komplexný príklad: indický vynálezca šachu odmena za vynález šachu? zrno na políčkach šachovnice. na prvom políčku 1 zrnko, na druhom 2, na každom dvojnásobok predošlého políčka (0..<64).collect { 2 ** it.sum()

Ako hrať Swing jednoduchšie final JButton button = new JButton("Push me!"); button.addactionlistener(new ActionListener(){ public void actionperformed(actionevent event){ System.out.println(button.getText()); ); po closures najviac túžia vývojári Swingu Java syntax je totiž dosť hrôzostrašná anonymné vnútorné triedy...

Ako hrať Swing jednoduchšie def button = new JButton("Push me!") button.actionperformed = { println button.text listenery sú nič iné než kusy kódu, ktoré sa majú vykonať po vyvolaní udalosti v Jave: vo verzii 8 (jeseň 2013)

Príklad na SQL import groovy.sql.sql sql = Sql.newInstance( "jdbc:mysql:localhost/test", "username", "password", "com.mysql.jdbc.driver") sql.eachrow("select * from tablename", ); { println it.id + " -- ${it.firstname --" eachrow berie dva parametre: dopyt a closure, ktorý sa zavolá pre každý riadok

Práca so súbormi je malina new File("studenti.txt").eachLine { println it otvorenie a zatvorenie súboru sa deje automaticky súbor = new File("studenti.txt"); súbor << "Jozef Mak" súbor << "Ringo Starr" stále máme možnosť používať klasický prístup out = new File("studenti.txt").newPrintWriter() out.println("jozef Mak")

Duck typing class Kačka { plávaj() { println "Čľap čľap" Ak to pláva ako kačka a lieta ako kačka, je to kačka. class Žralok { plávaj() { println "Čľap ham" vodnéživočíchy = [new Žralok(), new Kačka()] vodnéživočíchy.each { it.plávaj() V Jave by Kačka i Žralok museli implementovať interfejs Plávajúci s metódou plávaj().

Expandos: totálne dynamické triedy pes = new Expando() println pes.meno //null náš pes na začiatku nevie nič! pes.meno = "Rex" println pes.meno //Rex naučíme ho vlastné meno pes.stekaj() //null pes.stekaj = { počet -> return "haf!" * počet println pes.stekaj naučíme ho štekať Expandos umožňujú za behu pridávať inštančné premenné a metódy.

Regulárne výrazy Umožňujú filtrovať text, vyhľadávať... veľký hit v Perle a Awku špeciálna syntax: operátor =~ zhoda = "Ringo Starr" =~ /^R/ začína sa reťazec na R? vytvára objekt java.text.matcher ak treba vyhodnotiť podmienku, vracia true v prípade, že je regulárny výraz splnený

Regulárne výrazy mená = ["Ringo Starr", "Terry Jones", "Terry Gilliam"] menátg = mená.findall { it =~ /T(.+) G/ Má meno iniciály T G? dáta = [2009, 2010, 2OLL, 2011] println dáta.findall { it ==~ /\d+/ ==~ Pozostáva vstup z cifier?

Regulárne výrazy operátor =~ hľadá zhodu podreťazca operátor ==~ hľadá celý reťazec mená = ["Ringo Starr", "Terry", "Terry Gilliam"] terryovci = mená.findall { it =~ /Terry/ "Terry", "Terry Gilliam" mená = ["Ringo Starr", "Terry", "Terry Gilliam"] terryovci = mená.findall { it ==~ /Terry/ "Terry"

Regulárne výrazy: skupiny dáta = "meno=peter priezvisko=malý mesto=košice" matcher = (dáta =~ /\S+=(\S+)/) matcher.each { println it[1] slovo, znak =, slovo matcher sa dá iterovať hľadá všetky zhody (v príklade: 3 zhody) každá zhoda je pole 0. prvok: celý text zhody 1. prvok: obsah prvej skupiny, 2. prvok = 2. skupina...

XML trieda XMLSlurper vráti XML ako objekt, na ktorom možno volať inštančné premenné def rss = new XmlSlurper().parse( "http://web.ics.upjs.sk/webcalendar/rss.php") rss.channel.item.each{ println it.title názvy akcií na ÚINF PF UPJŠ rss.channel.item[0..<3].each{ println it.title tri najbližšie akcie

MarkupBuilder umožňuje budovať XML návrhový vzor Builder je všadeprítomný XML umožňuje ľahko definovať doménovo špecifické jazyky (DSL) import groovy.xml.*; new MarkupBuilder().psi { pes( id:1 ) { meno("rex") vek(5) <psi> <pes id='1'> <meno>rex</meno> <vek>mak</vek> </pes> </psi>

pocet = 0 SwingBuilder: rýchle budovanie UI new SwingBuilder().edt { frame(title:'frame', size:[300,300], show: true) { borderlayout() textlabel = label(text:"kliknite na tlačidlo!", button(text:'klikni!', actionperformed: {, count++ constraints: BL.NORTH) textlabel.text = "Počet klikov: ${pocet" constraints:bl.south) import groovy.swing.swingbuilder import java.awt.borderlayout as BL

Zhrnutie Groovy je Java++ opravuje množstvo kritík smerovaných na jazyk prečo primitívy a objekty? prečo porovnávame cez equals() prečo odchytávať mnoho výnimiek? prečo je I/O zložité? prečo nemáme delegátov z C#? prečo na HelloWorld potrebujem triedu a päť riadkov? prečo nemáme preťaženie operátorov?

Zhrnutie Groovy poskytuje možnosť používať plný repertoár Javy a dodáva množstvo syntaktického cukru výborné na rýchle prototypovanie aplikácií rýchly vývoj má daň udržiavateľnosť množstvo vecí sa deje "automaticky", kód sa rýchlo píše, ale zložito číta môžeme prísť o výhody ako refactoring...

Literatúra http://www.root.cz/serialy/groovy-vprikladech/ - český seriál Tutoriál Fluently Groovy (IBM): http://www.ibm.com/developerworks/edu/jdw-java-jgroovy-i.html Groovy in Action (Manning, 2007) Groovy Applet: http://metawidget.sourceforge.net/livedemo/demo.html