Your SlideShare is downloading. ×
0
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Groovy vs Boilerplate and Ceremony Code

832

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
832
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
16
Comments
0
Likes
2
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())

×