groovy og grails for javaudviklere

Download Groovy og Grails for Javaudviklere

If you can't read please download the document

Upload: soren-berg-glasius

Post on 17-May-2015

1.015 views

Category:

Technology


9 download

DESCRIPTION

Slides fra mine "Groovy og Grails for Javaudviklere" foredrag hos DIT og GeekNight

TRANSCRIPT

  • 1. Groovy og Grailsfor Javaudviklere

2. Sren Berg Glasius

  • 100%Nrd!

3. Javaudvikler siden 2000 4. Ansat hosGennemtnkt IT

  • Konsulenter medGroovyogGrailssom speciale

5. BenytterGrailssom platform til produkt Formand for Javagruppen 6. Stifter afGR8Conf en konference for Groovy et al. 7. Passioneretbruger af Groovy og Grails 8. Twitter: @sbglasius 9. Agenda

  • Groovy
  • Overblik

10. Obligatoriske Hello World 11. Syntax og syntaktisk sukker 12. Groovy API (GDK) Groovy og testing

  • Mocking af interfaces

13. Spock Grails

  • Kort introduktion

14. Live coding! Afrunding 10 min. pause 15. Groovy - Overblik

  • Groovy startet august 2003 afJames Strachan

16. Open Source (BSD / Apache licens) 17. Dynamisk sprog p JVM'en 18. Grammatik videreudviklet fra Java 19. Inspireret af Python, Ruby og Smalltalk 20. Flad indlringkurve for Java-udviklere Java p Steroider! 21. Et dynamisk sprog

  • Ingen compile time check
  • int i = 'Hello'-> throws RuntimeException

Ducktyping

  • defkeyword med fokus p, hvad et objekt kan gre, ikke hvilken type det er

22. def i = 0 // Tildel integer i = streng // skift til streng 23. Et Java-eksempel public class UsingJava { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Using Java " + getName(); } public static void main(String[] args) { UsingJava usingJava = new UsingJava(); usingJava.setName("Geeks"); System.out.println(usingJava); } } 24. Et Java-eksempel 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") Frre linier kodeFrre mulighed for fejl! 18 linier kode 7 linier kode 60% mindre Kode! 27. Collections

  • Java Lists

28. Groovy Lists def list = [ "String 1","String 2" ]assert list[0] == "String 1"assert list.get(0) == "String 1" assert list.size == 2 List list = Arrays.asList("String 1", "String 2"); assert(list.get(0).equals("String 1")); assert(list.size()==2); 29. Collections

  • Java Maps

30. Groovy Maps def map = [key1:"Value 1",key2: "Value 2"] assert !map.containsKey("key3") && !map["key3"] && !map.key3 assert map.key1 assert map.key1=="Value 1" assert map.size() == 2 Map map = new HashMap(); map.put("Key 1","Value 1"); map.put("Key 2","Value 2"); assert(!map.containsKey("Key 3")); assert(map.containsKey("Key 1")); assert(map.get("Key 1").equals("Value 1")); assert(map.size() == 2); 31. Lists

  • Del-elementer af en liste

def list = ["s1","s2","s3","s4","s5"] assert list[2..3] == ['s3','s4'] assert list[3..2] == ['s4','s3'] assert list[-1] == 's5' assert list[-2] == 's4' assert list[3..-1] == ['s4','s5'] List list = Arrays.asList("s1","s2","s3","s4","s5"); assert list.subList(2,4).equals(Arrays.asList("s3","s4")); List reversed = list.subList(2,4); Collections.reverse(reversed); assert reversed.equals(Arrays.asList("s4","s3")); assert list.get(list.size())=="s5"; assert list.subList(3,list.size())==Arrays.asList("s4","s5"); 32. Unificering

  • Lngden p et objekt, med Java:

33. Med Groovy: public static void main(String[] args) { String string = "String"; String[] array = new String[] {"String1","String2"}; Map map = new HashMap();map.put("Key1","Val1"); List list = new ArrayList(); list.add("String1"); assert string. length() ==6; assert array. length== 2; assert map. size() ==1; assert list. size() ==1; } def string = "String", array = ["String1","String2"] def map = [Key1:"Val1"], list = ["String1"] assert string. size()== 6 assert array. size()== 2 assert map. size()== 1 assert list. size()== 1 34. Gotchas

  • ==er ikke sammenligning af objekt-referencer, men kalder Java'sequals()

35. is()er sammenligning af objekt-referencer 36. returnbehves ikke. Retur er resultatet af sidste evaluererede udtryk. 37. Metoder og klasser erpublic 38. Alle exceptions er unchecked og runtime! 39. Der er ingen primitiver alt box'es 40. Decimal udregninger foregr iBigDecimal 41. Metoder

  • Det er muligt at angive default vrdier i metoder

def m(a, b = "ukendt") {println "$a og $b" } m('a') m('a','b') a og ukendt a og b 42. Metoder (2)

  • Det er muligt at have flere returvrdier

def metode() { ["my string", 1] } def (string,value) = metode() assert string == "my string" assert value == 1 43. Groovy Closures

  • Kodeblokke
  • Kan tildeles variable

44. Kan sendes med som parametre 45. Tnk: 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 hvornr)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. Sandheden i Groovy

  • Java boolean evaluering

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. Syntaktisk sukker

  • Sikker variabel reference

49. Elvis operator a?.b?.doSomething() if(getA() != null && getA().getB() != null) { getA().getB().doSomething(); } String x = b ?: defaultString x = getB() != null ? getB() : default 50. Strings

  • 'Dette er en String'

51. Dette er en GString

  • GStrings kan benytte variabel substitution

'C' as Char// er en char 52. Dette er en GString.size() // Lngden p en streng 53. Multiline Strings def name = 'Nrder' println "Hej $name" def name="Nrder" def xml = """ Hej "$name"""" 54. Meta programmering meget kort!

  • En mde at tilfje funktionalitet til eksisterende klasser

55. Brugt meget i Groovys API'er 56. Eksempel: String.metaClass.toCamelCase = { delegate.toLowerCase().replaceAll( /(_)([a-z0-9])/, {Object[] part -> part[2].toUpperCase() }) } String.metaClass.toSnakeCase = { capitalize = false -> def res = delegate.replaceAll( /([A-Z])/, /_$1/ ) .replaceAll( /^_/, '' ) capitalize ? res.toUpperCase() : res.toLowerCase() } println "THIS_IS_A_CASE_FOR_THE_CAMEL".toCamelCase() println "AndNowForSomeSnakeOil".toSnakeCase() println "LoudYellingExample".toSnakeCase(true) 57. Groovy API guf!

  • Indls en fil

58. Indls en url def path = '.', file = "Groovy.txt" println new File(path,file).text println new File(path,file).readLines().join(' ') new File(path,file).eachLine { line,i-> println "${"${i}".padLeft(2)}: ${line}" } def url = "http://oiorest.dk/danmark/kommuner/746/skoler".toURL() println url.text url.eachLine { line,i-> println "${"${i}".padLeft(3)}: ${line}" } 59. Groovy API guf!

  • Parse en XML fil

def url = "http://oiorest.dk/danmark/kommuner/746/skoler" def skoler = new XmlSlurper().parse(url) skoler.skole.each { println "$it.navn ($it.type)" } 715001BakkeskolenFolkeskole Skolevej 28362Hrning737002Bjedstrup SkoleFolkeskole Bjedstrupvej 18660Skanderborg 60. Groovy API guf!

  • Parse en XML fil + lidt mere

def url = "http://oiorest.dk/danmark/kommuner/746/skoler" def skoler = new XmlSlurper().parse(url) skoler.skole.inject([:]) { map,item ->map[item.navn] = item.typemap}.groupBy {it.value.toString()}.each { println "$it.key" it.value.each { println "$it.key" } } 61. Groovy API guf!

  • Generer en XML fil

def writer = new StringWriter() def xml = newgroovy.xml.MarkupBuilder(writer) xml.rows() { 5.times { i -> row(id: i, href: "http://localhost/$i") { if(i in [2,4]) { info "Dette er info for rkke $i" } } } } writer.toString() 62. Groovy API guf!

  • Parse et JSON response

def url = "http://oiorest.dk/danmark/kommuner/746/skoler.json" def json = url.toURL().getText("utf-8") def slurper = new groovy.json.JsonSlurper() def skoler = slurper.parseText(json) skoler.each { println "$it.navn $it.type" } 63. Groovy API guf!

  • Generer en JSON fil

def json = newgroovy.json.JsonBuilder() def list =json.event { name "Getting Groovy" time new Date() speaker { name "Sren B. Glasius" company "Gennemtnkt IT" } } json.toString() 64. Groovy API guf!

  • SQL nemmere end aldrig fr

@Grapes([ @Grab('mysql:mysql-connector-java:5.1.6'), @GrabConfig(systemClassLoader=true) ]) import groovy.sql.Sql def sql = Sql.newInstance("jdbc:mysql://localhost:3306/demo","demo", "demo","com.mysql.jdbc.Driver") sql.eachRow("select * from person") { println "${it.name} comes from ${it.country}" } 65. AST Transformationer

  • Metaprogrammering p compile-time niveau
  • Egne udvidelser af Groovy

Eksempler

  • @Bindable og @Vetoable

66. @Imutable 67. @Singleton 68. @Lazy 69. @Bindable

  • Javakode for at lave property change listener

import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeListener; public class MyBean { private String prop; PropertyChangeSupport pcs = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { pcs.add(l); } public void removePropertyChangeListener(PropertyChangeListener l) { pcs.remove(l); } public String getProp() { return prop; } public void setProp(String prop) { pcs.firePropertyChanged("prop", this.prop, this.prop = prop); } } class MyBean { @Bindable String prop } 70. @Delegate

  • Delegation

class Event extends Date { @Delegate Date when String title, url } def df = new java.text.SimpleDateFormat("yyyy/MM/dd") def gr8conf_eu = new Event(title: "GR8Conf Europe", url: "http://www.gr8conf.eu", when: df.parse("2011/05/17")) def gr8conf_us = new Event(title: "GR8Conf Europe", url: "http://www.gr8conf.us", when: df.parse("2011/06/24")) assert gr8conf_eu.before(gr8conf_us) 71. @Imutable

  • Javakode for at lave en imutable klasse

public final class Punter { private final String first; private final String last; public Punter(String first, String last) { this.first = first; this.last = last; } public String getFirst() { return first; } public String getLast() { return last; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((first == null) ? 0 : first.hashCode()); result = prime * result + ((last == null) ? 0 : last.hashCode()); return result; } 72. @Imutable (fortsat) @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Punter other = (Punter) obj; if (first == null) { if (other.first != null) return false; } else if (!first.equals(other.first)) return false; if (last == null) { if (other.last != null) return false; } else if (!last.equals(other.last)) return false; return true; } @Override public String toString() { return "Punter(first:" + first + ", last:" + last + ")"; } } @Immutable final class Punter { String first, last } 73. Java og Groovy en krlighedshistorie Hvordan bruges Groovy og Java sammen DEMO! 74. Groovy til test

  • Simpel mocking af interfaces

75. Testing vha. Spock (www.spockframework.org) 76. Spock

  • Test og specifikations framework

77. Beskriv testscenarier som historier

  • Et eksempel

78. class APublisher extends Specification { def " send besked til alle subscribers "() { setup: " fr krsel skal der vre en publisher og to subscribers " def pub = new Publisher() def sub1 = Mock(Subscriber) def sub2 = Mock(Subscriber) pub.subscribers