comparing groovy and_j_ruby(neal_ford)

103
ThoughtWorks ThoughtWorks NEAL FORD software architect / meme wrangler ThoughtWorks [email protected] 3003 Summit Boulevard, Atlanta, GA 30319 www.nealford.com www.thoughtworks.com blog: memeagora.blogspot.com twitter: neal4d comparing groovy & jruby * * please check all knives, guns, pitchforks, and torches at the door

Upload: dmitry-nosenko

Post on 15-Jan-2015

1.234 views

Category:

Technology


0 download

DESCRIPTION

Presentation of Neal Ford on JavaOne 2010

TRANSCRIPT

Page 1: Comparing groovy and_j_ruby(neal_ford)

ThoughtWorksThoughtWorks

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

blog: memeagora.blogspot.com

twitter: neal4d

comparing groovy & jruby *

* please check all knives, guns, pitchforks, and torches at the door

Page 2: Comparing groovy and_j_ruby(neal_ford)

housekeepingask questions at the end (insane amount of material!)

download slides from nealford.com

download samples from github.com/nealford

Page 3: Comparing groovy and_j_ruby(neal_ford)

eigenclass approaches

syntax

closures

framework approach

meta-programming

agenda:

Page 4: Comparing groovy and_j_ruby(neal_ford)

geek fu test:

Page 5: Comparing groovy and_j_ruby(neal_ford)

Groovy dynamicizesthe JavaTM platform

JRuby brings Ruby tothe JavaTM platform

Page 6: Comparing groovy and_j_ruby(neal_ford)
Page 7: Comparing groovy and_j_ruby(neal_ford)

differences & observations

Page 8: Comparing groovy and_j_ruby(neal_ford)

syntax

Page 9: Comparing groovy and_j_ruby(neal_ford)

sigils

Page 10: Comparing groovy and_j_ruby(neal_ford)

this.name

@name

vs

Page 11: Comparing groovy and_j_ruby(neal_ford)
Page 12: Comparing groovy and_j_ruby(neal_ford)
Page 13: Comparing groovy and_j_ruby(neal_ford)

auto-encapsulation?

Page 14: Comparing groovy and_j_ruby(neal_ford)
Page 15: Comparing groovy and_j_ruby(neal_ford)
Page 16: Comparing groovy and_j_ruby(neal_ford)

Perl !!!!!!!!!

Page 17: Comparing groovy and_j_ruby(neal_ford)

Ruby has some Perl-isms...

...with significant differences

Page 18: Comparing groovy and_j_ruby(neal_ford)

closures

Page 19: Comparing groovy and_j_ruby(neal_ford)
Page 20: Comparing groovy and_j_ruby(neal_ford)
Page 21: Comparing groovy and_j_ruby(neal_ford)
Page 22: Comparing groovy and_j_ruby(neal_ford)
Page 23: Comparing groovy and_j_ruby(neal_ford)

passing closures

Page 24: Comparing groovy and_j_ruby(neal_ford)

auto-blocks

Page 25: Comparing groovy and_j_ruby(neal_ford)

passing closures

Page 26: Comparing groovy and_j_ruby(neal_ford)

in Groovy, everything is an object...

in Java™, everything is an object...

...except primitives and nulls

in JRuby, everything is an object

except null

everything except...

.

Page 27: Comparing groovy and_j_ruby(neal_ford)

null is null

?. handles protected reference

person?.address?.street

Page 28: Comparing groovy and_j_ruby(neal_ford)

nil is an instance of NilClass

Page 29: Comparing groovy and_j_ruby(neal_ford)
Page 30: Comparing groovy and_j_ruby(neal_ford)

switch/case statement

Page 31: Comparing groovy and_j_ruby(neal_ford)
Page 32: Comparing groovy and_j_ruby(neal_ford)
Page 33: Comparing groovy and_j_ruby(neal_ford)

=== isCase()

Page 34: Comparing groovy and_j_ruby(neal_ford)

“spread” operator

Page 35: Comparing groovy and_j_ruby(neal_ford)

“elvis” operator

Page 36: Comparing groovy and_j_ruby(neal_ford)

side effects of encapsulating

Java™

Page 37: Comparing groovy and_j_ruby(neal_ford)

things added to Object

Page 38: Comparing groovy and_j_ruby(neal_ford)

supporting collections

Page 39: Comparing groovy and_j_ruby(neal_ford)

really? really!

Page 40: Comparing groovy and_j_ruby(neal_ford)

JRuby adds artifacts to “Rubify” Java™

...but doesn’t add collection stuff to Object

JRuby additions

ArrayList

Fixnum

Page 41: Comparing groovy and_j_ruby(neal_ford)

Groovy is optionally typed

(kind of)

Page 42: Comparing groovy and_j_ruby(neal_ford)
Page 43: Comparing groovy and_j_ruby(neal_ford)

search exists on Stack

but not on ArrayListor List!

Page 44: Comparing groovy and_j_ruby(neal_ford)

interfaces & mixins

Page 45: Comparing groovy and_j_ruby(neal_ford)

“fake out” interfaces via closures using as

allows you to interact with Java™ interfaces

can wrap proxies around them if needed

Groovy & interfaces

Page 46: Comparing groovy and_j_ruby(neal_ford)
Page 47: Comparing groovy and_j_ruby(neal_ford)

be careful when implementing with a map:NullPointerException if you forget a method

Page 48: Comparing groovy and_j_ruby(neal_ford)

named after ice cream mix-ins

mixin

first appeared in symbolic logic’s flavors system

a way to collect functionality

not a form of specialization

Ruby has no interfaces

Page 49: Comparing groovy and_j_ruby(neal_ford)
Page 50: Comparing groovy and_j_ruby(neal_ford)

comparisons

Page 51: Comparing groovy and_j_ruby(neal_ford)

comparisons

Page 52: Comparing groovy and_j_ruby(neal_ford)
Page 53: Comparing groovy and_j_ruby(neal_ford)
Page 54: Comparing groovy and_j_ruby(neal_ford)

comparisons

Page 55: Comparing groovy and_j_ruby(neal_ford)

violating handshakes

Page 56: Comparing groovy and_j_ruby(neal_ford)

mixins in Groovy,interfaces in JRuby

Page 57: Comparing groovy and_j_ruby(neal_ford)
Page 58: Comparing groovy and_j_ruby(neal_ford)

interfaces in JRuby?

Page 59: Comparing groovy and_j_ruby(neal_ford)
Page 60: Comparing groovy and_j_ruby(neal_ford)

meta-programming

Page 61: Comparing groovy and_j_ruby(neal_ford)

mostly parity (functionally)

very different implementations

Page 62: Comparing groovy and_j_ruby(neal_ford)

attr_reader, attr_writer, attr_accessor

much of Ruby’s infrastructure is meta-programming

meta-programming methods:

private, protected, public

include

executable declarations

Page 63: Comparing groovy and_j_ruby(neal_ford)

AST transformations

Page 64: Comparing groovy and_j_ruby(neal_ford)

implementation

Page 65: Comparing groovy and_j_ruby(neal_ford)
Page 66: Comparing groovy and_j_ruby(neal_ford)

optional inclusion

Page 67: Comparing groovy and_j_ruby(neal_ford)

conditional method

Page 68: Comparing groovy and_j_ruby(neal_ford)

attributes

Page 69: Comparing groovy and_j_ruby(neal_ford)

hook methods

Page 70: Comparing groovy and_j_ruby(neal_ford)

sticky attributes

private, protected, public

Page 71: Comparing groovy and_j_ruby(neal_ford)

eigenclass

Page 72: Comparing groovy and_j_ruby(neal_ford)

adding methods via proxies

Page 73: Comparing groovy and_j_ruby(neal_ford)
Page 74: Comparing groovy and_j_ruby(neal_ford)

Groovy’s eigenclass

Page 75: Comparing groovy and_j_ruby(neal_ford)

framework approach

Page 76: Comparing groovy and_j_ruby(neal_ford)

encapsulate & extend

Page 77: Comparing groovy and_j_ruby(neal_ford)

use Groovy to simplify and humanize them

leverage the existing industrial strength Java™ stack

encapsulate best-of-breed frameworks

encapsulate, then build up

Groovy & Grails

Page 78: Comparing groovy and_j_ruby(neal_ford)
Page 79: Comparing groovy and_j_ruby(neal_ford)

abstractionlayersviameta || dsl

Page 80: Comparing groovy and_j_ruby(neal_ford)

Ruby on Rails = software factories + dsl’s

tends to build things as abstraction layers atop Ruby using meta-programming & dsl techniques

lightweight abstraction layers

Ruby language is always 1 abstraction layer down

Ruby

Page 81: Comparing groovy and_j_ruby(neal_ford)

case study: builders

Page 82: Comparing groovy and_j_ruby(neal_ford)

GroovyObjectSupport

BuilderSupport

MarkupBuilder

Page 83: Comparing groovy and_j_ruby(neal_ford)
Page 84: Comparing groovy and_j_ruby(neal_ford)

builder

Page 85: Comparing groovy and_j_ruby(neal_ford)

builder works via method_missing

but what about this?

Page 86: Comparing groovy and_j_ruby(neal_ford)
Page 87: Comparing groovy and_j_ruby(neal_ford)

the problem:

how do you inherit from object...

...with inheriting from object?

Page 88: Comparing groovy and_j_ruby(neal_ford)

BlankSlate

Recorder

Jim Weirich’s BlankSlate1.8

1.9BasicObject

BasicObject

Recorder

Object

RecorderBuilder Builder

Page 89: Comparing groovy and_j_ruby(neal_ford)
Page 90: Comparing groovy and_j_ruby(neal_ford)

abstractions with dsl’s

Groovy encapsulates and builds up

Ruby either builds

via meta-programming

different philosophies

Page 91: Comparing groovy and_j_ruby(neal_ford)

summary

Page 92: Comparing groovy and_j_ruby(neal_ford)
Page 93: Comparing groovy and_j_ruby(neal_ford)
Page 94: Comparing groovy and_j_ruby(neal_ford)

the real JDK™ 2.0!

unparalleled Java™ integration

willing to evolve the language

building up from best-of-breed

the good

Page 95: Comparing groovy and_j_ruby(neal_ford)

never spread out of the Java™ community

fast changing at the core

single runtime platform

framework approach?

the bad

Page 96: Comparing groovy and_j_ruby(neal_ford)

def name

public String getName()public void setName(String name)

Page 97: Comparing groovy and_j_ruby(neal_ford)
Page 98: Comparing groovy and_j_ruby(neal_ford)

futuristic framework approach

well established (older than Java™)

virtually effortless meta-programming

interpreted, then jit-ted

truly cross platform, for the new definition of platform

the good

Page 99: Comparing groovy and_j_ruby(neal_ford)

unfamiliar frameworks

some impedance mismatch with Java™ (smaller all the time)

yet another language to learn

you have to learn to think like a Ruby-ist

you have to switch to a new community

the bad

Page 100: Comparing groovy and_j_ruby(neal_ford)
Page 101: Comparing groovy and_j_ruby(neal_ford)

ThoughtWorks

This work is licensed under the Creative Commons Attribution-Share Alike 3.0 License.

http://creativecommons.org/licenses/by-sa/3.0/us/

?’splease fill out the session evaluationssamples at github.com/nealford

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

blog: memeagora.blogspot.com

twitter: neal4d

Page 102: Comparing groovy and_j_ruby(neal_ford)

resources

ThoughtWorks

groovy web sitehttp://groovy.codehaus.org

jruby sitehttp://jruby.codehaus.org

Cow in the Road photo by Sophia Huda, from Flickr, under a Creative Commons license

charles nutter’s bloghttp://headius.blogspot.com/

ola bini’s bloghttp://olabini.blogspot.com/

Page 103: Comparing groovy and_j_ruby(neal_ford)

resources

ThoughtWorks

graeme rocher’s bloghttp://graemerocher.blogspot.com/

aboutGroovyhttp://aboutGroovy.com

jeff brown’s bloghttp://javajeff.blogspot.com/

venkat subramaniam’s bloghttp://www.agiledeveloper.com/blog/