Názory k článku
Groovy v příkladech: objektově orientované programování
Abraxis (neregistrovaný)
11. 1. 2008 1:53
Nový
Proc?
celé vlákno
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?
goddard (neregistrovaný)
11. 1. 2008 7:55
Nový
Re: Proc?
celé vlákno
kod je min ukecanej. je to hezky videt na metode toString()
ale vypada to ze kdyby autor chtel, mohl by to napsat stejne ukecane jako v jave.
ale vypada to ze kdyby autor chtel, mohl by to napsat stejne ukecane jako v jave.
Milan (neregistrovaný)
11. 1. 2008 8:08
Nový
Re: Proc?
celé vlákno
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.
MikRom (neregistrovaný)
11. 1. 2008 9:43
Nový
Naco "def" pri premennej/atribute ?
celé vlákno
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
....
Aky by bol rozdiel keby tam "def" nebolo?
// 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
....
Aky by bol rozdiel keby tam "def" nebolo?
MikRom (neregistrovaný)
11. 1. 2008 11:17
Nový
Re: Naco "def" pri premennej/atribute ?
celé vlákno
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"
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"
goddard (neregistrovaný)
11. 1. 2008 11:32
Nový
Re: Naco "def" pri premennej/atribute ?
celé vlákno
"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:)
b = 'hello'; c = 'World'
print "$b, $c\n" "
to uz pak ztraci to kouzlo operatoru carka:)
Milan (neregistrovaný)
11. 1. 2008 12:54
Nový
Re: Naco "def" pri premennej/atribute ?
celé vlákno
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.
MikRom (neregistrovaný)
11. 1. 2008 15:00
Nový
Re: Naco "def" pri premennej/atribute ?
celé vlákno
No v scripte to ide aj bez def aj s def.
V triede som to este neskusal, takze asi to bude v triede.
V triede som to este neskusal, takze asi to bude v triede.
Filip (neregistrovaný)
8. 2. 2008 0:10
Nový
Re: Naco "def" pri premennej/atribute ?
celé vlákno
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.
littleli (neregistrovaný)
11. 1. 2008 12:18
Nový
Nestastny priklad
celé vlákno
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.
krtek (neregistrovaný)
11. 1. 2008 12:42
Nový
Havni trida
celé vlákno
"Na rozdíl od Javy není nutné tvořit hlavní třídu"...
Co to znamená? Javu trochu znám, ale hlavní třídu jsem nikdy nepotkal...
Co to znamená? Javu trochu znám, ale hlavní třídu jsem nikdy nepotkal...
Milan (neregistrovaný)
11. 1. 2008 12:51
Nový
Re: Havni trida
celé vlákno
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.
MikRom (neregistrovaný)
11. 1. 2008 14:20
Nový
closure verzus funkcia
celé vlákno
Myslel som, ze closure je specialne na spracovanie listu, ale neni to tak, mozno pouzit aj funkciu, napr:
// closure na spracovanie riadku
def spracujRiadok_clos ={line ->
print "$line\n"
}
// funkcia na spracovanie riadku
def spracujRiadok_fun(line){
print "$line\n"
}
// main
def myfile = new File("pokus.txt")
println "Closure:"
myfile.eachLine { riadok -> spracujRiadok_clos(riadok) }
println "\nFunkcia:"
myfile.eachLine { riadok -> spracujRiadok_fun(riadok) }
Jaky je potom rofdiel medzi Closure a Funkciou???
// closure na spracovanie riadku
def spracujRiadok_clos ={line ->
print "$line\n"
}
// funkcia na spracovanie riadku
def spracujRiadok_fun(line){
print "$line\n"
}
// main
def myfile = new File("pokus.txt")
println "Closure:"
myfile.eachLine { riadok -> spracujRiadok_clos(riadok) }
println "\nFunkcia:"
myfile.eachLine { riadok -> spracujRiadok_fun(riadok) }
Jaky je potom rofdiel medzi Closure a Funkciou???
MikRom (neregistrovaný)
11. 1. 2008 14:47
Nový
regex
celé vlákno
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:-)
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:-)
MikRom (neregistrovaný)
11. 1. 2008 15:46
Nový
Re: regex
celé vlákno
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.
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.
truhla (neregistrovaný)
11. 1. 2008 22:25
Nový
zoufale slabý příklad Groovy
celé vlákno
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.
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.
mikrom (neregistrovaný)
12. 1. 2008 12:06
Nový
Re: zoufale slabý příklad Groovy
celé vlákno
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...
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...
truhla (neregistrovaný)
13. 1. 2008 16:04
Nový
Re: zoufale slabý příklad Groovy
celé vlákno
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.
Spousta příkladů je k dispozici na webových stránkách Groovy.
Uzivatel (neregistrovaný)
13. 1. 2008 11:30
Nový
Treba vyckat
celé vlákno
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
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
Milan (neregistrovaný)
13. 1. 2008 14:18
Nový
Nedá mi to...
celé vlákno
... 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()
}
}
}
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()
}
}
}
Guido (neregistrovaný)
14. 1. 2008 9:43
Nový
Ten privní příklad je špatně, ne?
celé vlákno
No já Groovy nepoužívám, ale hned ten úvodní příklad mi nefunguje. Možná něco nevím nebo dělám špatně. Ale:
Před proměnnou třídy je potřeba definovat její typ, tedy String name.
A u metody je potřeba definovat její návratový typ, čili void bark().
Teprve potom mi to jde vůbec spustit.
Před proměnnou třídy je potřeba definovat její typ, tedy String name.
A u metody je potřeba definovat její návratový typ, čili void bark().
Teprve potom mi to jde vůbec spustit.
Guido (neregistrovaný)
14. 1. 2008 9:58
Nový
Re: Ten privní příklad je špatně, ne?
celé vlákno
Anebo u té proměnné třídy musí být def (def name).
MikRom (neregistrovaný)
14. 1. 2008 20:36
Nový
Re: Ten privní příklad je špatně, ne?
celé vlákno
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.
uf (neregistrovaný)
5. 8. 2008 7:20
Nový
neni lepsi jednotna syntaxe?
celé vlákno
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.

