Wstęp Opis języka Dodatkowe możliwości Jak to działa Podsumowanie. Groovy. Michał Lenart 15.XII.2008



Podobne dokumenty
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Programowanie Obiektowe GUI

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe - 1.

KOTLIN. Język programowania dla Androida

Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

Programowanie w Javie 2. Płock, 26 luty 2014 r.

Klasy abstrakcyjne, interfejsy i polimorfizm

1 Atrybuty i metody klasowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java Server Faces - wprowadzenie

Programowanie obiektowe

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

JavaScript funkcyjność

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Facelets ViewHandler

Wykład 8: klasy cz. 4

Programowanie i projektowanie obiektowe

Język Java część 2 (przykładowa aplikacja)

PHP 5 język obiektowy

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Czym są właściwości. Poprawne projektowanie klas

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie w Internecie. Java

JAX-RS czyli REST w Javie. Adam Kędziora

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

Funkcje i instrukcje języka JavaScript

Klasy abstrakcyjne i interfejsy

Kurs WWW. Paweł Rajba.

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

SZKOLENIE TWORZENIE SYSTEMÓW

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej. Wstęp. Programowanie w Javie 2. mgr inż.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe zastosowanie języka Java SE

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Programowanie i projektowanie obiektowe

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

Programowanie obiektowe

Serwery aplikacji. dr Radosław Matusik. radmat

Metaprogramowanie w Ruby

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Programowanie obiektowe

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

PHP: bloki kodu, tablice, obiekty i formularze

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

Programowanie w języku Java 7 z biblioteką SWING

Podstawy programowania. Podstawy C# Tablice

Dokumentacja do API Javy.

Programowanie obiektowe

Programowanie MorphX Ax

Wykład 3 Składnia języka C# (cz. 2)

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Przykłady pytań do zaliczenia programu wykonywanego w ramach zajęć laboratoryjnych 6-8 z Programowania komponentowego w Javie. Zofia Kruczkiewicz

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Swing Application Framework czyli tam i z powrotem. Copyright Piotr Kochański & Erudis,

GUI - projektowanie interfejsów cz. II

Wykład 9: Polimorfizm i klasy wirtualne

Język Java część 2 (przykładowa aplikacja)

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Programowanie zdarzeniowe

Podstawy JavaScript ćwiczenia

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Tworzenie aplikacji w języku Java

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Programowanie obiektowe

Java Podstawy. Michał Bereta

Wstęp do programowania obiektowego. Wykład 2

Programowanie obiektowe

1 Podstawy c++ w pigułce.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Podstawowe informacje o technologii Java Persistence API - przykład

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Języki i techniki programowania Ćwiczenia 4 Wzorce

Od programowania wizualnego do tekstowego

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Interfejsy i klasy wewnętrzne

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Transkrypt:

15.XII.2008

Plan prezentacji Wstęp Plan prezentacji Podstawowe cechy języka Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Beans BuilderSupport

Plan prezentacji Podstawowe cechy języka Czym jest Definicja z Oxford Advanced Learner s Dictionary groovy adjective (old-fashioned, informal) fashionable, attractive and interesting to skryptowy, obiektowy język programowania ze składnią wzorowaną na Javie, inspirowany językami takimi jak Ruby, Python czy Smalltalk. Posiada wiele funkcjonalności ułatwiających życie programisty: Przeciążanie operatorów Operacje na kolekcjach (takie, jak np. w Pythonie) Obsługa wyrażeń regularnych Dynamiczne typowanie i wiele innych...

Dlaczego warto używać Plan prezentacji Podstawowe cechy języka Dla miłośników Javy: Podobna składnia Biblioteki i Javy mogą ze sobą łatwo współpracować Wygodny w użyciu - bardziej czytelny i krótszy kod Grails - zrąb do tworzenia aplikacji WWW

Plan prezentacji Podstawowe cechy języka - język skryptowy, ale z możliwością kompilacji Są dwa sposoby tworzenia klas : Dynamicznie, za pomocą groovysh lub groovyconsole Kompilacja do pliku.class za pomocą groovyc

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Hello world Najprostsza wersja: p r i n t l n H e l l o w o r l d Można też w ten sposób: c l a s s H e l l o { d e f s a y H e l l o ( ) { p r i n t l n H e l l o w o r l d s t a t i c v o i d main ( a r g s ) { new H e l l o ( ). s a y H e l l o ( )

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Podstawowe elementy składni // d e k l a r a c j a zmiennych d e f x d e f n a p i s = a s f a s d f // i n s t r u k c j a warunkowa i f ( x == 123) p r i n t l n x // w y p i s a n i e z m i e n n e j na s t d o u t e l s e p r i n t l n r ó ż n e od 123 / p ę t l a i b l o k kodu / w h i l e (! t r u e ) { p r i n t l n to s i ę n i g d y n i e powinno w y ś w i e t l i ć

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Dynamiczne typowanie Typ obiektu jest sprawdzany w czasie wykonania (a nie kompilacji) Przykład 1 - zupełnie poprawny d e f x = a s d f a x = 1234 Przykład 2 - uruchomi się, ale wyrzuci wyjątek: d e f x = a s d f a s d f x. zrobcoszesoba ( ) Można też ustalić pożądany typ w momencie deklaracji. Przykład 3 - uruchomi się, ale wyrzuci wyjątek: i n t x = 1234 x = new O b j e c t ( )

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Obiektowość Wszystko jest obiektem - brak typów prostych Wszystko dziedziczy po Object Generalnie wszystko podobnie do Javy i n t e r f a c e X { d e f x ( ) i n t e r f a c e Y { d e f y ( ) a b s t r a c t c l a s s A { d e f a ( ) { p r i n t l n 1 // d e f i n i c j a metody a b s t r a c t b ( ) // metoda a b s t r a k c y j n a c l a s s B extends A implements X, Y { d e f x ( ) { p r i n t l n 2 d e f y ( ) { p r i n t l n 3 d e f b ( ) { p r i n t l n 4 // z k l a s y A

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Domknięcie - anonimowy fragment kodu, który może zostać zapamiętany i wykonany w dowolnym momencie, a ponadto: pobierać parametry dawać wynik korzystać ze zmiennych zadeklarowanych na zewnątrz pełnią podobną funkcję jak bloki w Smalltalku. Przykład (bardzo elementarny): d e f c l o s u r e = { p r i n t l n H e l l o! // t y l k o p r z y p i s a n i e c l o s u r e ( ) // t u t a j w y p i s u j e H e l l o! na s t d o u t Przykład - z pobieraniem parametrów: d e f i l o c z y n = { x, y > r e t u r n x y p r i n t l n i l o c z y n ( 6, 7) // w y p i s z e 42

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Pytanie - co zostanie wypisane na ekran: c l a s s X { d e f getx ( ) { d e f x = 1234 d e f r e s = { x x = qwerty r e t u r n r e s s t a t i c v o i d main ( a r g s ) { d e f c = new X ( ). getx ( ) p r i n t l n c ( ) Odpowiedź - oczywiście qwerty

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Przykład z życia - zastąpienie anonimowych klas wewnętrznych (anonymous inner classes) z Javy domknięciami. Kod w Javie (brzydki): b u t t o n. a d d A c t i o n L i s t e n e r ( new A c t i o n L i s t e n e r ( ) { p u b l i c v o i d a c t i o n P e r f o r m e d ( A c t i o n E v e n t e v e n t ){ z r o b C o s P o z y t e c z n e g o ( ) ; ) ; Ten sam kod w : b u t t o n. a d d A c t i o n L i s t e n e r { z r o b C o s P o z y t e c z n e g o ( ) Generalnie dzięki temu mamy bardziej przejrzysty kod

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje UWAGA: W języku nie można stosować bloków kodu w dowolnym miejscu (jak w Javie)! To jest poprawne - w nawiasach jest blok kodu: i f ( t r u e ) { o b i e k t. zrobcos ( ) Natomiast to NIE zadziała poprawnie: d e f x = 1 { x = 2 // Domknięcie czy b l o k kodu?? Tak nie należy pisać!

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Przeciążanie operatorów Aby przeciążyć operator trzeba zdefiniować odpowiednią metodę Przykłady (nie wszystkie): Operator Metoda a + b a.plus(b) a - b a.minus(b) a * b a.multiply(b) a[b] a.getat(b) a[b] = c a.putat(b, c) switch(a) { case(b) : b.iscase(a)

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Operator == NIE jest to to samo, co == w Javie Aby sprawdzić, czy a i b to ten sam obiekt, trzeba zrobić tak: boolean arethesame = a. i s ( b ) Natomiast == znaczy to samo, co equals boolean a r e E q u a l = a == b a r e E q u a l = a. e q u a l s ( b ) // to to samo

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Operator iscase(object) - przykład: s w i t c h ( x ) { case a : zroba ( ) ; break // j e ś l i a. i s C a s e ( x ) case b : zrobb ( ) ; break // j e ś l i b. i s C a s e ( x ) d e f a u l t : nicnierob ( ) Dzięki temu switch potrafi dużo więcej, niż w Javie... s w i t c h ( x ) { case 0 : p r i n t l n z e r o ; break case 0.. 9 : p r i n t l n c y f r a ; break case F l o a t : p r i n t l n f l o a t ; break case { i t % 3 == 0 : p r i n t l n p a r z y s t e ; break case /.. / : p r i n t l n cośtam ; break d e f a u l t : a s s e r t f a l s e ; break

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Operator Elvis?: Szczególny przypadek operatora a? b : c // standardowy o p e r a t o r znany z C/C++/Java d e f g e n d e r = u s e r. male? male : f e m a l e // j e ś l i u s e r. name == n u l l to d o s t a n i e m y Anonymous d e f displayname = u s e r. name? : Anonymous

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Operator bezpiecznej nawigacji?. Można pisać tak, żeby uniknąć NullPointerException: i f ( u s e r!= n u l l && u s e r. a d d r e s s!= n u l l ) s t r e e t = u s e r. a d d r e s s. s t r e e t e l s e s t r e e t = n u l l W można tak: s t r e e t = u s e r?. a d d r e s s?. s t r e e t Dużo ładniej, a robi dokładnie to samo :)

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Napisy Standardowy napis - taki jak w Javie: d e f s t r = J a k i ś n a p i s a s s e r t s t r i n s t a n c e o f j a v a. l a n g. S t r i n g GString - dodatkowo można dodawać parametry (tak jak w bashu czy PHP): d e f x = a s d f d e f s t r = J a k i ś n a p i s $x // piszemy z a m i a s t a s s e r t s t r == J a k i ś n a p i s a s d f Wartości parametrów wyliczane leniwie - dopiero przy pytaniu o wartość! Napisy w mają dodatkowe możliwości, np: s t r. e a c h L i n e { l i n e > zrobcosz ( l i n e )

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Listy Tworzenie listy i dodawanie elementów: d e f l i s t = [ 1, 2, 3, 4, 3 ] l i s t << a s d f // d o d a n i e a s d f na k o n i e c l i s t y l i s t = 3 // l i s t == [ 1, 2, 4, a s d f ] Domyślnie używane ArrayList. Ale można też tak: d e f l i s t = new L i n k e d L i s t ( ) l i s t << e lement1 //... Uwaga: l i s t += 1 l i s t = 2 Przy użyciu += i -= za każdym razem tworzona jest nowa lista

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Zakresy Zakres jest to lista kolejnych wartości. Przykład: d e f r a n g e = 1.. 1 0 0 a s s e r t r a n g e. s i z e ( ) == 100 a s s e r t r a n g e. from == 1 && r a n g e. to == 100 a s s e r t r a n g e. c o n t a i n s ( 1 0 ) a s s e r t r a n g e i n s t a n c e o f L i s t a s s e r t! r a n g e. c o n t a i n s ( 1 0 1 ) Implementacja w czasie stałym (klasa Range) - pamięta tylko from i to Można też tworzyć zakresy dla dowolnych obiektów - nie tylko liczb

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Mapy Przykład użycia mapy: d e f map = [ key : v a l u e, ( 1 ) : j e d e n, ( x ) : i k s ] map. key2 = v a l u e 2 map [ a s d f ] = 13 map [ 2 ] = dwa Tworzenie pustej mapy: d e f map = [ : ] // o c z y w i ś c i e można t e ż t a k : d e f map = new LinkedHashMap ( )

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Ulepszona pętla for W nie używamy pętli for tak jak w Javie: f o r ( i n t i : c o l l e c t i o n ) System. out. p r i n t l n ( i ) Jest za to taka konstrukcja: f o r ( elem i n c o l l e c t i o n ) p r i n t l n elem Ponieważ Range dziedziczy po List, ten kod: f o r ( i i n 1.. 1 0 0 ) p r i n t l n i wypisze wszystkie liczby naturalne od 1 do 100

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje i kolekcje Dzięki domknięciom wiele operacji na kolekcjach jest dużo wygodniejszych: a s s e r t c o l i n s t a n c e o f C o l l e c t i o n c o l. each { x > zrobcos ( x ) // s o r t u j w o d w r o t n e j k o l e j n o ś c i r e v e r s e = c o l 1. s o r t { x, y > y. compareto ( x ) // czy c h o c i a ż j e d e n / w s z y s t k i e e l e m e n t y s p e ł n i a j ą warunek c o l. any { x > warunek ( x ) c o l. e v e r y { x > warunek ( x ) Przykład na mapie: d e f map = [ a : 1, b : 2, c : c ] d e f x = map. f i n d { key, v a l u e > key == v a l u e a s s e r t x. v a l u e == c

Podstawy Operatory Napisy i wyrażenia regularne Kolekcje Operator *. Przykład użycia operatora: d e f l i s t = [ 1, 2, 3 ] l i s t 2 = l i s t. m u l t i p l y ( 2 ) a s s e r t l i s t 2 == [ 2, 4, 6 ] Wersja równoważna: l i s t 3 = l i s t. c o l l e c t { x > 2 x

Beans Wstęp Beans BuilderSupport Aby klasy tworzone przez mogły być stosowane w Javowych zrębach aplikacji (np. JSP, EJB, JPA) powinny spełniać specyfikację JavaBeans JavaBeans to klasy Javy spełniające dodatkowe konwencje: posiadanie publicznego konstruktora bez parametrów atrybuty dostępne są przez akcesory (get, set) klasa powinna być serializowana

Beans Wstęp Beans BuilderSupport Przykład JavaBean: p u b l i c c l a s s MyBean implements j a v a. i o. S e r i a l i z a b l e { p r i v a t e S t r i n g myprop ; p u b l i c S t r i n g getmyprop ( ) { r e t u r n myprop ; p u b l i c v o i d setmyprop ( S t r i n g v a l u e ){ myprop = v a l u e ; Równoważna klasa : c l a s s MyBean implements S e r i a l i z a b l e { S t r i n g myprop

Beans Wstęp Beans BuilderSupport Przykład - kolejny Bean: c l a s s MrBean implements S e r i a l i z a b l e { S t r i n g f i r s t n a m e, l a s t n a m e S t r i n g getname ( ) { r e t u r n $ f i r s t n a m e $ l a s t n a m e oraz przykład jego użycia: d e f bean = new MrBean ( f i r s t n a m e : Rowan ) bean. l a s t n a m e = Atkinson a s s e r t Rowan Atkinson == bean. name

BuilderSupport Wstęp Beans BuilderSupport Klasa BuilderSupport służy do wygodnego tworzenia struktur drzewiastych. Przydatne do takich zastosowań jak tworzenie dokumentu HTML, XML lub GUI (np. w Swingu) W wielu językach są narzędzia, które to robią poprzez metody typu: addchild(node) addattribute(attr) setparent(node) Nie jest to ani wygodne, ani czytelne Za pomocą podklas BuilderSupport tego typu struktury można tworzyć bezpośrednio w kodzie

Przykładowy XML Wstęp Beans BuilderSupport Chcemy wygenerować taki dokument XML: <? xml v e r s i o n= 1. 0?> <h o t e l> <p o k o j nr= 1 > <gosc>jan K o w a l s k i</ gosc> </ p o k o j> <p o k o j nr= 2 > <k a r a l u c h gatunek= B l a t e l l a germanica /> <k a r a l u c h gatunek= B l a t e l l a germanica /> <k a r a l u c h gatunek= B l a t e l l a germanica /> </ p o k o j> </ h o t e l>

Generowanie XML-a w Javie Beans BuilderSupport Element h o t e l = doc. c r e a t e E l e m e n t ( h o t e l ) Element pok1 = doc. c r e a t e E l e m e n t ( p o k o j ) Element pok2 = doc. c r e a t e E l e m e n t ( p o k o j ) doc. a p p e n d C h i l d ( h o t e l ) h o t e l. a p p e n d C h i l d ( pok1 ) h o t e l. a p p e n d C h i l d ( pok2 ) pok1. s e t A t t r i b u t e ( nr, 1 ) pok2. s e t A t t r i b u t e ( nr, 2 ) Element gosc = doc. c r e a t e E l e m e n t ( gosc ) pok1. a p p e n d C h i l d ( gosc ) gosc. s e t T e x t C o n t e n t ( Jan K o w a l s k i ) f o r ( i n t i = 0 ; i < 3 ; i ++) { Element k a r = doc. c r e a t e E l e m e n t ( k a r a l u c h ) k a r. s e t A t t r i b u t e ( gatunek, B l a t e l l a germanica ) pok2. a p p e n d C h i l d ( k a r )

- MarkupBuilder Beans BuilderSupport Wersja z użyciem DOM API była brzydka. Jak to zrobić ładniej? W groovy używamy klasy MarkupBuilder: d e f w r i t e r = new S t r i n g W r i t e r ( ) d e f xml = new MarkupBuilder ( w r i t e r ) xml. h o t e l { p o k o j ( nr : 1 ) { gosc Jan K o w a l s k i p o k o j ( nr : 2 ) { f o r ( i i n 1.. 3 ) k a r a l u c h ( gatunek : B l a t e l l a germanica ) { // w y p i s z xml p r i n t l n w r i t e r. t o S t r i n g ( )

MarkupBuilder i Groovlets Beans BuilderSupport W można pisać (tak jak w Javie) Servlety. Można jest nazwać Groovlety. Dzięki MarkupBuilder można czytelnie generować kod html: import import j a v a. u t i l. Date g r o o v y. xml. MarkupBuilder s e s s i o n = s e s s i o n? : r e q u e s t. g e t S e s s i o n ( t r u e ) ; s e s s i o n. c o u n t e r = s e s s i o n. c o u n t e r? : 1 html. html { // html == new MarkupBuilder ( System. out ) head { t i t l e ( S e r v l e t ) body { p ( H e l l o w o r l d! ) s e s s i o n. c o u n t e r = s e s s i o n. c o u n t e r + 1

Budowanie GUI - SwingBuilder Beans BuilderSupport Swing - standardowa biblioteka do tworzenia GUI w Javie Posiada mnóstwo gotowych komponentów do tworzenia: okien paneli przycisków tabel i wielu innych...

SwingBuilder Wstęp Beans BuilderSupport Prosty skrypt używający GUI: swing = new S w i n g B u i l d e r ( ) frame = swing. frame ( t i t l e : Demo ) { menubar { menu ( F i l e ) { menuitem New menuitem Open p a n e l { l a b e l L a b e l 1 s l i d e r ( ) combobox ( i t e m s : [ one, two, t h r e e ] )

SwingBuilder Wstęp Beans BuilderSupport Przykład obsługi akcji użytkownika - naciśnięcia przycisku: swing = new S w i n g B u i l d e r ( ) frame = swing. frame ( t i t l e : P r i n t e r ) swing. w i d g e t ( frame ) { p a n e l { t e x t F i e l d ( columns : 1 0 ) b u t t o n ( t e x t : P r i n t, a c t i o n P e r f o r m e d : { p r i n t l n frame. t i t l e )

SwingBuilder Wstęp Beans BuilderSupport To samo, ale zapisane w inny sposób: import g r o o v y. swing. S w i n g B u i l d e r swing = new S w i n g B u i l d e r ( ) b u t t o n = swing. b u t t o n ( P r i n t ) frame = swing. frame ( t i t l e : P r i n t e r ) { p a n e l { t e x t F i e l d ( columns : 1 0 ) w i d g e t ( b u t t o n ) b u t t o n. a c t i o n P e r f o r m e d = { p r i n t l n frame. t i t l e frame. pack ( ) frame. show ( )

SwingBuilder Wstęp Beans BuilderSupport Jeszcze jeden przykład - tabela: data = [ [ n i c k : MrG, f u l l : G u i l l a u m e L a f o r g e ], [ n i c k : j e z, f u l l : Jeremy Rayner ], [ n i c k : f r a z, f u l l : Franck Rasolo ], ] swing = new S w i n g B u i l d e r ( ) frame = swing. frame ( t i t l e : Table Demo ) { s c r o l l P a n e { t a b l e ( ) { t a b l e M o d e l ( l i s t : data ) { propertycolumn ( h e a d e r : Nickname, propertyname : n i c k ) propertycolumn ( h e a d e r : F u l l Name, propertyname : f u l l )

Beans BuilderSupport Tworzenie własnego Budowniczego Istnieje możliwość tworzenia własnego Budowniczego W tym celu trzeba stworzyć podklasę BuilderSupport implementującą następujące metody: createnode(name, attributes, value) setparent(parent, child) nodecompleted(parent, node) - opcjonalnie Wówczas przykładowo foo( bar ) powoduje automagiczne wywołanie createnode( foo, bar )

Beans BuilderSupport Tworzenie własnego Budowniczego Przykładowo taki fragment kodu: b u i l d e r = new MyBuilder ( ) b u i l d e r. f o o ( ) { bar ( a : 1 ) w rzeczywistości działa tak: b u i l d e r = new MyBuilder ( ) f o o = b u i l d e r. c r e a t e N o d e ( foo ) // s e t P a r e n t ( ) w k o r z e n i u n i e ma s e n s u bar = b u i l d e r. c r e a t e N o d e ( bar, [ a : 1 ] ) b u i l d e r. s e t P a r e n t ( foo, bar ) // brak d o m k n i ę c i a d l a bar b u i l d e r. nodecompleted ( foo, bar ) b u i l d e r. nodecompleted ( n u l l, f o o )

Jak tworzy klasy Javy Problem - duck typing- jedyne co na pewno wiemy o zmiennej x, to to, że jest klasy Object: x. wykonajjakasmetode ( ) W Javie dostaniemy NoSuchMethodException Tak naprawdę skompiluje się to do czegoś w rodzaju: g e t M e t a C l a s s ( ). invokemethod ( t h i s, wykonajjakasmetode, [ ] ) Tak więc obiekt.abc() wcale nie wywołuje metody Object::abc(). Faktyczne wywołanie może być zrealizowane np. za pomocą mechanizmu refleksji Implementując interfejs Interceptible można przeciążyć operator.nazwametody

Łatwa nauka - zwłaszcza dla programistów Javy, przeciążanie operatorów, dodatkowe operacje na kolekcjach i napisach zwiększają czytelność kodu Wygodne tworzenie struktur hierarchicznych dzięki podklasom BuilderSupport Stosowany m.in. do programowania serwisów WWW (dzięki zrębowi Grails) Istnieją wtyczki do Eclipse i NetBeans wspierające. Minus: W porównaniu z Javą niestety gorsza wydajność - nie do uniknięcia.

Bibliografia Dierk Koenig with Andrew Glover, Paul King, Guillaume Laforge and Jon Skeet in action. January, 2007. Oficjalna strona projektu http://groovy.codehaus.org