Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Groovy v příkladech: objektově orientované programování

Abraxis
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
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.
Milan
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.
MD
MD (neregistrovaný)
11. 1. 2008 11:52 Nový

Re: Proc?

celé vlákno
+1
MikRom
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?
MikRom
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"
goddard
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:)
Milan
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
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.
Filip
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
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
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...
Milan
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
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???
MikRom
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:-)
MikRom
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.
truhla
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.
mikrom
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...
truhla
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.
Uzivatel
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
Milan
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()
}
}
}
Guido
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.
Guido
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
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
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.
Zasílat nově přidané příspěvky e-mailem