Priznam se, ze nejsem zadny Javovsky expert, ale ta druha trida mne prisla +- stejne, jako by to bylo napsany v Jave. V cem je tam ta vyhoda psat to v Groovy?
Taky mam dojem, ze autor nam chtel ukazat, ze se v tom da psat stejne jako v Jave :-) Autorovi se dopredu omlouvam, ale tenhle clanek si klidne mohl odpustit. Groovy si urcite zaslouzi lepsi prezentaci.
Zaujimalo by ma naco sluzi to def pri definicii premennych resp atributov. Este v minulom dieli serialu bol takyto priklad
// dynamicky
year = 2007
// dynamicky s def
def year = 2007
Aky je tom rozdiel ?
"def" na definiciu metody to ano, ale naco je to aj pri atribute v tomto priklade:
class Product{
// promenne objektu
private def price
def vendor
....
No to "def vyzera na definiciu premennych naozaj dost prebytocne. Mato byt asi akysi syntakticky-cukor alebo syntakticky-balast ? :-)))
Ak pouzijem def mozem na 1 riadok nadefinovat viac premennych oddelenych ciarkov
def b = 'hello', c = 'World'
print "$b, $c\n"
bez def-u to nejde, toto
b = 'hello', c = 'World'
vyhodi chybu
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
D:\Groovy\example_02.groovy: 1: unexpected token: , @ line 1, column 12.
b = 'hello', c = 'World'
^
1 error
ale ked sa namiesto ciarky pouzije bodkociarka, tak to ide takto
b = 'hello'; c = 'World'
print "$b, $c\n"
"ale ked sa namiesto ciarky pouzije bodkociarka, tak to ide takto
b = 'hello'; c = 'World'
print "$b, $c\n" "
to uz pak ztraci to kouzlo operatoru carka:)
Pouziti def zalezi na tom, jestli deklarujete promenou uvnitr tridy nebo ve skriptu. V jednom pripade je to nepovinne, ale nepamatuji se u ktereho, ale je to z duvodu, ze syntakticky analyzator to nebyl v jednom z tech pripadu schopen rozpoznat ci co.
Ve skripte (groovy.lang.Script) se rozlisuji dve veci: promenne (variables) a vlastnosti (properties). Promenne jsou unikatni pouze pro skript - tridy je nemaji. Pouzitim def se definuje vlastnost bez nej je to promenna.
myslim, ze demonstrovat takto, jak to je malo ukecane je docela nestastne. zvlaste kdyz groovy umi za vas generovovat gettery a settery a kdyz navratovou hodnotu muzete vracet bez return (za urcitych okolnosti)... komentovat to vic nema smysl, takhle bych v groovy fakt neprogramoval.
Autor mel zrejme na mysli tridu, ktera obsahuje metodu main. Groovy umoznuje psani bud normalnich trid nebo tzv. skriptu. Skript prave nepotrebuje, aby byl kod zabaleny do klasicke tridy (GroovyCompiler si ji doplni sam, pri prekladu). Nicmene na skript se aplikuji trochu jina pravidla co se tyce deklaraci netypovanych promennych a v podstate treba neexistuji globalni promenne.
Groovy ma aj regularne vyrazy, tak ma napadlo, ze by sa dal vyuzit na spracovanie textu. Ale zistil som, ze regexp v Groovy funguju inac ako v Perle.
Napr, dany je subor "pokus.txt":
--------------
a
b c
2 xy
3
t 66
bcedqkq
--------------
a tu ej skript v groovy, ktory ma vypisat riadky, ktore obsahuju cislo:
--------------
// closure na spracovanie riadku
def spracujRiadok_clos ={line ->
if (line ==~ /[1-9]/) {
print "$line\n"
}
}
// main
def myfile = new File("pokus.txt")
myfile.eachLine { riadok -> spracujRiadok_clos(riadok) }
--------------
ked ho spustim, dostanem len:
3
Naproti tomu, ked si spustim obdobny skript v Perle, kde mam tiez
$line =~ /[1-9]/
dostanem to co som ocakaval:
2 xy
3
t 66
v groovy som teda pouzil
line ==~ /[1-9]/
a v Perle
$line =~ /[1-9]/
Ja si myslim, ze je to to iste, ale kupodivu neni:-)
A ono to funguje aj v Groovy. Chybne som myslel, ze v Groovy sa pouziva namiesto perlovskeho operatora =~ operator ==~ Ale je to tam takisto ako v Perle t.j. =~
Dokumentacia k tomu hovori toto:
Groovy also supports the =~ (create Matcher) and ==~ (matches regex) operators.
....
Since a Matcher coerces to a boolean by calling its find method, the =~ operator is consistent with the simple use of Perl's =~ operator, when it appears as a predicate (in 'if', 'while', etc.). The "stricter-looking" ==~ operator requires an exact match of the whole subject string.
Autorovi článku patří bezesporu dík za to, že dal dohromady článek o Groovy a snad jej trošku dostal do povědomí těch, kteří o něm zatím neslyšeli.
Na druhou stranu po přečtení takovýchto příkladů by mě ani nehnulo, abych Groovy vyzkoušel. Bylo ukázáno mnoho řádků kódu, které ale ve výsledku nedělají skoro nic. Přitom účelem skriptovacích jazyků - a Groovy mezi nimi patří k nejmodernějším - je nenapsat skoro nic a udělat toho spoustu. Myslím, že úspěch těchto jazyků rozhodně netkví v jejich schopnosti syntakticky vyjadřovat třídy a metody.
Příště to chce lepší příklad.
Ano predtym som o Groovy nepocul ani ja, ale clanok ma motivoval, aby som si ho nainstaloval a vyskusal. Zato plati autorovi moj vrely dik.
Na druhej strane demonstrovat pouzitelnost Groovy hned na zaciatku serialu na OOP priklade, ktory autor uviedol, je asi zbytocne. Pouzitie Groovy si predstavujem skor ako pouzitie skriptovacieho jazyka na Java-platforme, kde by som napriklad nemal k dispozicii nativny port Pythonu alebo Perlu. Preto by ma skor ako OOP-moznosti jazyka, zaujimalo ako robit v Groovy take veci ako sa robia v Perle a v Pythone, t.j. spracovanie textovych suborov, regularne vyrazy, pripadne SQL-databazy. Dalej technicke veci ako integracia Groovy s Javou, t.j. jak volat Groovy z Javy, jak volat Javu z Groovy, jak skompilovat Groovy do Java-Class atd...
Přesně na požadavky, o kterých píšeš, je Groovy specialista a všechno z jmenovaného dokáže s lehkostí.
Spousta příkladů je k dispozici na webových stránkách Groovy.
Vdaka autorovi za serial, ktory bude rozbiehat, ktory myslim pripominal minuly rok. Ak som v omyle tak pardon :)
Inak je dobre mat nejaky uvod do jazyka. To osobne povazujem ako zaklad. Napriklad nedavno som sa naucil ako sa deklaruju triedy v JavaScripte (1.2 vyssie). Takze ocenujem tieto uvody.
Dalej konkretne ukazky budu nasledovat spolu s Grailsami, je zbytocne teraz vymyslat koleso, ked nabuduce uz budu dostupne vsetky prostriedky na postavenie auta :) A na to sa tesim ovela viac ako vymyslat znova tie iste postupy.
V poslednej ma tiez uchvatil Adobe AIR. Moc jednoducha vec na pracu
... abych neuvedl nějaký užitečnější příklad. Tak například kolega si postahoval spoustu dokumentů z CVS. Nicméně když to dělal, tak mu ještě nebyl přidělen CVS account. Nyní už ho má, tak jak to zařídit, aby nemusel dokumenty stahovat znova a přitom komitoval změny již pod svojí identitou? Jednoduše napsat skript, co zamění uživatelské jméno v connection stringu v CVS/Root souborech. Skript níže používá jak RE, tak práci se soubory a rovněž ukazuje integraci s externímy programy (omlouvám se, ale momentálně s Windows)
První parametr je cesta k root adresáři s CVS obsahem, druhý pak nové uživatelské jméno.
new File(args[0]).eachFileRecurse { f ->
if (f.parentFile.name.equals('CVS') && f.name.equals('Root')) {
def m = f.readLines()[0] =~ '(:pserver:)(.+)(@.+)'
if (m) {
println "Modyfying ${f.path}"
def tmp = new File("${f.path}.tmp")
def out = tmp.newPrintWriter()
out.println("${m[0][1]}${args[1]}${m[0][3]}")
out.close()
"cmd /c move /Y ${tmp.path} ${f.path}".execute()
}
}
}
No a to sa mi prave na Groovy nepaci, ze neviem kedy pri definicii premennej pouzit alebo nepouzit "def". Vychodiskom je pouzivat "def" vzdy, ale to by potom Groovy definiciu bez "def" nemal vobec akceptovat.
Neni lepsi jednotna jednoducha syntaxe, nez psat v jednom zdroji deklarace promennych a metod nekolika zpusoby? Zatim me to neuchvatilo, Python (Jython) me asi zaujal vic.