Java-l on ökosüsteem, mis on küpsenud aastatepikkuse arengu jooksul, luues selle üheks kõige usaldusväärsemaks platvormiks seal. Sellel puuduvad aga vajalikud vahendid töö kiireks tegemiseks, eriti veebirakenduste jaoks. Püüdes seda tüüpi probleemides pettumusi vältida, valivad arendajad sageli rakenduskeeled ja nende kaasaegsed veebiraamistikud, näiteks Ruby with Rails on Rails, Python with Django jne. Erinevalt Java-st pakuvad need veebirakenduse loomiseks palju sujuvamat teed.
Õnneks on Java-arendajatele, kes soovivad veebirakendusi ehitada, seal on parem viis ja see hõlmab Graalsi. Selles artiklis näeme, kuidas Grails koos Groovyga on JVM-i valdkonnas toimiv alternatiiv. Vaatame mõningaid näiteid, kus Grails pöördub meie poole Java-arendajatena ja võib kiusata kedagi teist ka sellele pildistama.
Startupis, kus töötasin, oli meil just see probleem. Meil oli kevadine rakendus, millega oli valus töötada. Selle suurenedes leidsime peagi, et funktsionaalsuse taastamine ja lisamine viis meid kauem, kui peaks. Selle ühendamine mõne muu motivatsiooniga viis meid otsustama oma põhirakenduse ümber kirjutada. Olime avatud ka olemasoleva tehnoloogiapaki muutmisele või asendamisele. Grails nägi välja kui toimiv valik, kuna see töötab JVM-is ja on ehitatud juba tuttavate tehnoloogiate peale. See kasutab Groovy programmeerimiskeelt, kuid võimaldab samal ajal seda Java-ga segada. Niisiis astusime sammu.
Üks asi, millest Grails tõeliselt silma paistab, on uue projekti alustamise lihtsustamine. See on sama lihtne kui käsu käivitamine, mis loob projekti struktuuri koos kõigi kaustadega, mida vajate hiljem lisatavate klasside jaoks. Mudeliklasside, kontrollerite, teenuste ja veebilehtede lisamine võtab sama vähe jõupingutusi. Ainuke asi, mille eest peate hoolitsema, on kraami õigesti nimetamine ja paigutamine. Erinevalt Java-st pole praktiliselt ühtegi katlakoodi, mis peaks seal olema lihtsalt sellepärast, et see peaks olema. See on osaliselt võimalik tänu Graalsi kaheks alustalaks oleva Spring ja Hibernate, samuti tavapärase kodeerimise kontseptsiooni abil. Projekti käivitamiseks on Grailsil kaasas arendusserver Apache Tomcat. Peame vaid projekti IDE-s käivitama ja server käivitatakse, kui meie kood on paigutatud. Samuti Grailsi objektide suhteline kaardistamine (GORM) koos Hibernate'iga hoolitseb meie jaoks andmebaasi loomise eest. Olemasoleva andmebaasi kasutamiseks peame konfigureerima JDBC ühenduse atribuudid või jätma selle vaikimisi mälusisendi kasutamiseks. Kui Grailsiga server töötab (võtab natuke rohkem kui Spring MVC rakendus), saame koodi muuta ja kuuma juurutamise funktsioon hoiab meie silumisseansi varustatud uusima versiooniga. Ainsad klassid, mida sel viisil uuesti laadida ei saa, on olemite klassid.
Andmebaasi täitmine on võimalik SQL-i skriptide abil, kuid see võib muutuda tüütuks. Kõik Grailsi projektid sisaldavad klassi Bootstrap, mis käivitatakse meie rakenduse käivitamisel. Selles klassis saame andmeid salvestada või muuta ja seega lähtestada meie rakenduse olek. See osutus meie jaoks väga kasulikuks, nii et meil on kohe mõned arendusversioonis olevad testijuhtumid.
Klassis Bootstrap saame keskkonnatüübi (arendus, testimine, tootmine jne) kontrollimiseks kasutada ka tingimusi “kui” ja andmeid vastavalt muuta.Üks asi, mis Grailsiga kohe meie tähelepanu köitis, oli andmetega töötamise lihtsus. Andmebaasist lugemine on ülesanne, mida tuleb ikka ja jälle teha. Ja mitu korda on see lihtne. Nagu ühe või mitme üksusele, mis vastavad teatud kriteeriumidele, toomine ja seejärel nende liitmine. Miks mitte kasutada selleks dünaamilist leidjat? See on viis andmete pärimiseks, kus meetodid on dünaamiliselt loodud käitamise ajal. Kõik, mida peate tegema, on järgida nimetamiskorda.
def users = User.findAllByLastNameLikeOrAgeGreaterThan(‘Doe%’, 30)
Rea kohal olev rida tõmbab kõik kasutajaobjektid perekonnanimega, mis algab tähega “Doe” või vanusega üle 30. Jah, see pole eriti keerukas juhtum, kuid saate ülevaate.
Mis oleks, kui me tahaksime seda loendit lisaks filtreerida ka nende jaoks, mille atribuut „FailLogins” on suurem kui 10? Ja mis oleks, kui me tahaksime neid sortida nende loomise kuupäeva järgi? Ja mis oleks, kui me tahaksime nende eesnimed kokku liita või leida kasutajate maksimaalne vanus tagasi?
users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(‘, ‘) def maximumAge = users.age.max()
Ülaltoodud näited võivad tunduda lihtsad, kuid need näitavad, kui võimsad võivad Graalid olla andmete päringuteks, filtreerimiseks ja manipuleerimiseks. Java 8-s saate mõne sellise juhtumi puhul saavutada sarnaseid tulemusi, kuid see nõuab siiski rohkem koodi kui Grails.
Dünaamiline konstruktor või nimega argumentide konstruktor on funktsioon, mida paljud meist soovisid Java-s olla. Tore on määratleda, milliseid konstruktoreid teatud klass lubab, kuid paljudel juhtudel soovite lihtsalt määrata mõned atribuudid ja saada kullatud eksemplari. Groovy lisab igale üksusele spetsiaalse konstruktori, mis põhimõtteliselt võtab sisendina kaardi elegantsi ja määrab omadused koos kaardikirjetega.
def Person = new Person(name: 'Batman', age: 57)
See lähenemine viib koodini, mis on palju väljendusrikkam ja väldib vajadust kogu konstruktori katlakoodi koodi järele.
Ja BTW, siin on mõned näited Groovy kaartide suurepärasusest ja elegantsusest:
def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map[‘bread’] = 4 map.milk = 6
See on veel üks näide selle kohta, kuidas kood võib olla lühike ja lihtne, kuid samas võimas. See näitab, kuidas saab kasutada inline initsialiseerimist ja kuidas saab kaardiväärtusi manipuleerida sarnaselt objekti omadustega. Põhim manipuleerimiseks pole vaja kutsuda traditsioonilisi Java-meetodeid, välja arvatud juhul, kui te seda tõesti soovite.
Muidugi pole raamistikku, mis suudaks kõike teha, kuid lünkade täitmisel peaksime enne oma lahenduse rakendamist vaatama, mis veel võiks olla. Grailsil põhineva funktsionaalsuse arsenali laiendamiseks võime kasutada Grails pluginaid. Pistikprogrammi installimine toimub lihtsalt teise rea lisamisega BuildConfig
klass, mis on kohal igas Grailsi projektis (koodikonventsioon lööb uuesti välja!).
compile ':spring-security-core:2.0-RC4'
Ülaltoodud rida lisab meie rakendusele Spring turvatuuma ja selle funktsiooni lisamiseks pole praktiliselt enam vaja konfiguratsiooni.
See sarnaneb Maveni sõltuvuste kasutamisega (millele saate viidata ka samas konfiguratsiooniklassis), kuid pistikprogrammid on tavaliselt suuremad plokid, mis sisaldavad kogu funktsionaalsust.Nagu öeldud, lubage mul rääkida juhtumist, millega pidime tegelema. Me pidime juurutama mitme andmeüksuse haarava otsingu. Grailsil on Elasticsearchi pistikprogramm, mida on imelihtne kasutada. Nagu varem mainitud, peame ainult konfiguratsioonifailis viitama pistikprogrammile ja meil on hea minna. Kui tahame otsida teatud klassi üksusi, peame lihtsalt lisama sellele klassile staatilise 'otsitava' atribuudi. Ja kui tahame, võime isegi piirata omadusi, mida lubatakse otsida.
class User { static searchable = { only = name } String name Double salary }
Seda on nii vähe koodi, kuid kapoti all indekseerivad Grails ja pistikprogramm Elasticsearch kõiki kasutajaid automaatselt nime järgi ja võimaldavad meil nime järgi otsida. Tegelik otsingukõne on samuti väga sisutihe:
User.search('${params.query}')
Kui me ei taha, ei pea me kunagi Lucene indeksit puudutama. Kõik tehakse meie jaoks automaatselt maagiliselt. Pistikprogrammil on isegi otsingutulemite kuvamise API - see võib esile tõsta otsitud teksti sees leitud vastet. See on vaid näide sellest, kuidas pistikprogramm võib pakkuda tohutut funktsionaalsuskogumit, mis võib muuta meid palju tõhusamaks, vältides vajadust seda ise rakendada.
Pistikprogrammid on toredad, kuid mõnikord pole meil vaja tervet pistikprogrammi, vaid soovime lihtsalt midagi täiendavat. Kas mäletate viimast korda, kui soovite olemasolevas Java-klassis kasutada täiendavat meetodit, kuid te ei soovinud (või ei saanud) neid laiendada / alistada? Groovys saate lisada meetodeid ja omadusi olemasolevatele klassidele või isegi ainult nende teatud eksemplare. Näiteks võite lisada formatting
meetodit java.util.Date
klass, mis on vinge, kui soovite kuupäevi järjekindlalt vormindada ja lihtsalt ei taha kirjutada staatilisi util klasse ega määratleda erinevaid filtreid.
Date.metaClass.formatDate = { delegate.format('dd.MM.yyyy') }
Mis siis, kui soovite sortida kasutajate loendit arvutatud väärtuse järgi ja vajate seda ainult ühel juhul (st uue meetodi lisamine kasutajaklassi oleks saastav)? Võite lisada atribuudi igale nimetatud eksemplarile ja seejärel lihtsalt sortida või filtreerida kogu selle atribuudi järgi:
user.metaClass.computedProp = 312 * 32 * 3
Groovy autorid on juba mõnedesse Java tuumiklassidesse lisanud palju täiustusi, nii et me ei pea seda tegema. Allpool on toodud mõned näited.
Miinuse kasutamine kõigi kollektsioonis olevate elementide eemaldamiseks, mis on teises kollektsioonis.
assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5]
Täiendavad meetodid java.util.Date
manipuleerimiseks objektid, mis on nii palju kordi kasulikud, näiteks kuupäevade päevade liitmine / lahutamine või kuupäeva kindla välja saamine / määramine ilma seda teisendamata Calendar
või kasutades täiendavaid teeke.
def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0)
Kui soovite kuupäeva manipuleerimise abil tõesti kirjeldada, võite lihtsalt kasutada Groovy lisatud TimeCategory
klass:
use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }
Siis on veel IDE-d. Grailsiga töötamiseks on loodud Eclipse'il põhinevad GGTS ja IntelliJ IDEA. Nad mõistavad projekti struktuuri (ja aitavad teil kaustades ja ressurssides navigeerida) ning neil on otseteed käskude jaoks, mida kõige sagedamini kasutate (nt lisage kontroller, lisage leht, käivitage projekt jne). Grailsiga täidate käsud (projekti käivitamiseks või uue pistikprogrammi funktsiooni seadistamiseks) ja vajate erinevaid konfiguratsioone, mida ka IDE-d hõlmavad. Koodi lõpuleviimine toimib kenasti Grailsi veebimallilehtedel, kus saate sageli viidata kontrolleritele ja toimingutele. Grailsiga saab kasutada ka teisi IDE-sid, näiteks Netbeans, TextMate, Emacs ja teised.
Nii nagu kõigega elus, on ka Grailsiga seotud hoiatused. Kapoti all tehakse palju maagiat, mis võib sageli olla hea, kuid mõnikord pole tulemus selline, nagu ootasite. Vead ilmnevad lihtsalt sellepärast, et ei kasutata tippimist (jah, tüübid on Groovys valikulised) ja pole piisavalt ettevaatlik. Ja võib-olla märkate viga enne, kui on liiga hilja. Samuti on väga ahvatlev kirjutada ühe liini, et oma töökaaslastele muljet avaldada. Ja sina ise. Kuid need võimsad koodiread ei pruugi teie töökaaslastele nii iseenesestmõistetavad olla. Või isegi endale paari kuu pärast. Seepärast arvan, et Grails nõuab suuremat programmeerimisdistsipliini kui mõned traditsioonilisemad raamistikud.
Kodeerimine ei tohiks võtta rohkem aega lihtsalt seetõttu, et teie praegune raamistik seda nõuab. Eriti tänapäeval üha suurema hulga idufirmade puhul on oluline keskenduda tõeliselt olulistele ülesannetele ja olla võimalikult tõhus. Aeg on tõepoolest raha ja aeg turule viia on kriitiline. Peate suutma kiiresti tegutseda ja lahenduse juurutada, enne kui aeg otsa saab ja teie võistlus teid sellele lüüa annab.
Mu sõbrad töötavad Rubiin rööbastel või Python / Django on mulle juba ammu rääkinud, kui lahedad need tehnoloogiad on. Ja oli tõesti rumal mõelda, kui palju rohkem aega kulus mul Java-s koodi kirjutamiseks, mis salvestab midagi andmebaasi ja kuvab selle veebilehel. Graalid võivad tõepoolest olla kasulik vastus. Asi pole selles, et puhta Java, Spring MVC ja Hibernate abil ei saanud seda teha. Sa võiksid. Teie rakendus võib isegi töötada veidi kiiremini. Kuid Grailsiga saate töö kiiremini tehtud.
Seotud: Miks peate juba Java 8-le üle minema?