21.10.2014

9 tapaa miten Groovy ja Grails tuovat ketteryyttä Java-kehitykseen

Geniem otti J2EE-sovelluksia varten jo useampi vuosi sitten käyttöön Grails-sovelluskehyksen. Grails on lisännyt kehitystyön nopeutta, yksinkertaistanut ohjelmointirutiineja ja parantanut merkittävästi sovellusten laatua, esimerkiksi yksinkertaistamalla lähdekoodin formatointia, integroimalla yksikkötestejä ja mahdollistamalla liitännäisten käytön.   1. Grails tarjoaa vankan teknologiapohjan Grailsin kolme kulmakiveä ovat Spring- ja Hibernate-sovelluskehykset sekä JVM. Spring ja Hibernate ovat jo pitkän historian omaavia […]

Geniem otti J2EE-sovelluksia varten jo useampi vuosi sitten käyttöön Grails-sovelluskehyksen. Grails on lisännyt kehitystyön nopeutta, yksinkertaistanut ohjelmointirutiineja ja parantanut merkittävästi sovellusten laatua, esimerkiksi yksinkertaistamalla lähdekoodin formatointia, integroimalla yksikkötestejä ja mahdollistamalla liitännäisten käytön.

 

1. Grails tarjoaa vankan teknologiapohjan

Grailsin kolme kulmakiveä ovat Spring- ja Hibernate-sovelluskehykset sekä JVM. Spring ja Hibernate ovat jo pitkän historian omaavia sovelluskehyksiä, joiden toimintatapa ja hyödyllisyys on varmistunut vuosien saatossa. Hibernate keskittyy tietokantatoimintoihin helpottaen niiden suorittamista ja palvelujen integrointia erilaisiin tietokantajärjestelmiin.

Spring puolestaan keskittyy järjestelmätason toimintoihin, kuten riippuvuuksien injektointiiin ja request/response -ketjun hallintaan. Grails integroi Springin ja Hibernaten saumattomasti itseensä, ja mahdollistaa molempien kyseisten sovelluskehysten toiminnallisuuksien käytön helposti ilman ylimääräistä työtä. Javan asema Enterprise-ympäristöissä on kaikille tuttu.

 

2. Grails on helposti laajennettavissa

Grailsin kehityksen kulmakivenä on laajennettavuutta – ideana on, että palvelun toimintoja tai tekniikoita voidaan laajentaa tarpeenmukaan liitännäisjärjestelmän (plugin system) avulla. Sovelluskehyksen toiminnallisuuksien laajentaminen on helpompaa, ja erilaisia liitännäisiä on enemmän kuin mitä perinteiset core-ohjelmoijat ehtisivät yksin tekemään. Skaala on laaja; legacy-järjestelmien tuesta uusimpien ohjelmistojen ja kirjastojen käyttöä helpottaviin toiminnallisuuksiin.

Avoin järjestelmä antaa mahdollisuuden rakentaa yksityiskäyttöön tarkoitettuja liitännäisiä, laajentaa olemassaolevia liitännäisiä tai luoda uusia julkisia liitännäisiä, ja siten viedä alustaa ja alustan ympärille muodostunutta yhteisöä eteenpäin. Liitännäiset ovat yksinkertainen tapa luoda toiminnallisuuskokonaisuuksia, joita käytetään monissa eri projekteissa. Hyviä esimerkkejä: Spring Security-liitännäiset , Quartz-liitännäinen, Database Migration plugin, Email-liitännäinen.

 

3. Tehokkaat abstraktiokerrokset ja periaatteet

Grails-sovelluskehyksen tarkoitus on yksinkertaistaa Java-pohjaista web-kehitystä abstraktiotasoa nostamalla, mahdollistaen kuitenkin joustavan pääsyn ja muokkaamisvaran pohjateknologioihin. Moni asia, varsinkin Hibernaten ja Springin ominaisuuksien suhteen, on abstraktoitu GORM/Grails -tasolla alkuperäistä ominaisuutta yksinkertaisemmaksi. Sovelluskehyksen suositellut ohjelmointitavat, ja yksinkertaiset, helposti muokattavat ja jaoteltavat konfiguraatiotiedostot varmistavat sen, että kehittäjän ei yleensä tarvitse toistaa toiminnallisuuksia useissa eri kohdissa lähdekoodia.

Tämä lähestymistapa seuraa periaatteesta Don’t Repeat Yourself (DRY), joka nimensämukaisesti vähentää tiedon toistamista monikerroksisessa arkkitehtuurissa. Lisäksi, useimmin käytetyt konfiguraatiot ovat oletusasetuksina järjestelmässä, joten ainoastaan standardista poikkeava data tulee asettaa tai muokata konfiguraatiotiedostoihin. Tähän ohjeistavaa periaatetta kutsutaan Convention over Configuration -periaatteeksi (CoC). Grails-sovelluskehyksen toteutuksissa logiikka on irroitettu omaksi osakseen, datan mallintaminen, CRUD-toiminnot ja datan näyttäminen samoin omina osinaan.

 

4. Kehitystyön nopea aloittaminen

Kun sovelluksen Domain-luokat on määritelty, niiden edellyttämät perustarpeet genereoidaan scaffolding-järjestelmän avulla automaattisesti. Keskeinen osa Grailsin MVC-rakennetta ovat Domain-luokat, jotka hoitavat MVC-rakenteen mallitason toteuttamisen. Domain-luokat toimivat tietovarastoina ja niiden avulla voidaan luoda tietokanta mallintamaan kyseisiä luokkia, tai Domain-luokat voidaan määritellä mallintamaan olemassaolevia tietokantatauluja. Domain-luokat pitävät perusrakenteen lisäksi sisällään rajoitukset ja asetukset, joita luokka tarvitsee toimiakseen (esim. tietokantatason indeksi-määrittelyt, avain-määrittelyt, jne.).

Näistä Domain-luokista generoidaan tarpeen mukaan kontrollerit ja näkymät, jotta MVC-järjestelmä olisi täydellinen. Näkymät ovat GSP-sivuja, eli käytännössä JSP-sivuja pienin lisäyksin ja muutoksin. Kontrolleritason automaattisesti generoidut metodit hoitavat kaikki CRUD-toiminteet. Mikäli Domain-luokan toteutus on tarpeeksi yksinkertainen, voidaan kontrolleri- ja näkymätasot jättää generoimatta, ja käyttää sovelluskehyksen scaffolding-järjestelmää. Grails-asennuksen yhteydessä asentuu komentorivikäyttöön tarkoitettu Grails Console, jonka avulla Grails-pohjaisia sovelluksia voi ajaa kehittäjän henkilökohtaisella koneella ilman lisäohjelmistojen asentamista. Näin pyörivä sovellus osaa automaattisesti kääntää muuttuneet lähdekooditiedostot tarpeen mukaan sovelluksen ollessa jatkuvasti saatavilla, joten aiemmat, kymmenien minuuttien stop-install-start -prosessit ovat kehitysvaiheessa historiaa.

http://grails.org/doc/latest/guide/theWebLayer.html http://grails.org/doc/latest/guide/GORM.html

 

5. Java-koodit ja kirjastot suoraan käytettävissä

Grailsin pääasiallinen ohjelmointikieli on Groovy, mutta koska Groovy on JVM-pohjainen kieli, ja käytännössä yksinkertaistettua ja laajennettua Javaa, voi Javaa käyttää sen rinnalla. Olemassaolevat kirjastot eivät vaadi ylimääräisiä sovituskerroksia, vaan ne voidaan ottaa käyttöön kuten Java-sovelluksissakin. Täten kirjastot ovat käytettävissä vaikka alusta vaihtuisikin Java-pohjaisesta Grailsiin, eikä aiempia työsuorituksia tarvitse toteuttaa uudestaan Grails-alustalle sopivaksi.

 

6. Riippuvuuksienhallinta

Riippuvuuksienhallinta Grailsissa suoritetaan Aetherin avulla. Aether on kirjasto, jota Mavenissa käytetään riippuvuuksienhallintaan. Järjestelmä on muiden Grails-komponenttien mukaan suoraviivaistettu niin, että riippuvuuksien notaatio on mahdollisimman yksinkertaista, mutta kuitenkin tehokasta. Lopputuloksena saadaan järjestelmä, joka kykenee noutamaan halutuista Maven-repositoryistä ja Grailsin liitännäisvarastoista helposti kaikki riippuvuudet, olivat ne sitten julkisia, yrityksen sisäisiä tai kehittäjän koneella sijaitsevia.

 

7. Luotettava ympäristö ja taustavoimat

Alunperin Groovyn ja Grailsin kehitystyöstä vastasi yritys nimelta g2One. VMware osti tämän laajentaakseen kehityspuolen toimintaansa vuonna 2008, juuri ennen SpringSourcen hankintaa. Näiden hankintojen ja muiden toimintojensa takia VMware on iso toimija, jolla on paljon kokemusta erilaisten ohjelmistojen ja sovelluskehysten ylläpidosta, kehittämisestä ja tuesta. Spring-kirjastojen ja sovelluskehysten integrointi Grails-alustaan tapahtuu nopeasti, samoin kuin yleinen kehitys, sillä Grailsin core-kehittäjät ovat erittäin aktiivisia.

Seuraava laaja päivitys Grails-alustaan on jo kehitteillä, ja siihen tullaan integroimaan uusimpia kirjastoja ja rakenteita, kuten esimerkiksi Spring Boot -kirjaston. Grailsin käyttäjäjoukko on laaja, ja joukossa on paljon suuria toimijoita, minkä takia sovelluskehys ei tule kuihtumaan vaan jatkaa kehittymistään. Yrityskäyttäjistä mainittakoon esimerkiksi Netflix, Atlassian ja LinkedIn.

https://grails.org/testimonials/7

 

8. Dynaaminen Groovy-kehityskieli

Groovy ottaa mallia Rubystä ja muista dynaamisista ohjelmointikielistä, pyrkiessään nopeuttamaan kehittäjän ohjelmointityötä. Monille tuttu Javan raskas ulkoasu on hiottu kevyempään muotoon, mahdollistaen esimerkiksi selvissä tapauksissa sulkeiden ja puolipisteiden pois jättämisen. Closuret ovat olleet käytössä Groovyssä jo yli seitsemän vuotta, ja niiden käyttö sekä rakenteiden yksinkertaisuus ovat vuosien aikana hioutuneet toimivaksi kokonaisuudeksi.

Lisäksi Groovyssä on natiivisyntaksit listoja ja mappeja varten, eikä niitä käyttääkseen tarvitse etsiskellä importattavia luokkia. Koodiin viljeltävät if(a!=null) -osiotkin ovat historiaa ?-operaattorin ansiosta, joten kehittäjä voi keskittyä syötteiden monitasoisen varmistelun sijaan ohjelmiston logiikan kehittämiseen. Lisäksi mainittakoon, että kehittäjien saama Java-koulutus ei mene hukkaan, vaan toimii pohjana organisaation Groovy-osaamisen rakentamisessa.

http://groovy.codehaus.org/Differences+from+Java

 

9. Tehokas Gradle automaatiotyökalu

Groovyä käyttää myös uusi Mavenin ja Antin perillinen, Gradle. Se on erittäin tehokas automaatiotyökalu, jolla voidaan hallita projektin useita osia yksinkertaisesti. Sen tasokkuudesta kertoo paljon se, että esimerkiksi Android-alustan uudeksi automaatio- ja koontityökaluksi valittiin Gradle, ja niin ikään Grails 3.0 tulee vaihtamaan nykyisen koontityökalunsa Gradle-pohjaiseksi. Gradlesta tulemme pitämään esitelmän QASW Summitissa, http://qasw-summit.fi/. Esitys löytyy täältä http://markogeniem.github.io 

 

Kokemuksia

Groovyyn oli kehittäjän näkökulmasta nopea päästä sisään. Alustan käyttöönotto oli yksinkertaista, eikä organisaatiossamme yhdelläkään Java-kehittäjällä ole ollut ongelmia omaksua järjestelmän perusideoita. Olemme toteuttaneet monipuolisia sovelluksia, joko kokonaisina sovelluksina tai palvelun osina (esim: JSON API:n kautta toimiva Backend), eikä rajoja ole vielä tullut vastaan. Kokonaisina sovelluksina näkymätason teknologian voi vaihtaa haluttaessa johonkin muuhun, esimerkiksi AngularJS:n avulla toimivaan järjestelmään, tai käyttää hyväksi kehittäjien JSP-kokemusta GSP-sivuja käytettäessä.