pragmatic metaprogramming

53
Pragmatic MetaProgramming Mårten Rånge SWETUGG 10:50

Upload: marten-range

Post on 15-Jul-2015

223 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Pragmatic metaprogramming

Pragmatic MetaProgrammingMårten Rånge

SWETUGG 10:50

Page 2: Pragmatic metaprogramming

Mårten Rånge

@marten_range

Page 3: Pragmatic metaprogramming

Pragmatic MetaProgramming

Page 4: Pragmatic metaprogramming

DNRYDo Not Repeat Yourself

Page 5: Pragmatic metaprogramming

Loops are great

x += 1;x += 2;x += 3;x += 4;x += 5;x += 6;x += 7;x += 8;x += 9;x += 10;

Page 6: Pragmatic metaprogramming

Loops are great

for (var iter = 1; iter < 11; ++iter){

x += iter;}

Page 7: Pragmatic metaprogramming

Functions are great

var z1 = t*(y1 – x1) + x1var z2 = t*(y2 – x2) + x2var z3 = t*(y3 – x3) + x3

Page 8: Pragmatic metaprogramming

Functions are great

double Lerp (this double t, double x, double y){

return t*(y – x) + x;}

var z1 = t.Lerp (x1, y1);var z2 = t.Lerp (x2, y2);var z3 = t.Lerp (x3, y3);

Page 9: Pragmatic metaprogramming

Repeating myself

[Serializable]public class AnException : Exception{

public AnException ();public AnException (string message);public AnException (string message, Exception exc);protected AnException (

SerializationInfo info, StreamingContext context);

[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]

public override void GetObjectData (SerializationInfo info, StreamingContext context)

}

Page 10: Pragmatic metaprogramming

Repeating myself

AnException Exception

Page 11: Pragmatic metaprogramming

Repeating myself

[Serializable]public class AnException : Exception{

public AnException ();public AnException (string message);public AnException (string message, Exception exc);protected AnException (

SerializationInfo info, StreamingContext context);

[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]

public override void GetObjectData (SerializationInfo info, StreamingContext context)

}

Page 12: Pragmatic metaprogramming

Repeating myself

exception AnException of int*string

Page 13: Pragmatic metaprogramming

Repeating myself

public class MyViewModel : INotifyPropertyChanged{

int m_myProperty = 0;public int MyProperty{

get { return m_myProperty; }set{

m_myProperty = valueOnRaisePropertyChanged ("MyProperty")

}}

void OnRaisePropertyChanged (string propertyName);}

Page 14: Pragmatic metaprogramming

Repeating myself

int MyProperty

Page 15: Pragmatic metaprogramming

Repeating myself

public class MyViewModel : INotifyPropertyChanged{

int m_myProperty = 0;public int MyProperty{

get { return m_myProperty; }set{

m_myProperty = valueOnRaisePropertyChanged ("MyProperty")

}}

void OnRaisePropertyChanged (string propertyName);}

Page 16: Pragmatic metaprogramming

Repeating myself

class Customer {

public long Id ; public string FirstName; public string LastName ;

}public Customer ReadCustomer (IDataReader dr){

return new Customer{

Id = dr.GetInt64 (0),FirstName = dr.GetString (1),LastName = dr.GetString (2),

};}

Page 17: Pragmatic metaprogramming

Repeating myself

class Customer {

public long Id ; public string FirstName; public string LastName ;

}public Customer ReadCustomer (IDataReader dr){

return new Customer{

Id = dr.GetInt64 (0),FirstName = dr.GetString (1),LastName = dr.GetString (2),

};}

Page 18: Pragmatic metaprogramming

Repeating myself

Customer

long Id string FirstNamestring LastName

Page 19: Pragmatic metaprogramming

Repeating myself

class Customer {

public long Id ; public string FirstName; public string LastName ;

}public Customer ReadCustomer (IDataReader dr){

return new Customer{

Id = dr.GetInt64 (0),FirstName = dr.GetString (1),LastName = dr.GetString (2),

};}

Page 20: Pragmatic metaprogramming

Code duplication increases maintenance cost

Page 21: Pragmatic metaprogramming

Looking for answers

Reflection

LINQ Expression Trees

Dynamic IL

Page 22: Pragmatic metaprogramming

Adding complexity

Trading compile-time errors for run-time errors

Hard to get enough test coverage

Hard to understand

No exit strategy

Risky to change

Limited

Page 23: Pragmatic metaprogramming
Page 24: Pragmatic metaprogramming

public Customer ReadCustomer (IDataReader dr){

return new Customer{

Id = dr.GetInt64 (0),FirstName = dr.GetString (1),LastName = dr.GetString (2),

};}

Page 25: Pragmatic metaprogramming

Adding complexity

Trading compile-time errors for run-time errors

Hard to get enough test coverage

Hard to understand

No exit strategy

Risky to change

Limited

Page 26: Pragmatic metaprogramming

Complex code increases maintenance cost

Page 27: Pragmatic metaprogramming
Page 28: Pragmatic metaprogramming
Page 29: Pragmatic metaprogramming

Looking for answers

Powerful

Simple concept

Language agnostic

Exit strategy

Lightweight

Page 30: Pragmatic metaprogramming

T4

Page 31: Pragmatic metaprogramming

class Example{

public int X0 = 0;public int X1 = 1;public int X2 = 2;public int X3 = 3;public int X4 = 4;public int X5 = 5;public int X6 = 6;public int X7 = 7;public int X8 = 8;public int X9 = 9;

}

T4

Page 32: Pragmatic metaprogramming

class Example{<# for (var iter = 0; iter < 10; ++iter) { #>

public int X<#=iter#> = <#=iter#>;<# } #>}

T4

Page 33: Pragmatic metaprogramming

class Example{

public int X0 = 0;public int X1 = 1;public int X2 = 2;public int X3 = 3;public int X4 = 4;public int X5 = 5;public int X6 = 6;public int X7 = 7;public int X8 = 8;public int X9 = 9;

}

T4

Page 34: Pragmatic metaprogramming

Demo.001Getting started with T4

Page 35: Pragmatic metaprogramming

Betty Holberton

Merge Sort Generator (1951)

Page 36: Pragmatic metaprogramming

Repeating myself

public class MyViewModel : INotifyPropertyChanged{

int m_myProperty = 0;public int MyProperty{

get { return m_myProperty; }set{

m_myProperty = valueOnRaisePropertyChanged ("MyProperty")

}}

void OnRaisePropertyChanged (string propertyName);}

Page 37: Pragmatic metaprogramming

Repeating myself

public class MyViewModel : INotifyPropertyChanged{

int m_myProperty = 0;public int MyProperty{

get { return m_myProperty; }set{

m_myProperty = valueOnRaisePropertyChanged ()

}}

void OnRaisePropertyChanged ([CallerMemberName]string name = null);}

Page 38: Pragmatic metaprogramming

Repeating myself

int MyProperty

Page 39: Pragmatic metaprogramming

Repeating myself

public class MyViewModel : INotifyPropertyChanged{

int m_myProperty = 0;public int MyProperty{

get { return m_myProperty; }set{

m_myProperty = valueOnRaisePropertyChanged ("MyProperty")

}}

void OnRaisePropertyChanged (string propertyName);}

Page 40: Pragmatic metaprogramming

Demo.002Generating view model classes

Page 41: Pragmatic metaprogramming

T4

Powerful

Simple concept

Language agnostic

Exit strategy

Lightweight

Page 42: Pragmatic metaprogramming

Carnelian

Page 43: Pragmatic metaprogramming

class Example{<# for (var iter = 0; iter < 10; ++iter) { #>

public int X<#=iter#> = <#=iter#>;<# } #>}

T4

Page 44: Pragmatic metaprogramming

class Example{@@> for iter in 0..10

public int X@@=iter=@@ = @@=iter=@@;@@> end

}

Carnelian

Page 45: Pragmatic metaprogramming

Demo.003Carnelian

Page 46: Pragmatic metaprogramming

Carnelian

Powerful

Simple concept

Language agnostic

Exit strategy

Lightweight

Page 47: Pragmatic metaprogramming

Start small

Page 48: Pragmatic metaprogramming

class Example{<# for (var iter = 0; iter < 10; ++iter) { #>

public int X<#=iter#> = <#=iter#>;<# } #>}

T4 is ASP/PHP for code

Page 49: Pragmatic metaprogramming

T4 saved me

Page 50: Pragmatic metaprogramming

Mårten Rånge

@marten_range

Page 51: Pragmatic metaprogramming

T4

T4 Addinhttp://t4-editor.tangible-engineering.com/

T4 Bloghttp://www.olegsych.com/

T4Includehttp://github.com/mrange/t4Include/

Page 52: Pragmatic metaprogramming

”The CORRECT Way to Code a Custom Exception Class”

http://bit.ly/1AsJ0UH

Page 53: Pragmatic metaprogramming

Vad tyckte du om sessionen?

svara på vägen ut