62
Metaprogramming JavaScript Adam McCrea [email protected]

metaprogramming javascript

  • Upload
    paul

  • View
    268

  • Download
    0

Embed Size (px)

Citation preview

Page 1: metaprogramming javascript

Metaprogramming JavaScript

Adam [email protected]

Page 2: metaprogramming javascript

Making JavaScript Suck Less

Page 3: metaprogramming javascript

Kicking Ass with JavaScript

Page 4: metaprogramming javascript

an (extremely contrived ) example

Page 5: metaprogramming javascript

Specification:- show state field when country is “United States”

Page 6: metaprogramming javascript
Page 7: metaprogramming javascript

Prototype makes it easy

Page 8: metaprogramming javascript

…but then specs change:

- change state field to us-state, and add a province field- show us-state field when country is "United States"- show province field when country is "Canada"- show Brutus when us-state is "Ohio" or "Michigan"

(because we can)

Page 9: metaprogramming javascript
Page 10: metaprogramming javascript

Metaprogramming to the rescue!

Page 11: metaprogramming javascript

details implementation

Page 12: metaprogramming javascript

“what” “how”

details implementation

Page 13: metaprogramming javascript

“what” “how”

details implementation

frequency of change

Page 14: metaprogramming javascript

“what” “how”

details implementation

configuration file?

mini language?

xml? plain text?

executable code?

Page 15: metaprogramming javascript

“what” “how”

details implementation

configuration file?

mini language?

xml? plain text?

executable code?

DSL

Page 16: metaprogramming javascript

A Rails Example

Page 17: metaprogramming javascript

A Rails Example

These are just calls to class methods,what’s the big deal?

It just feels right.

Page 18: metaprogramming javascript

A DSL for dynamic form behavior

Sounds great!

…but…

Where do we start?

Page 19: metaprogramming javascript

start with the specs

Page 20: metaprogramming javascript

start with the specs

Page 21: metaprogramming javascript

start with the specs

language does not mirror the problem domain

Page 22: metaprogramming javascript

let’s try again

Page 23: metaprogramming javascript

let’s try again

Page 24: metaprogramming javascript
Page 25: metaprogramming javascript
Page 26: metaprogramming javascript
Page 27: metaprogramming javascript
Page 28: metaprogramming javascript
Page 29: metaprogramming javascript

Dependency DependencyTrigger

Page 30: metaprogramming javascript

now handle the change event

Page 31: metaprogramming javascript

everything is “wired up”, now make it behave

Page 32: metaprogramming javascript

It works!!!

but it needs cleaned up

Page 33: metaprogramming javascript

let’s avoid top-level functionsby creating our own namespace

Page 34: metaprogramming javascript

Dependency DependencyTrigger

DependencyManager

Form.Behavior

Page 35: metaprogramming javascript

breaking encapsulation

Page 36: metaprogramming javascript

check dependencies when page loads

Page 37: metaprogramming javascript

Fix “domino” bug: when an element is shown/hidden, it may contain trigger fields; check dependencies on these fields

Page 38: metaprogramming javascript

Fix “domino” bug: when an element is shown/hidden, it may contain trigger fields; check dependencies on these fields

Page 39: metaprogramming javascript

Fix “domino” bug: when an element is shown/hidden, it may contain trigger fields; check dependencies on these fields

Page 40: metaprogramming javascript

Fix “domino” bug: when an element is shown/hidden, it may contain trigger fields; check dependencies on these fields

Page 41: metaprogramming javascript

Fix “domino” bug: when an element is shown/hidden, it may contain trigger fields; check dependencies on these fields

hidden fields should have no value –flag them here so we can identify them later

Page 42: metaprogramming javascript
Page 43: metaprogramming javascript

circular reference

DOM Element JavaScript Object

Page 44: metaprogramming javascript

circular reference: resolved

DOM Element JavaScript Object

Page 45: metaprogramming javascript
Page 46: metaprogramming javascript
Page 47: metaprogramming javascript
Page 48: metaprogramming javascript

Our DSL is too rigid, let’s allow some variation:

or

Page 49: metaprogramming javascript
Page 50: metaprogramming javascript

resolves tothis.show()

orthis.hide()

Page 51: metaprogramming javascript
Page 52: metaprogramming javascript
Page 53: metaprogramming javascript

Extensibility

Page 54: metaprogramming javascript

Dependency DependencyTrigger

DependencyManager

Form.Behavior

Actionsextends

Page 55: metaprogramming javascript
Page 56: metaprogramming javascript
Page 57: metaprogramming javascript
Page 58: metaprogramming javascript

More duplication!

It must go.

Page 59: metaprogramming javascript
Page 60: metaprogramming javascript

separate “what” from “how”

mini-language mirroring problem domain

self-documenting code

reuseableeasy to maintain

Metaprogramming Review

Page 61: metaprogramming javascript

keep it object-oriented

method chaining for sentence-like syntax

use with() and English-like method names

don’t fear evalincremental implementation

JavaScript Tools & Tips

Page 62: metaprogramming javascript

Thanks!

[email protected]

adamlogic.com