Groovy vs Boilerplate and Ceremony Code
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,103
On Slideshare
1,103
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
14
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. JVM. quack() or Groovy vs Ceremony
  • 2. …Stas ShevchenkoJava Launch, 23/04/2013, Riga
  • 3. Java Language comes with• Design Patterns• Boilerplate• Overly Ceremony code
  • 4. 1. Patterns…
  • 5. Boilerplate
  • 6. 2. Boilerplate- getter/setters- Lazy init factories- toString, hashCode, equals- Explicit Exception declaration/handling- Close for resources- synchronization
  • 7. Ceremony: Code’s Worst Enemy
  • 8. Code Today (Death Star) ESSENCE CEREMONY
  • 9. Future: Paradigm, Languages, Frameworks CEREMONY ESSENCE
  • 10. 3. Ceremony to Essence code. Step 0public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PersonForm personForm = (PersonForm) form; if (personForm.getId() != null) { PersonManager mgr = (PersonManager) getBean("personManager"); Person person = mgr.getPerson(personForm.getId()); personForm = (PersonForm) convert(person); updateFormBean(mapping, request, personForm); } return mapping.findForward("edit"); }
  • 11. Step 1. Duck Typingedit(mapping, form, request, response) throws Exception { personForm = form; if (personForm.getId() != null) { mgr = getBean("personManager"); person = mgr.getPerson(personForm.getId()); personForm = convert(person); updateFormBean(mapping, request, personForm); } return mapping.findForward("edit");}
  • 12. Step 2. duck typing, without local variableedit(mapping, form, request, response) throws Exception { if (form.getId() != null) { mgr = getBean("personManager"); person = mgr.getPerson(form.getId()); form = convert(person); updateFormBean(mapping, request, form); } return mapping.findForward("edit");}
  • 13. Step 3. Implicit return, exceptionsedit(mapping, form, request, response) { if (form.getId() != null) { mgr = getBean("personManager"); person = mgr.getPerson(form.getId()); form = convert(person); updateFormBean(mapping, request, form); } mapping.findForward("edit");}
  • 14. Step 4. Dont add a manager layer to MVC (yet). KISS + YAGNI.edit(mapping, form, request, response) { if (form.getId() != null) { person = Person.find(form.getId()); form = convert(person); updateFormBean(mapping, request, form); } mapping.findForward("edit"); }
  • 15. Step 5. Conditionals make code expensive to testedit(mapping, form, request, response) { person = Person.find(form.getId()); form = convert(person); updateFormBean(mapping, request, form); mapping.findForward("edit"); }
  • 16. Step 6. All action methods have the same four argumentsedit() { person = Person.find(form.getId()); form = convert(person); updateFormBean(mapping, request, form); mapping.findForward("edit");}
  • 17. Step 7. Delegate object showing to formedit() { person = Person.find(form.getId()); mapping.findForward("edit");}
  • 18. Step 8. Standard routingedit() { person = Person.find(form.getId());}Or Rubydef edit @person = Person.find(params[:id]) end
  • 19. Java WordIoCAspectsLombok or Eclipse XtendCode generators -> Spring Roo
  • 20. JVM Languages Clojure Scala Groovy JRuby Jython Java Script
  • 21. Clojure- Lisp – WTF?- By default Functional Programming only
  • 22. Scala- Syntax WTF- Acclimatization period 6 to 12 months
  • 23. JRuby- Ruby guys- gemns hell
  • 24. Jython- Python syntax ((
  • 25. Java Script (Rhino)- Is Java Script
  • 26. Starting Groovy1. Download the .zip file from http://groovy.codehaus.org and unzip it to local drive2. Create the GROOVY_HOME environment variable and add $GROOVY_HOME/bin to you path3. type groovy -version
  • 27. Groovy Console
  • 28. Primitives3.times { println it }assert (10 instanceof Integer)println 4.4.classString s = 10 as String;println s;
  • 29. Groovy Beansclass Customer { Integer id def name Date dob}def customer = new Customer(id:1, name:"Gromit",dob:new Date())
  • 30. Collections – Lists, Rangesdef list = [5, 6, 7, 8]assert list[2] == 7assert list instanceof java.util.Listdef range = 5..8assert range.size() == 4assert range[2] == 7assert range instanceof java.util.List
  • 31. Collections - Mapdef map = [name:"Gromit", likes:"cheese",id:1234]assert map["name"] == "Gromit"assert map[id] == 1234assert map instanceof java.util.Map
  • 32. Collections featuresassert [1, 3, 5] == [a, few, words]*.size()def words = [ant, buffalo, cat, dinosaur]assert words.findAll{ w -> w.size() > 4 } == [buffalo,dinosaur]def words = [ant, buffalo, cat, dinosaur]assert words.collect{ it[0] } == [a, b, c, d]def sub = list[1, 3, 20..25, 33]assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]
  • 33. Duck typing// Hey duckDuck myDuck = new Duck()
myDuck.quack()// Hey quackerdef duck = new Duck()
myDuck.quack()
  • 34. Duck typing 2class Duck { def quack() {println("quack")}}def action = "quack"def duck = new Duck()duck."${action}"()
  • 35. Operatorsa == b a.equals(b)a+b a.plus(b)a-b a.minus(b)a++ a.next()a << b a.leftShift(b)def groovy = *”beer", ”rock&roll"]groovy << ”girls"
  • 36. Closuresdef squareClosure = { value -> value * value;}assert (4 == squareClosure(2))
  • 37. IOdef file = new File(sms.txt).eachLine{ println it }file.write(”rewrite file”)file.append(“add to file”)
file << ”sexy style"
  • 38. XMLdef xml = new groovy.xml.MarkupBuilder()xml.goods(type:”current”){ good(“Beer”) good (“Rock&Roll”) good (“Girls”)}
  • 39. XMLdef goods = new XmlSlurper().parseText(…)def allGoods = records.nameassert 3 == allRecords.size()def allNodes = goods.depthFirst().collect{ it }def firstGood = goods.name[0]assert ’sms’ == firstGood .name()assert ‘Text’ == firstGood.@make.text()
  • 40. DSLThis is a really cool topic, where the stars arebegan…• A DSL allows expressions in a domain specific manner• Method pointers make this easy:
def list = []
def insert = list.&add
insert ”beer"
insert ”rock&roll"
  • 41. Something to readGroovy++Grails -> GORMGradle
  • 42. At the end – NPE fighter in my teaminfringementAction.setCustomsOffice( versionedReplyInf != null ? (versionedReplyInf.getReplyInf() != null ? (versionedReplyInf.getReplyInf().getInf() != null ? (versionedReplyInf.getReplyInf().getInf().getInf() != null ? (versionedReplyInf.getReplyInf().getInf().getInf(). getCustomsOffice() != null ? versionedReplyInf.getReplyInf().getInf().getInf(). getCustomsOffice() : null) : null) : null) : null) : null);
  • 43. At the end on GroovySafe navigation operator “?.”infringementAction.setCustomsOffice(versionedReplyInf?.getReplyInf()?.getInf()?.getInf()?.getCustomsOffice())