Top Banner
Mopping Up With Groovy * Brent Snook [email protected] *obligatory lame pun
29

Mopping Up With Groovy

May 10, 2015

Download

Technology

fuglylogic

An introduction to using the Meta Object Protocol within Groovy
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Mopping Up With Groovy

Mopping Up With Groovy*

Brent [email protected] *obligatory lame pun

Page 2: Mopping Up With Groovy

What is a MOP?

Page 3: Mopping Up With Groovy

Duck Typing

• POJ (Plain Old Java) – you can interact with an object based on what it is (Class)

• Groovy – you can interact based on which properties and methods are available on the object (MetaClass)

Page 4: Mopping Up With Groovy

Modifying Class Behaviour at Runtime

• AKA Monkey Patching

• AKA Duck Punching

• see whytheluckystiff's My Complete List Of Substitute Names For The Maneuver We Now Know To Be Monkeypatching

Page 5: Mopping Up With Groovy

Why Do It?

• it has an amusing name

• it makes you more attractive to the opposite (or same) sex

• it allows you to write more succinct, expressive code

Page 6: Mopping Up With Groovy

But I Feel Dirty …

• you may need to change how you think about things

• the laws are different in the duck typing universe

• question old attitudes and conventions

Page 7: Mopping Up With Groovy

How Does Groovy Implement a MOP?

Page 8: Mopping Up With Groovy

The MetaClass

• every Groovy object has one

• richer introspection and invocation interface than Java Class

• you can set the MetaClass for an object to change the rules for how it can behave

Page 9: Mopping Up With Groovy

The Final Shape of an Object

Added Methods + Properties+ = MetaClassClass

Page 10: Mopping Up With Groovy

The ExpandoMetaClass

• core of Groovy metaprogramming

• allows you to customise behaviour on the fly

• when you ask a newly created GroovyObject for its metaClass, this is what you get back

ExpandoMetaClass<<interface>>MetaClassGroovyObject

Page 11: Mopping Up With Groovy

What Can You Do With It?

• borrow methods from other classes

• add or override constructors

• dynamically create method names

• add methods to interfaces

• add or override instance methods

• add or override properties

• add or override static methods

http://groovy.codehaus.org/ExpandoMetaClass

Page 12: Mopping Up With Groovy

Adding a Class Method

Page 13: Mopping Up With Groovy

Adding a Property

Page 14: Mopping Up With Groovy

Overriding an Instance Method

Page 15: Mopping Up With Groovy

The Same In Ruby

Page 16: Mopping Up With Groovy

Invocation/Access Hooks

• invokeMethod

• getProperty

• setProperty

• propertyMissing

• methodMissing

Page 17: Mopping Up With Groovy

AOP with invokeMethod

Page 18: Mopping Up With Groovy

Flexible Methods with methodMissing

Page 19: Mopping Up With Groovy

MOP!!...huh! What is it Good For?

Page 20: Mopping Up With Groovy

Syntactic Sugar

Page 21: Mopping Up With Groovy

Mocking/Stubbing Behaviour

Page 22: Mopping Up With Groovy

DSL - The Original Class

Page 23: Mopping Up With Groovy

Adding Some MOP Trickery

Page 24: Mopping Up With Groovy

Icecream Time

Page 25: Mopping Up With Groovy

Replacing/Simplifying Frameworks and Patterns

• Spring, EasyMock/JMock

• circumvent the rigidity of the Java language

• patterns like Builder

• Dependency Injection

• with Groovy these can be simplified or disappear altogether

Page 26: Mopping Up With Groovy

Finally

Page 27: Mopping Up With Groovy

The Pros and Cons

Pros

• flexibility

• extensibility

• power

Cons• sometimes clunky

syntax• slower performance

Page 28: Mopping Up With Groovy

With Great Power…

• don’t get wowed by the coolness factor

• remember to KISS

• the end result should be more understandable, not less

• keep pushing the boundaries but exercise judgment

Page 29: Mopping Up With Groovy

Further Reading and References

• http://www.gnu.org/software/guile/docs/goops/Metaobjects-and-the-Metaobject-Protocol.html#Metaobjects%20and%20the%20Metaobject%20Protocol

• http://en.wikipedia.org/wiki/Meta-object_protocol• http://www.grails-exchange.com/files/GraemeRocher%20-

%20Keynote-DynamicGroovyMetaMagic.pdf• http://groovy.codehaus.org/ExpandoMetaClass• http://whytheluckystiff.net/articles/

seeingMetaclassesClearly.html• http://groovy.codehaus.org/ExpandoMetaClass• http://hackety.org/2007/08/10/

myCompleteListOfSubstitutePhrasesForTheActWeNowKnowToBeMonkeypatching.html

• Groovy In Action