31 maja 2009

Rozpoczynam lekturę "Programming Groovy: Dynamic Productivity for the Java Developer" Venkata Subramaniama

Zabrałem się za kolejną książkę z serii Groovy+Grails, tym razem dedykowaną wyłącznie językowi Groovy - "Programming Groovy: Dynamic Productivity for the Java Developer" Venkata Subramaniama z The Pragmatic Programmers. Po dwóch, wcześniejszych poświęconych Grails - The Definitive Guide to Grails, Second Edition oraz Beginning Groovy and Grails: From Novice to Professional - w których mogłem jedynie powierzchownie poznać możliwości Groovy i zmierzyć się z jego wyróżnikiem - domknięciami i metaprogramowaniem, mam możliwość skosztowania pełni jego smaku. I po pierwszej części książki - "Part I. Beginning Groovy" (130 stron) - nie mam złudzeń, że było warto. Książkę czyta się niezwykle lekko, a mnogość przykładów z towarzyszącymi im wynikami ich działania sprawia, że komputer nie jest zupełnie potrzebny. Nawet wcześniejsza pobieżna znajomość tematu nie przeszkadza. Byłem początkowo sceptyczny lekturze tej książki, bo autor wydał mi się zbyt egzotyczny, aby przedstawić temat w sposób chociaż porównywalny do tego, którym raczyli mnie przez ostatnie tygodnie panowie Graeme Rocher i Jeff Brown w "The Definitive Guide to Grails, Second Edition". Już po pierwszych stronach wiedziałem, jak bardzo się myliłem. A ile nowych słówek angielskich! Autorowi najwyraźniej sprawia dużo uciechy zabawa z językiem angielskim i robi to po mistrzosku. Potrzebujesz książki o Groovy i wielu dodatków rozszerzających wiedzę o samym programowaniu, nie tylko w Javie, sięgnij po tę pozycję. Akurat leje za oknem, więc zamiast siedzieć przed kompem czy telewizorem zabierz się za "Programming Groovy". Dobra zabawa murowana. Nawet dowcipy są takie właściwe i we właściwej ilości podane. I na koniec początku - książka przedstawia Groovy 1.5.4, więc na niektóre opisy należy wziąć poprawkę.

Książka zaczyna się wymownym cytatem o ciągłem zmianie i dostosowywaniu się do niej - "As moves the world, to move in tune with changing times and ways is wisdom". Takie nastrajające, co? A później peany na temat możliwości Groovy. Nie ma co liczyć na bezstronne spojrzenie na język Groovy - gość jest rozkochany w nim i to czuć od pierwszych kartek.

Języki dynamiczne charakteryzują się tym, że potrafią modyfikować program w trakcie działania, włączając w to strukturę obiektów, typów czy ich zachowanie. Jak to ujął autor - to co możemy w językach dynamicznych podczas uruchomienia, w językach statycznych możemy jedynie do czasu kompilacji. Wspomina się o Groovy i jego szkielecie referencyjnym Grails obok rozwiązań typu Ruby on Rails z Ruby, Django z Pythonem i Lift ze Scala (tak, o parze Lift i Scala pisze się coraz więcej, ale mnie kusi raczej do Clojure - języka funkcyjnego ala Lisp (i to zapewne tłumaczy ta mnogość wstawek w nawiasach)). Niedługo trzeba czekać, aby dotkąć kodu Groovy w książce i z początku będzie to raczej porównanie fragmentu w Javie z odpowiadającym mu funkcjonalnie fragmentowi w Groovy, aby ostatecznie poświęcić się wyłącznie cechom Groovy. Na 7. stronie pojawiają się dwa wiodące cechy Groovy - metaClass i domknięcie, które definiuje nową metodę. Autor nie zasypia gruszek w popiele.

Skrypty Groovy uruchamiamy za pomocą interaktywnego programu groovysh lub jego graficznego odpowiednika groovyConsole. Zapewne ostatecznie przyjdzie nam uruchamiać skrypty Groovy poleceniem groovy, bądź przez interpreter z poziomu Javy. W końcu jesteśmy na JVM! Jeśli wykonujemy skrypt poleceniem groovy to mamy cały kod poza klasą lub klasę z metodą static main(String[] args). Wspomina się o IDE i z nowym wydaniem Eclipse 3.5 postanowiłem sprawdzić Eclipse Groovy Plug-In (na stronie widnieje komentarz - Eclipse 3.5 : As of M7 the updateDev site appears to be functional), ale jak pisałem wczoraj w Wrażenia po instalacji Eclipse 3.5 (Galileo) RC1 i wtyczki Groovy Eclipse Plugin i później Tomek Nurkiewicz w komentarzu nie ma co liczyć na wyrafinowane wsparcie dla Groovy.

Rozdział 3. to prezentacja fragmentów kodu w Javie i Groovy oraz jego pułapek, które działają niekonwencjonalnie, tzn. działają tak, bo gdyby działały inaczej wciąż nie pozbyłyby się swej odmienności, np. użycie właściwości class na mapie. Zamiast mapa.class, która może wskazywać na klucz class albo próbę dostępu do właściwości class (przez metodę getClass()) zdecydowano postawić na to pierwsze - klucz o nazwie class. Groovy domyślnie importuje pakiety java.lang, java.util, java.io, java.net oraz java.math.BigDecimal, java.math.BigInteger z Javy i groovy.lang z groovy.util z Groovy.

Groovy rozszerza klasę java.lang.Object o metodę println (i kilka innych, o których później). Zamiast pisać metoda(param1, param2,...) można po prostu opuścić nawiasy i napisać metoda param1, param2,... W klasie java.lang.Integer znajdziemy nowe metody, a wśród nich - upto(), która pozwala na wykonanie pętli od-do, np. 0.upto(2) { print "$it " }. W tym przykładzie mamy do czynienia z kilkoma nowinkami Groovy - wspomniana metoda upto na typie Integer, przekazanie parametru do upto będącym domknięciem (mimo, że może wydawać się, że to jest ciało metody - to zabrało mi najwięcej czasu, aby zrozumieć) oraz ostatecznie wykorzystanie domyślnego parametru domknięcia it. Jeśli pętla będzie od 0 możemy wykorzystać metodę times, która jest upto od 0, np. 3.times { print "$it " }. Przeskok wartości w pętli to metoda step(doIlu, coIle), np. 0.step(10, 2) { print "$it " }. Metody i typy rozszerzające JDK nazywają się Groovy JDK (GDK). Pojawia się przykład ilustrujący uruchomienie procesu w Javie i jego odpowiednik-jednolinijkowiec w Groovy, tj. println "groovy -v".execute().text. Nie ma wątpliwości, co ma przyszłość (być leniwym zaczyna być zaletą :)). Wykonanie zmienna.własciwosc, to nic innego jak wykonanie metody getWlasciwosc().

Groovy udostępnia operator ?. - bezpieczny odczyt, który sprawdza, czy poprzedzająca wartość nie jest null i jeśli nie (tzn. nie jest null), wykonuje kolejne metody, np. str?.reverse().

W Javie musimy obsługiwać wyjątki kontrolowane (ang. checked exceptions), co często kończy się na pustym bloku catch (!) W Groovy nie, a nieobsłużone wyjątki są przekazywane wyżej, do wywołującego.

Reszta w kolejnej odsłonie, a jest tego jeszcze sporo, a że książkę czyta się lekko i przyjemnie, więc...wracam do lektury.

Przypominam, że w nadchodzący wtorek 2. czerwca 2009 z okazji wydania Eclipse 3.5 (Galileo) na MIMUWie (sala 5440, ul. Banacha 2, Warszawa) organizowana jest mini-konferencja Warszawski Eclipse DemoCamp Galileo 2009. Będzie 6 15-minutowych wystąpień związanych z Eclipse i okolic prezentowanych przez znawców tematu. Jeśli jesteś w pobliżu koniecznie zajrzyj. Już zarejestrowało się ponad 100 uczestników, więc i Ciebie nie powinno zabraknąć! Uprasza się o wcześniejszą rejestrację.