Construction Techniques For Domain Specific Languages

133
Construction Techniques for Domain-Specific Languages Brian Guthrie bguthrie@thoughtworks.com http://twitter.com/bguthrie

description

 

Transcript of Construction Techniques For Domain Specific Languages

Page 1: Construction Techniques For Domain Specific Languages

Construction Techniques for Domain-Specific LanguagesBrian Guthrie

[email protected]://twitter.com/bguthrie

Page 2: Construction Techniques For Domain Specific Languages

propertieshttp://www.flickr.com/photos/frozenchipmunk/52753779/

Page 3: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 4: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 5: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 6: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

“iced quad venti (with whip) skinny caramel macchiato”

Page 7: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

“iced quad venti (with whip) skinny caramel macchiato”

Page 8: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 9: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 10: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 11: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 12: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 13: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 14: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

Page 15: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

<target name="test" depends="compile" description="Runs tests"> <javac

destdir="${classes.dir}" debug="true" source="${javac.version}" target="${javac.version}">

<classpath refid="build.classpath"/> <src path="${test.dir}"/> <include name="**/*.java"/> </javac> </target>

Page 16: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

<target name="test" depends="compile" description="Runs tests"> <javac

destdir="${classes.dir}" debug="true" source="${javac.version}" target="${javac.version}">

<classpath refid="build.classpath"/> <src path="${test.dir}"/> <include name="**/*.java"/> </javac> </target>

Page 17: Construction Techniques For Domain Specific Languages

“a computer programming language of limited expressiveness

focused on a particular domain.”

<target name="test" depends="compile" description="Runs tests"> <javac

destdir="${classes.dir}" debug="true" source="${javac.version}" target="${javac.version}">

<classpath refid="build.classpath"/> <src path="${test.dir}"/> <include name="**/*.java"/> </javac> </target>

Page 18: Construction Techniques For Domain Specific Languages

internal external

2 flavors

Page 19: Construction Techniques For Domain Specific Languages

internal external

2 flavors

Page 20: Construction Techniques For Domain Specific Languages

internal external

2 flavors

Page 21: Construction Techniques For Domain Specific Languages

API

Page 22: Construction Techniques For Domain Specific Languages

expressiveness

implementation details

Page 23: Construction Techniques For Domain Specific Languages

fluent interface

Page 24: Construction Techniques For Domain Specific Languages

a behavior capable of

relaying or

maintaining the

instruction context for a series of method calls

Page 25: Construction Techniques For Domain Specific Languages

methods make little senseout of context

Page 26: Construction Techniques For Domain Specific Languages

[example]

Page 27: Construction Techniques For Domain Specific Languages
Page 28: Construction Techniques For Domain Specific Languages

source: http://lobobrowser.org/cobra/java-html-parser.jsp

a good candidate

Page 29: Construction Techniques For Domain Specific Languages

forces

CHOICESearly and often

Page 30: Construction Techniques For Domain Specific Languages

beDECLARATIVE

Page 31: Construction Techniques For Domain Specific Languages

beaccepting

Page 32: Construction Techniques For Domain Specific Languages

http://www.flickr.com/photos/11739182@N03/1263985679/

every API is a conversation

Page 33: Construction Techniques For Domain Specific Languages

with yourself

Page 34: Construction Techniques For Domain Specific Languages

with your team members

Page 35: Construction Techniques For Domain Specific Languages

with your business

Page 36: Construction Techniques For Domain Specific Languages

patternshttp://www.flickr.com/photos/mukluk/477913951/

Page 37: Construction Techniques For Domain Specific Languages

example one

method chaining | type transmogrification

Page 38: Construction Techniques For Domain Specific Languages

method chaining | type transmogrification

example one

make modifier methods return the host object so that multiple modifiers

can be invoked in a single expression.

Page 39: Construction Techniques For Domain Specific Languages

method chaining | type transmogrification

example one

Page 40: Construction Techniques For Domain Specific Languages

method chaining | type transmogrification

example one

transform types as needed as part of a fluent interface call

Page 41: Construction Techniques For Domain Specific Languages

start with the goalhttp://www.flickr.com/photos/keylosa/184606430/

Page 42: Construction Techniques For Domain Specific Languages

Calendar

Page 43: Construction Techniques For Domain Specific Languages
Page 44: Construction Techniques For Domain Specific Languages
Page 45: Construction Techniques For Domain Specific Languages
Page 46: Construction Techniques For Domain Specific Languages

Mocha

Page 47: Construction Techniques For Domain Specific Languages
Page 48: Construction Techniques For Domain Specific Languages

what does expects return?

Page 49: Construction Techniques For Domain Specific Languages

mocha/mock.rb

(ArgumentIterator#each returns the Expectation-trust me)

Page 50: Construction Techniques For Domain Specific Languages

mocha/expectation.rb

Page 51: Construction Techniques For Domain Specific Languages

the finishing problemwhen will it all end?

Page 52: Construction Techniques For Domain Specific Languages

implied contracttype transformations are hidden from the caller

the system will arrive at some desired state

Page 53: Construction Techniques For Domain Specific Languages

example two

nested closures | semantic model

Page 54: Construction Techniques For Domain Specific Languages

nested closures | semantic model

example two

Page 55: Construction Techniques For Domain Specific Languages

nested closures | semantic model

example two

express statement sub-elements of a function call by putting them 

into a closure in an argument

Page 56: Construction Techniques For Domain Specific Languages

nested closures | semantic model

example two

Page 57: Construction Techniques For Domain Specific Languages

nested closures | semantic model

example two

the domain model underpinning the DSL

Page 59: Construction Techniques For Domain Specific Languages

define an environment

Page 60: Construction Techniques For Domain Specific Languages

persist metadata to S3

Page 61: Construction Techniques For Domain Specific Languages

spin up in EC2

Page 62: Construction Techniques For Domain Specific Languages
Page 63: Construction Techniques For Domain Specific Languages
Page 64: Construction Techniques For Domain Specific Languages

DSL is a wrapper for a rich domain model

don’t corrupt it!

Page 65: Construction Techniques For Domain Specific Languages
Page 66: Construction Techniques For Domain Specific Languages
Page 67: Construction Techniques For Domain Specific Languages
Page 68: Construction Techniques For Domain Specific Languages

important

definition != domain model

Page 69: Construction Techniques For Domain Specific Languages

domain model

dsl definition

Page 70: Construction Techniques For Domain Specific Languages

A DSL is a languageparse its inputs!

keep your domain model clean!

Page 71: Construction Techniques For Domain Specific Languages
Page 72: Construction Techniques For Domain Specific Languages

literal extension | string polishing

example three

Page 73: Construction Techniques For Domain Specific Languages

literal extension | string polishing

example three

add methods to program literals“monkey patching”

Page 74: Construction Techniques For Domain Specific Languages

literal extension | string polishing

example three

simple string substitutions to convert nearly code to actual code

Page 75: Construction Techniques For Domain Specific Languages

the problem

Page 76: Construction Techniques For Domain Specific Languages

source: http://lobobrowser.org/cobra/java-html-parser.jsp

Page 77: Construction Techniques For Domain Specific Languages

the goal

Page 78: Construction Techniques For Domain Specific Languages

web page to

object model

Page 79: Construction Techniques For Domain Specific Languages
Page 80: Construction Techniques For Domain Specific Languages

org.w3c.Node

Page 81: Construction Techniques For Domain Specific Languages

org.w3c.Node java.util.List

Page 82: Construction Techniques For Domain Specific Languages

groovy already extends Node

Page 83: Construction Techniques For Domain Specific Languages

DOMCategory

Page 84: Construction Techniques For Domain Specific Languages

(brief digression)

Page 85: Construction Techniques For Domain Specific Languages
Page 86: Construction Techniques For Domain Specific Languages
Page 87: Construction Techniques For Domain Specific Languages

shotgun approach to open classes

Page 88: Construction Techniques For Domain Specific Languages

“all willy-nilly”

Page 90: Construction Techniques For Domain Specific Languages

irb

Page 91: Construction Techniques For Domain Specific Languages

script/console (in rails)

Page 92: Construction Techniques For Domain Specific Languages
Page 93: Construction Techniques For Domain Specific Languages

back to Groovy...

Page 94: Construction Techniques For Domain Specific Languages

Element children(), attributes(), text(), name(), parent(), depthFirst(), breadthFirst()

NodeList size(), list(), text(), child

use (DOMCategory) {

}

Page 95: Construction Techniques For Domain Specific Languages

this is awesome!

Page 96: Construction Techniques For Domain Specific Languages

and speaking of which...

Page 97: Construction Techniques For Domain Specific Languages

we can do better!

Page 98: Construction Techniques For Domain Specific Languages
Page 99: Construction Techniques For Domain Specific Languages
Page 100: Construction Techniques For Domain Specific Languages
Page 101: Construction Techniques For Domain Specific Languages

search?

Page 102: Construction Techniques For Domain Specific Languages
Page 103: Construction Techniques For Domain Specific Languages
Page 104: Construction Techniques For Domain Specific Languages
Page 105: Construction Techniques For Domain Specific Languages

literal extension | method chaining

example four

Page 106: Construction Techniques For Domain Specific Languages
Page 107: Construction Techniques For Domain Specific Languages
Page 108: Construction Techniques For Domain Specific Languages

literal extension at theobject level

Page 109: Construction Techniques For Domain Specific Languages

jQuery objects act like arrays

Page 110: Construction Techniques For Domain Specific Languages

jQuery objects are arrays

Page 111: Construction Techniques For Domain Specific Languages

duck typing?http://www.flickr.com/photos/martinlabar/694274715/

Page 112: Construction Techniques For Domain Specific Languages

method chaining andChaining andChaining

example five

Page 113: Construction Techniques For Domain Specific Languages
Page 114: Construction Techniques For Domain Specific Languages

message chains

Page 115: Construction Techniques For Domain Specific Languages

mimic: cloning is expected and encouraged

Page 116: Construction Techniques For Domain Specific Languages
Page 117: Construction Techniques For Domain Specific Languages

“iced quad venti (with whip) skinny caramel macchiato”

Page 118: Construction Techniques For Domain Specific Languages
Page 119: Construction Techniques For Domain Specific Languages
Page 120: Construction Techniques For Domain Specific Languages
Page 121: Construction Techniques For Domain Specific Languages
Page 122: Construction Techniques For Domain Specific Languages

calorieshttp://www.flickr.com/photos/lifeontheedge/2077384723/

“the leaning tower of bacon”

Page 123: Construction Techniques For Domain Specific Languages
Page 124: Construction Techniques For Domain Specific Languages
Page 125: Construction Techniques For Domain Specific Languages

bringing it all back home

http://www.flickr.com/photos/wili/214317898/

Page 126: Construction Techniques For Domain Specific Languages

a DSL is: - an API - a language - a conversation

Page 127: Construction Techniques For Domain Specific Languages

beDECLARATIVE

Page 128: Construction Techniques For Domain Specific Languages

know your audience

Page 129: Construction Techniques For Domain Specific Languages

fluent interface

Page 130: Construction Techniques For Domain Specific Languages

message chains

Page 131: Construction Techniques For Domain Specific Languages

nestedfunction | closure

Page 132: Construction Techniques For Domain Specific Languages

include use extend eval