Vad ar Groovy och Grails - Presentation Transcript
i samarbete med Vad är Groovy och Grails? Jens Riboe September 2009
Vem är Jens Riboe? Förliteolikakunder
Varför?
Produktivitetsförbättring Development Speed Konstruktionstidenför en webbapplikation med feature X Fem år sedan: 1-2 månader Idag: 1-2 dagar
Språkutvecklingen MLSchemeHaskel Functional programming Pragmatic FP & OOP LISP STL & JGL λ-kalkyl Script Languages Perl ModulaPascalAda Python PHP Perl5 Module Dynamic Languages SmallTalk Object Oriented Programming JavaScript Class Simula RubyGroovyJRubyScalaClojurePerl6 Objective-C Abstract data type Java Subroutine C C++ Fortran Cobol 1960 1970 1980 1990 2000 2010
JVM blir en plattform för mer än Java Nyaspråkovanpåellerbredvid Java AnvänderJVM:ensomexekveringsmaskin Påsikttonar Java bortsåsom C gjordenär C++ kom
JVM Språk
Scala Martin Odersky École Polytechnique Fédérale de Lausanne (EPFL) 2004 Multi-paradigm Object-Oriented programming Java + Mixin och Traits Functional programming Closures och Pattern Matching Static typing Kompilatorn hittar många fel Extendible Lätt att skapa DSL
JRubyochJython Mångascriptspråkfinnsporterade till JVM:en JRubyär en porteringav Ruby Jythonär en porteringav Python Ruby on Rails webbramverketvar trigger Skapadestortintresseför Rails somramverk Ruby somspråk
ClojureochJaskel RenodladefunctionellaspråkpåJVM:en Clojureär en LISP variant Jaskelär en porteringavHaskel
Groovy
Groovy James Strachan 2003 http://radio.weblogs.com/0112098/2003/08/29.html Inspireradav Ruby och Python Den 'naturliga' vidareutvecklingenav Java Superset av Java Såsom C övergicki C++ Egenskaper Dynamiskt (duck typing) Objektorienterat (classes) Funktionellt (closures)
Ducktyping If it walks like a duck and it quacks like a duck, then it probably is as a duck Metodanrop på objekt utan krav på att tillhöra viss typ def min(a, b) { a <= b ? a : b } defaNumber = 17 println "number: " + min(aNumber - 3, aNumber + 3) defaString = 'foobar' println "string: " + min('xx' + aString, 'aa' + aString) defaDate = new Date() println "date: " + min(aDate - 1, aDate + 1) number: 14 string: aafoobar date: Fri Sep 04 11:20:17 CEST 2009
Nullcatch operator ?. I stället för if (user != null && user.getEmail() != null) { domain = user.getEmail().getDomain(); } räcker det med domain = user?.email?.domain
Elvis operator ?: I stället för String h = System.getProperties.getProperty("user.home"); dir = (home != null ? home : "/tmp"); räcker det med dir = System.properties.'user.home' ?: '/tmp' println '-' * 20 println "A) ${System.properties.'user.home' ?: '/tmp'}" println "B) ${System.properties.'user-home' ?: '/tmp'}" -------------------- A) C:Usersjens B) /tmp
Spaceship operator <=> I stället för List<Todo> todos = new ArrayList<Todo>(); . . . Collections.sort(todos, new Comparator() { public intcompare(Object o1, Object o2) { if (o1 instanceofTodo && o2 instanceofTodo) { Todo t1 = (Todo) o1; Todo t2 = (Todo) o2; return t1.deadline.compareTo(t2.deadline); } return 0; } }); räcker det med deftodos = [. . .] todos = todos.sort {t1, t2 -> t1.deadline <=> t2.deadline}
Spread operator *. I stället för List<String> txt = new ArrayList<String>(); for (Todo t : todos) { txt.add(t.getText()); } System.out.println("txt = " + txt); räcker det med deftxt = todos*.text printlntxt
List ochMap och Range Del avspråket List (java.util.*List) Map (java.util.*Map) deflst = [17, 'foo', 'bar', 'fee'] assertlst[0] == 17 assertlst[-2] == 'bar' assertlst[1..2] == ['foo', 'bar'] def tbl = [one:1, two:2, three:3, four:4] assert tbl.one == 1 assert tbl.four == 4
GroovyBeans I stället för import java.util.Date; public classTodo { private String text; private Date deadline; public Todo(String t, Date d) {text=t; deadline=d;} public String getText() {return text;} public voidsetText(String t) {text=t;} public Date getDeadline() {return deadline;} public voidsetDeadline(Date d) {deadline=d;} }; räcker det med classTodo { String text Date deadline }
Användning av Groovy Beans def t = new Todo(deadline: new Date() + 3, text: 'Fix that bug') t.text = 'Write that Groovy script' deftodos = [new Todo(text:'Skip Java'), new Todo(text:'Hack w Groovy'), new Todo(text:'Web w Grails')] todos = todos.sort {t1,t2 -> t1.deadline <=> t2.deadline} printlntodos*.text.join(".
") Skip Java. Hack w Groovy. Web w Grails
Categories Ett sätt att temporärt addera metoder till en klass def today = new Date() println "Today: ${today}" println "Today: ${today.iso8601()}" Today: Sat Sep 05 14:19:13 CEST 2009 …MissingMethodException: No signature of method: java.util.Date.iso8601()… import java.text.SimpleDateFormat classFmtBoost { static String iso8601(Date self) { new SimpleDateFormat('yyyy-MM-dd').format(self) } static String getTraditional(Date self) { new SimpleDateFormat('d MMM yyyy').format(self) } } def today = new Date() use (FmtBoost) { println "Today: ${today.iso8601()}" println "Today: ${today.traditional}" } Today: 2009-09-05 Today: 5 sep 2009
Användning av FmtBoost classDoit { String text Date deadline = new Date() } deflst = [ new Doit(text: 'Read that groovybook'), new Doit(text: 'Start usingbuilders'), new Doit(text: 'Investigategroovyxml') ] intday = 1 lst.each {it.deadline += day++} use (FmtBoost) { lst.each {println "${it.deadline.traditional}: ${it.text}"} } 6 sep 2009: Read that groovy book 7 sep 2009: Start using builders 8 sep 2009: Investigate groovy xml
Builders Kombinationav closures och meta-programmering Inkrementellkonstruktionav composite structures Exempel XML och HTML Swing Ant
Generera XML use(FmtBoost) { defbuf = new StringWriter() defxml = new MarkupBuilder(buf) xml.'doit-list' { lst.each { doit(deadline: it.deadline.iso8601(), it.text) } } printlnbuf } <doit-list> <doit deadline='2009-09-06'>Read that groovy book</doit> <doit deadline='2009-09-07'>Start using builders</doit> <doit deadline='2009-09-08'>Investigate groovy xml</doit> </doit-list>
Result av news(url, phrase) def lst = news('http://rss.news.yahoo.com/rss/tech', 'Google') lst.each { it.text = it.text.replaceAll('<br clear="all"/>', '') it.text = it.text.replaceAll(/(<p>)|(</p>)/, '') it.text = it.text.replaceAll(/<a href.+</a>/, '') } lst.each { println "** ${it.text.substring(0,60)}
${it.date}" } ** AP - The executive who led Google Inc.'s expansion in China Fri, 04 Sep 2009 06:25:08 GMT ** AP - The final assault on a class-action settlement that wou Thu, 03 Sep 2009 23:30:27 GMT
Grails Oblyg 'stöld' ochförbättringav 'Ruby on Rails' Convention over Configuration Automatisklagringavdomänobjekt Groovy-fieringav Spring Framework och Hibernate Genereringav boilerplate kod Scaffolding and Templating Byggnadsställningarochmallar GSP = Groovy Server Pages Många plug-ins
Convention over Configuration Genomattplacera groovy klasseriolikafilkataloger, såbehandlas de påolikasätt
Domain Hanteras av Hibernate & Spring class Person { String name, email, mobile Location location } class Location { String name String street, zip, city = 'Stockholm', country = 'Sweden' float latitude, longitude } Relation def person = Person.get(17) def lastName = "Riboe" person.email = "${person.name}@${domain}" person.save() def sthPlaces = Location.findByCity('Stockholm') Dynamiska DAO funktioner
Controller http://server/BuddyMap/ajax/savePerson?personId=17&name=... class AjaxController { String JSON = 'application/json' def getDB = {...} def savePerson = { Person person = Person.get( params.personId ) ... render(contentType:JSON, text: person as JSON) } def saveLocation = {...} def removePerson = {...} def removeLocation = {...} }
Webbapplikationer med Groovy och Grails Dag 1: Grundläggande Groovy Dag 2: Avancerad Groovy Dag 3: Kickstart med Grails Dag 4: Avancerad Grails
Sammanfattning Groovy kommer gradvis ersätta Java Closures kommer att finnas i alla (moderna) språk Builders och meta-programmering Grails skapar snabbt nya webbapplikationer Convention over Configuration Spring & Hibernate GSP
This presentation (in Swedish) gives a gentle intro more
This presentation (in Swedish) gives a gentle introduction to the programming langauge Groovy and the web framework Grails. It starts by setting the language into its context of language evolution in general and JVM languages in particular. less
0 comments
Post a comment