• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Groovy vs Boilerplate and Ceremony Code
 

Groovy vs Boilerplate and Ceremony Code

on

  • 920 views

 

Statistics

Views

Total Views
920
Views on SlideShare
920
Embed Views
0

Actions

Likes
1
Downloads
8
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Groovy vs Boilerplate and Ceremony Code Groovy vs Boilerplate and Ceremony Code Presentation Transcript

    • JVM. quack() or Groovy vs Ceremony
    • …Stas ShevchenkoJava Launch, 23/04/2013, Riga
    • Java Language comes with• Design Patterns• Boilerplate• Overly Ceremony code
    • 1. Patterns…
    • Boilerplate
    • 2. Boilerplate- getter/setters- Lazy init factories- toString, hashCode, equals- Explicit Exception declaration/handling- Close for resources- synchronization
    • Ceremony: Code’s Worst Enemy
    • Code Today (Death Star) ESSENCE CEREMONY
    • Future: Paradigm, Languages, Frameworks CEREMONY ESSENCE
    • 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"); }
    • 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");}
    • 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");}
    • 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");}
    • 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"); }
    • 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"); }
    • 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");}
    • Step 7. Delegate object showing to formedit() { person = Person.find(form.getId()); mapping.findForward("edit");}
    • Step 8. Standard routingedit() { person = Person.find(form.getId());}Or Rubydef edit @person = Person.find(params[:id]) end
    • Java WordIoCAspectsLombok or Eclipse XtendCode generators -> Spring Roo
    • JVM Languages Clojure Scala Groovy JRuby Jython Java Script
    • Clojure- Lisp – WTF?- By default Functional Programming only
    • Scala- Syntax WTF- Acclimatization period 6 to 12 months
    • JRuby- Ruby guys- gemns hell
    • Jython- Python syntax ((
    • Java Script (Rhino)- Is Java Script
    • 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
    • Groovy Console
    • Primitives3.times { println it }assert (10 instanceof Integer)println 4.4.classString s = 10 as String;println s;
    • Groovy Beansclass Customer { Integer id def name Date dob}def customer = new Customer(id:1, name:"Gromit",dob:new Date())
    • 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
    • Collections - Mapdef map = [name:"Gromit", likes:"cheese",id:1234]assert map["name"] == "Gromit"assert map[id] == 1234assert map instanceof java.util.Map
    • 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]
    • Duck typing// Hey duckDuck myDuck = new Duck()
myDuck.quack()// Hey quackerdef duck = new Duck()
myDuck.quack()
    • Duck typing 2class Duck { def quack() {println("quack")}}def action = "quack"def duck = new Duck()duck."${action}"()
    • 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"
    • Closuresdef squareClosure = { value -> value * value;}assert (4 == squareClosure(2))
    • IOdef file = new File(sms.txt).eachLine{ println it }file.write(”rewrite file”)file.append(“add to file”)
file << ”sexy style"
    • XMLdef xml = new groovy.xml.MarkupBuilder()xml.goods(type:”current”){ good(“Beer”) good (“Rock&Roll”) good (“Girls”)}
    • 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()
    • 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"
    • Something to readGroovy++Grails -> GORMGradle
    • 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);
    • At the end on GroovySafe navigation operator “?.”infringementAction.setCustomsOffice(versionedReplyInf?.getReplyInf()?.getInf()?.getInf()?.getCustomsOffice())