25. Et Java-eksempel Groovyfied class GettingGroovy { String name @Override String toString() { "Get Groovy $name" } } println new GettingGroovy(name: "Geeks")
26. public class HelloWorld { private String name; public String getName() { return name; } public void setName(String name) { this.name=name; } @Override public String toString() { return "Hello "+getName(); } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Geeks"); System.out.println(helloWorld); } } Java vs. Groovy class GettingGroovy { String name String toString() { "Get Groovy $name" } } println new GettingGroovy(name: "Geeks") Færre linier kode Færre mulighed for fejl! 18 linier kode 7 linier kode 60% mindre Kode!
45. Tænk: ”Annonymous Inner Classes” simplificeret! def c = { a, b = "ukendt" -> println "$a og $b" } c('a','b') [key1:'value1',key2:'value2'].each(c) ['value1','value2'].each(c) c.call('1','2') Kommer i Java 8 (men hvornår) Groovy har haft dem fra starten! a og b key1 og value1 key2 og value2 value1 og ukendt value2 og ukendt 1 og 2
46.
47. Groovy boolean evaluering assert !null assert new Object() assert !"" assert "Indhold" assert ![] // List assert ["Indhold"] Object o = null; assert(o == null); o = new Object(); assert(o != null); assert("".length() == 0); assert("Indhold".length() > 0); List l = new ArrayList(); assert(l.size() != null); l.add("Element"); assert(l.size() > 0);
48.
49. Elvis operator a?.b?.doSomething() if(getA() != null && getA().getB() != null) { getA().getB().doSomething(); } String x = b ?: ”default” String x = getB() != null ? getB() : ”default”
50.
51.
52. ” Dette er en GString”.size() // Længden på en streng
53. Multiline Strings def name = 'Nørder' println "Hej $name" def name="Nørder" def xml = """<xml> <element>Hej "$name"</element> </xml>"""
78. class APublisher extends Specification { def " send besked til alle subscribers "() { setup: " før kørsel skal der være en publisher og to subscribers " def pub = new Publisher() def sub1 = Mock(Subscriber) def sub2 = Mock(Subscriber) pub.subscribers << sub1 << sub2 when: " Når en publisher sender en besked " pub.send("event") then: " Skal hver receiver modtage den én gang " 1 * sub1.receive("event") 1 * sub2.receive("event") } } Spock – fortæl en historie
92. Basal CRUD def person = new Person(navn: 'Kurt', alder: 42) Person.save() def person = Person.get(1) assert person.id == 1 def person = Person.get(1) person.navn = 'Svend' person.save() def person = Person.get(1) person.delete() C R U D
93. Dynamic finders def personer = Person.list() def personer = Person.list(sort: 'navn', order: 'desc') def personer = Person.findAllByNavnLike('%Jensen%') def person = Person.findByNavnLike('%Jensen%') def person = Person.findByNavnAndAlder('Svend', 42) def c = Konto.createCriteria() def konti = c.list { between(dato, igår, nu) ilike(navn, '%Jensen%') }
Husk: Fjern ”private” Lav et eksempel med void setName(name) { this.name = name.reverse() } Vis AST transformation
Både enkelt-ping, dobbelt-ping og trippel-ping er en java.lang.String, men det øjeblik man bruger ${} bliver det til en Gstring Husk at forklare, size()
Husk at forklare, at Groovy håndtere resourcer (open/close og fejl) automatisk.
Vis indhold af http://oiorest.dk/danmark/kommuner/746/skoler I en browser!
Vis indhold af http://oiorest.dk/danmark/kommuner/746/skoler I en browser!
Vis del et af koden og vent med resten....
Vis del to, hvor der testes mellem Groovy og Java
Fortæl, at Spock er en DSL og er en yderligere udvidelse af Groovy, hvor man har lavet en syntaks som er specialiseret til at ”fortælle historier”
Vis del tre, hvor der testes med Spock
grails create-app Tieto cd Tieto grails run-app (Åben browser) grails create-domain-class dk.demo.Person nano grails-app/domain/dk/demo/Person String name int age grails create-controller dk.demo.Person nano grails-app/controller/dk/demo/Person static scaffold = true grails run-app grails install-plugin iwebkit grails install-iwebkit-templates grails run-app