środa, 22 stycznia 2014

Introduce to groovy as an extension of the previous gradle post (czyli wprowadzenie do gradle cześć 2)


Groovy język skryptowy działający na JVM. Pozwalający zminimalizować kod, który robiłby  to samo a byłby napisany w Javie.

Dlaczego teraz zdecydowałem się wprowadzić Was w świat groovy?

Ponieważ chcemy przejść do najlepszych praktyk w wykorzystaniu gradle. W poprzednim poście pisałem jak działa gradle i o tym, że opiera się na groovy.
Taka kolejność postów wydaje  się być naturalnym rozwiązaniem.
Poza tym niedługo zaczniemy kodować w czysty sposób. Bliżej poznamy wtedy Guavę , Lomboka i spółkę.


Poznanie elementów groovy pozwoli na lepsze zrozumienie następnych tematów. Co więcej zdobędziesz podstawy języka i płynniej wejdziesz wtedy w grails , mało tego w linii prostej następny jest Spring Roo. I to jeszcze nie koniec - testowanie i spock stanie dla Ciebie otworem.
Ale o tym potem:).

W każdym razie znając powyższe rozwiązania , ewentualnie jeszcze scalę oraz wzorce projektowe i przekształcenia refaktoryzacyjne jesteś w stanie tworzyć naprawdę dobry kod.
Zajebisty kod. Kod który każdy będzie chciał  pracować, bo praca ta w końcu stanie się przyjemna.

Groovy :

Cechy:
- typowanie dynamiczne (typ obiektu jest sprawdzany w czasie wykonania a nie w czasie kompilacji (static typing) )

- domknięcia (closure) (fragment kodu w nawiasach {} - traktowany jako obiekt.
  Może przyjmować parametry, zwracać rezultat działania , korzystać ze zmiennych zewnętrznych oraz  być wywołany w dowolnym momencie)
Generalnie jest to  zastąpienie mechanizmu (anonymous inner classes) znanego z javy
Wykonywane tylko wtedy gdy jest do niego odwołanie.


Tip :  .& - użycie metody danego obiektu

it - zmienna deklarowana z automatu wewnątrz domknięcia. Przypisana do pierwszego parametru
- przeciążanie operatorów

- operacje na kolekcjach

- brak typów prostych (wszystko dziedziczy po object)
   Wszystko jest obiektem zarówno typy, metody, operatory czy domknięcia.

- wspiera tworzenie XML'a oraz JSON'a
     XmlParser  - wybieranie danych z XML - chodzenie po grafie XML
     XmlSlurper wybieranie danych z XML - chodzenie po grafie XML
     MarkupBuilder  - generacja XML
JSON:

- szybkie operacje na plikach
- GSQL
      groovy.sql.Sql

- POGO (Plain Old Groovy Object)  == POJO  + autogeneracja setters, getters i map-based contructors
    Redukujemy settters , getters ,constructors .
    Możemy przesłonić sobie toString
    i wygenerować equals + hashcode poprzez @EqualsAndHashCode

   @ToString
   @TupleConstructor
   @Canonical = all

  Tip : lombok (to taki sprytny skurwysyn :) patrz co potrafi : screen poniżej :))
 


Zwykły POJO : Lombok POJO: POGO: - wyrażenia regularne

- integracja z bibliotekami javy
   Z default dostajesz biblioteki :
            - java.util,
            -  java.net,
            -  java.io,
            - groovy.lang,
            - groovy.util,
            - java.math.BigInteger,
            - java.math.BigDecimal.

- GROM = groovy orm (Grails Object-Relational Mapping)
     DSL -> Hibernate
     Nosql : mongoDB , Neo4j , Redis , etc

- wsparcie do testów jednostowych
        - GroovyTestCase
        - Spock  ->  BDD  (given, expect , when/then)

- metaprogramming
     np : dodanie metody do klasy w locie
     
Tip : AOP introducing (poniżej kawałek mojego starego kodu żeby był jakikolwiek przegląd rozwiazania)

GDK - rozszerzenie JDK

println "git help".execute().text
     
Groovy zakłada że wszystko jest public!

Operatory :
.@ - dostęp do pola
?: - elvis
*. - rozpiętość
as - rzutowanie
.& - referencja metody
?. - bezpieczne nawigowanie (reduce null problem )
*.@ - rozpiętość po polach
in - zawieranie
is - identyczność
** - potęgowanie
<==> - porównanie
==! - dopasowanie wyrażenia regularnego
=~ - znalezienie wyrażenia regularnego - zwraca Matcher

Domyśle metody (DefaultGroovyMethods) :

 Boolean  any{closure}  - zwraca true jeśli domknięcie  zwróci true dla dowolnego elementu
 List  collect{closure}  - zwraca listę wszystkich elementów które zwróci domknięcie
 void  each{closure} - wykona domknięcie dla każdego elementu
 Boolean every {closure} - zwraca true jeśli domknięcie zwróci true dla wszystkich elementów
 Object find {closure} - zwraca pierwszy element do pasującego wzorca
 Integer  findIndexOf {closure} - zwraca index pierwszego elementu pasującego do wzorca
 List  findAll {closure} - zwraca wszystkie elementy pasujące do wzorca

Operacje na Stringu: 


Tools :
 - groovysh
 - groovyConsole
 - groovyc - kompilacja do .class z groovy

Tip: gvm

def - deklaracja zmiennych oraz mówimy dla Groovy , że nie interesuje nas typ zmiennej

Uważaj ! , bo :

Wartości numeryczne domyślne to : Integer i BigDecimal przy operacjach matematycznych wynik jest tego samego typu albo typu wyżej

Podczas dzielenia wynik jest podawany w Double lub BigDecimal.

"==" => equals (oznacza równość nie identyczność)

a == b
a.equals(b)
a <=> b
a.compareTo(b) 

isCase(object) w instrukcji switch - wypasiony switch

"return" , ";" oraz kropki oznaczające wywołanie metody   nie są wymagane!

Wyjątki są bliźniacze do RuntimeException

' ' - instance of  String
" " - GString

Domknięcie przykład :

Sprawdzenie identyczności obiektu poprzez is

Unikanie null
city = user ?. address ?. city

GString =  string interpolation (also called Gstring)

Pętle

Switch

Zakresy
left..right        // całość
left>..<right    // z pominięciem progów
left..<right        // pół na pół


To samo można zrobić z liczbami

GroovyBean

Definiowanie klas, interfejsów, pól, metod  podobnie jak w javie

Mapy
Tworzenie poprzez [] i każda para zawiera klucz (String default) oraz wartość którą może być dowolny obiekt
Dostęp do elementów poprzez wskazanie indeksu lub klucza w nawiasach []

Listy

Tip : Guava tworzenie kolekcji!

Generacja template'ów
    - SimpleTemplateEngine            
    - GStringTemplateEngine
    - XmlTemplateEngine

Tip : velocity


Java a  Groovy : tworzenie klas , interfejsy takie same zasady tu i tu
Groovy ma typy dynamiczne więc nie potrzebuje wykorzystywać interfejsów do operacji polimorficznych jednak pozwala je używać.

Tip : stosuj słowo kluczowe assert do weryfikacji poprawności wyniku


Podsumowując :

Chciałem wprowadzić Was łagodnie w świat języka groovy. Poznaliśmy tutaj jego totalne podstawy.
Jeśli znasz javę to widzisz podobieństwa i różnice, a jak jesteś doświadczonym programistą to od razu widzisz co warto użyć czy czerpać z groovy'ego.

Parę rzeczy jest naprawdę fajnych np closure czy obsługa xml , json etc.

Moje praktyki to :

Model POGO uzyskuje używając lomboka jest po prostu zajebisty.
Wyrafinowane operacje na kolekcjach i Stringach wykonuje stosując Guave ona jest znowu wykurwista.

To po co mi do cholery ten groovy ?
Ano po to, żeby udoskonalać gradle i stosować mix metodyk podczas wytwarzania softu.
Robić coś prościej i minimalizować ilość kodu.
No i testy : spock ... oczy śmieją się same:)
Na koniec KATA.

Jeśli uważasz, że pisze bzdury  to w następnych postach udowodnię Ci używając branch'y git'a i porównując przykładowe projekty w narzędziu kontroli jakości sonar.

Pierwszy projekt to będzie projekt pisany po 'staremu' w javie.
Natomiast  drugi projekt skorzysta ze wszystkich dobrodziejstw, które dziś w tym poście wymieniłem.

Statystyki higieny kodu będą porażające. Czytelność również i doświadczysz tego empirycznie...



przykładowy kod do tego posta znajdziesz  (klasa groovy, lombok , spock ) tutaj.

Pamiętaj też, że blog cały czas żyje. Tzn jutro już może nastąpić modyfikacja każdego posta , o jakieś wartościowe informacje i tak samo jest z repo na githubie !!!
Przykłady będą sukcesywnie rozwijane.

Bardziej wyrafinowane rzeczy z języka  groovy pokaże Wam potem w następnych postach.


czyli cdn.




Brak komentarzy:

Prześlij komentarz