+ All Categories
Home > Documents > DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS...

DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS...

Date post: 24-Aug-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
64
DYNAMIC: DON’T BE AFRAID Hadi Hariri JetBrains
Transcript
Page 1: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DYNAMIC: DON’T BE AFRAID

Hadi Hariri

JetBrains

Page 2: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

The What, the Why, the How

Agenda

Page 3: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

A tale as old as time…

A Tale as Old as Time...

Page 4: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Static vs Dynamic

Static vs Dynamic

Page 5: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Blog

Posts

Discussion

Threads

Blog Posts

and more blog

posts

Page 6: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

• Types can be implicit or explicit (var)

• Compiler Safety

• Early Binding

In the Static World

Page 7: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

• Types defined at runtime

• No Compiler (Usually)

• Late Binding

• Interpreted (Not always)

In a Dynamic World

Page 8: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

What Dynamic Developers think of Static Developers…

Page 9: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

I need my compiler!

Page 10: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

What Static Developers think of Dynamic Developers…

Page 11: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

http://nimblepros.com/products/software-craftsmanship-2012-calendar.aspx

Page 12: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

"You cannot build serious business applications in

dynamic languages"

Page 13: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 14: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 15: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 16: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

They both have Good and Bad Things

Page 17: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DLR & C# 4

Page 18: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

• dynamic keyword

• Classes/Binders and interfaces to work with

dynamic types

C# added...

Page 19: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Hosting API Debugging API

Interop Binders Dynamic

Objects

Call-Site

Caching Expressions

Expression Compiler

/ Interpreter IL Code Generator

DLR added…

Page 20: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DLR

IronRuby IronPython C# VB.NET

Bindings

.NET Ruby Python Office

The Big Picture

Page 21: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

http://www.flickr.com/photos/bitjungle

Page 22: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

GET YOUR STINKING

DYNAMIC TYPES OFF

OF MY STATIC

LANGUAGE

Page 23: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

IS THERE A NEED?

Page 24: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Readability

Page 25: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 26: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Interoperability

Page 27: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Interoperability with other languages

• IronPython

• Interpreted

• Can be compiled

• IronRuby

• Interpreted

• Your own language

Page 28: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 29: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 30: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 31: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

TALKING RUBY

Page 32: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Interoperability

• Talking to COM

• Need a type-library beforehand

• Use Method Invocation

Page 33: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

TALKING COM

Page 34: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

The Case of the DTO

Page 35: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Creating Dynamic Objects in C#

Page 36: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Options

• ExpandObject

• DynamicObject

• IDynamicMetaObjectProvider

Page 37: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Expando Object

• Built-in Dynamic Object. Works out of the box

• Benefits over Dictionary

• More Fluent

• Support for Methods

• Supports Hierarchies

• Implements INotifyPropertyChanged

• Limitations • Index Access

Page 38: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

ON THE FLY: BASICS OF DYNAMIC

Page 39: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

EXPANDOS

Page 40: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DynamicObject

• Moving Beyond an Expando

• Built-in class which implements IDynamicMetaObjectProvider

• Allows easy creation of Dynamic types

Page 41: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

MVC – V IEWBAG, DYNAMICOBJECTSIMPLE

Page 42: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

IDynamicMetaObjectProvider

• Meta Object that performs binding

• Allows decoupling from class

• Uses DLR Expressions

• Returns DynamicObject

Page 43: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

DYNAMICPROVIDER

Page 44: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Undetermined API

Page 45: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Aspects of MetaProgramming

• Adding / Removing Methods

• Creating Instance Methods

• Creating Static / Class Methods

• Query Classes

Page 46: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider
Page 47: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

DYNAMICMETHODMISSING – S IMPLE DATA

Page 48: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Consuming the ever-changing

Page 49: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

CONSUMINGJSON

Page 50: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DSL's and Fluent API's

Page 51: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

A QUICK LOOK UNDER THE HOOD…

Page 52: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

The backbone of dynamic support

DLR

Language Semantics

via DLR EXpression

Define Late Binding

Logic

Page 53: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DLR Expression

• Superset of Linq.Expression

• Common to multiple Languages

• DLR Expression is to DLR Languages what IL is to CLR languages

C# VB.NET

IL

CLR

IronPython IronRuby

DLR Expression

DLR Runtime

Page 54: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Late Binding

• We only know the types at runtime

• We have to figure out how to call those methods at runtime

• It’s not embedded in the “IL”

• It’s potentially slower

Page 55: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Late Binding

• Using Binders and Call Sites

• Using Dynamic Expression (uses former internally)

Page 56: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Late Binding

Page 57: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

DEMO

DYNAMICCONVERSION

Page 58: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

SUMMING UP…

Page 59: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

The Disadvantages

• There is no compile type-checking*

• Potentially slower (even with caching)

• There is no Intellisense*

* Partially incorrect – It’s about the tooling

Page 60: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Reasons to not not use dynamic

Page 61: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Reasons to not not use dynamic

• There’s no compiler

• There’s no intellisense (Emphasis on Unit Tests)

• You shouldn’t mix dynamic and static languages

Page 62: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Reasons to use dynamic

Page 63: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Reasons to use Dynamic

• Interoperability • COM

• Consuming Dynamic Languages • Ruby

• JavaScript

• Fluent API’s and DSL

• Consuming the *unknown*

• Dynamic Structures

• Avoiding unnecessary “class explosion”

Page 64: DYNAMIC: DON’T BE AFRAID · 2011. 10. 10. · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond an Expando •Built-in class which implements IDynamicMetaObjectProvider

Thank you


Recommended