58
Learning to Live with the Static Typing Fascist and the Dynamic Typing Fanboy in your Enterprise... James Crisp and Jim Webber, ThoughtWorks ARC310

James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

  • View
    221

  • Download
    3

Embed Size (px)

Citation preview

Page 1: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Learning to Live with the Static Typing Fascist and the Dynamic Typing Fanboy in your Enterprise...

James Crisp and Jim Webber, ThoughtWorks

ARC310

Page 2: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Roadmap

PlatformCode affordancesTool supportExtensibilityDevelopment ProcessData accessMetaprogrammingApplication developmentIntegration

Page 3: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Platform

Windows!.Net 3.5

Maybe Linux, via Mono

Page 4: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Platform

AnywhereWindowsLinuxMacCLRJVM

Page 5: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Readability

How concise and readable is thecode?How much code will I have to maintain?How productive can I be?

Page 6: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Attributes

class Person attr :id attr_accessor :name, :ageend

Page 7: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Named Parameters

p = Person.new(:first_name => "Freddy",:last_name => "Flintoff")

p.update(:age => 72, :sex=>'m')

Page 8: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Default PropertyImplementationclass Person{ public string FirstName { get; set; }...

Page 9: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Initialisers

Person p = new Person { LastName = "Dundee", FirstName = "Mick" };

Page 10: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Meta Plumbing

class DomainObject def initialize(attributes = {}) attributes.each do |name, value| eval("@#{name} = value") end end end

Page 11: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Duck Typing

h = House.new( number => 20 )p = Phone.new( number => 123456 )

p = h

p.number >> 20

Page 12: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Type Inference

var p = new Person { LastName = "Smith"};

Page 13: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Who needs Duck Typing?

interface INumbered{ int Number { get; }}

class House : INumbered ...class Phone : INumbered ...

INumbered phone;INumbered house = new House();phone = house;phone.Number

Page 14: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Data

LINQ and Entity FrameworkCastle project

Active record for .NetBuilds on NHibernate

NHibernate too!

Page 15: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Design Time

Page 16: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Generate and Use theDatabasePersonDataContext pdc = new PersonDataContext();pdc.CreateDatabase();

var adults = from p in pdc.Persons where p.Age > 18 select p;

foreach (Person adult in adults){ Console.WriteLine(adult.FirstName + " " + adult.LastName);}

Page 17: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Data

Active Record ships with RailsGood for green field web appsObjects and properties mapped 1:1 to tables and columnsSimple API for searching and saving

Can use underlying platform – eg, Hibernate or NHibernate

Page 18: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Lambda Functions

What are Lambda functions?

From the functional programming community

Who?

Think: anonymous inline methodsC# 2.0 anonymous delegates with nicer syntax

Page 19: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Pass a function into acollectionList<Person> people = new List<Person>();people.Add(new Person { FirstName = "James", LastName = "Crisp", Age = 8 });

people.Add(new Person { FirstName = "Jim", LastName = "Webber", Age = 32 });

people.ForEach(p => Console.WriteLine(p.FirstName + " " + p.LastName));

Page 20: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Lambda Functions

codgers = people.find {|p| p.age > 30}

codgers.each {|c| print c.name }

Page 21: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Metaprogramming & DSLs

Method Missing

DSLs

Code generation at run time

Page 22: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Method Missing

If a method is not defined, falls through to ‘method_missing’.

ActiveRecord (part of Rails) uses this to “generate” properties on domain objects at run time.

Allows DSLs like :Person.find_by_name_and_age('Jim', 84)

Page 23: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Code Generation atRun Time

Create new properties, methods and classes on the fly

Redefine, wrap and rename methods

Eval() a string, and it will be code

Page 24: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Code Generating DSL

class Geek < ActiveRecord::Basehas_many :laptopshas_one :girlfriend

end

jim = Geek.new(:name => 'Jim' )laptop = Laptop.new(:brand=> 'dell')jim.laptops << laptop

Page 25: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

rSpec DSL

describe Geek do before(:each) do @geek = Geek.new end

it "should have no laptops initially" do @geek.laptops.count.should == 0 end

....

Page 26: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Autogen andMetaprogramming

Can generate useful code from metadata at compile time

E.g. Domain objects from database schemasE.g. Service proxies from WSDLEtc

Attributes for metaprogrammingAnd the reflection APIs if I have to...

Page 27: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

DSLs

Some support for fluent interfacesin NUnit etc

Assert.That(...);Assert.IsNotNull(...);

Can create our own DSLs by using cunning class name conventions

E.g. nBehave for BDDLike TDD but focussed on behaviour rather than implementation

Page 28: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

nBehave DSL

override public void Specify(){ Given(new RubyProgrammer()). When(new BuildingProperSoftware()). Then(new RubyProgrammerShouldBeFired());} Tooling available to turn

this code into development stories for

xBehave

Page 29: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Extensible Type System

All classes are open and can beextendedEg, Rails extends Ruby's number class: >> 5.days.from_now => Sun Aug 05 14:28:12 +1000 2007

Existing methods can be removed, wrapped or renamed

Frameworks often designed around re-usable Mixins rather than inheritance

Page 30: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Adding new methods

class String def url? self.starts_with? "http://" endend

>> "hi".url?=> false>> "http://jamescrisp.org".url?=> true

Page 31: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Extensible Type System

We’ve always had interfaces andabstract classes from the underlying .Net frameworkNow we have extension methods too...

Page 32: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Defining Extension Methods

namespace JimWebber{ public static class WebUriValidator { public static bool IsValidUri(this string str) { return str.ToLower().StartsWith("http"); } }}

Page 33: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Using Extension Methods

using JimWebber;class Program{ static void Main(string[] args) { string s ="http://jim.webber.name"; bool b = s.IsValidUri(); }}

Page 34: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Testing

Unit Testing TDD – NUnit BDD – nBehavenMock – Interfaces easy, classes slightly trickier

Page 35: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

NUnit

[TestFixture]public class PersonTest{ [SetUp] public void GivenAPersonExists() {..} [TearDown] public void PersonShouldBeRemoved() {..} [Test] public void PersonShouldBeOlderThanZero() { ... Assert.That(p.Age > 0); }}

Page 36: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

nMock Example

InterfaceToBeMocked aMock = mocks.NewMock<IPerson>();

Stub.On(aMock).GetProperty("Age") .Will(Return.Value(32));

Expect.Once.On(aMock) .GetProperty("FirstName") .Will(Return.Value("Jim"));

Page 37: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Testing

TDDUnit test framework part of standardlibraries

BDDrSpec, rBehave

MocksMocha, rMock, FlexMock, etc

Page 38: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Unit Test Example

def test_person_is_called_james do assert_equal 'James', @person.nameend

OR after a little bit of meta programming

test 'person is called James' do assert_equal 'James', @person.nameend

Page 39: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Mocha Example

p = mock('person')

p.stubs(:age).returns(26)

p.expects(:name).returns('James')

Page 40: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Tool Support

Visual StudioIntellisense, debugger, PowerShell, etc

Continuous IntegrationCruiseControl.Net and friends

Build ProcessNAnt, MSBuild, NMaven, etc

Page 41: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

PowerShell

PS C:\Users\Jim Webber> $name = "Jim Webber"PS C:\Users\Jim Webber> $nameJim WebberPS C:\Users\Jim Webber> $name.ToLower()jim webberPS C:\Users\Jim Webber>

PS C:\Users\Jim Webber> ([xml](new-object System.Net.WebClient).DownloadString("http://jim.webber.name/feeds/atom.aspx") ).feed.titleWorld Wide Webber

Page 42: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Tool Support

IDE Visual Studio with Iron RubyIntelliJ, e-Edit, TextMate provide syntax highlighting and script support.

Build Process: Rake

Continuous IntegrationCruiseControl.rb and friends

Page 43: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Console

C:\ruby>ruby script/console>> p = Person.new( :name => 'Jim' )=> #<Person:0x49c8d40 @attributes={"name"=>"Jim"}, ...>>> p.save>> name = 'Jim'>> Person.find(:first, ['name = ', name])=> #<Person:0x69c1d40 @attributes={"name"=>"Jim"}, ...>

Page 44: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Gems

C:\ruby> gem install mocha

Bulk updating Gem source index for: http://gems.rubyforge.org

Successfully installed mocha-0.5.3

Installing ri documentation for mocha-0.5.3...Installing RDoc documentation for mocha-0.5.3...

Page 45: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

NMaven

Apache Incubator projectSupports repositories for dependencies

Across the InternetPlugs into the standard Maven build cycleWill have VS integrationExtensible through Mono-based plugins

Also could use Ivy for dependency management...

Warning: NMaven currently immature

Page 46: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Web Apps RAILSRails is the most famous and popularRuby framework

Rails provides (among other things):Neat MVC framework and route mappingTemplate based viewsDomain focussed business layerActive Record and DSLs for persistenceEasy AJAX and Web 2.0 supportAuto-generated code (write time and run time)Fast change cycle (edit file -> refresh page)Plug-ins for code re-use

Page 47: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Web Apps

ASP.NetPlus new ASP.Net AJAX functionality

Combine ASP.Net with Entity Framework for Rails-like functionality

SilverlightFor richer client functionality

Page 48: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Rich Client

Most Ruby dev is Rails and Web 2.0

There are GTK / Gnome bindings for Ruby and some rich client Ruby apps.

WPF under .NET

Page 49: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Rich Client

WPFClear separation of markup andbusiness logicWhizzy acceleration and goodness from DirectX 10

Also the older WinForms stuff is available

Page 50: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Integration

WCF WS-*

SOAP, WSDL, WS-Sec, WS-SecPol, WS-Trust, WS-Federation, WS-Coordination. WS-AtomicTransaction, WS-KitchenSink...

REST SupportURI templates, [WebGet], etc

Enterprise-y stuff tooQueues

Page 51: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Integration

REST-centricWeb services are produced like web pages, using same framework and routingMessage Queues using Reliable-Msg or underlying JMS or MSMQWS-* support

SOAP4RUse underlying platform for WS-*, eg, WCF or Java frameworks like XFire

Page 52: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

XML and Friends

.Net has XmlSerializer (and friends)Dom, XPath, templates, etc

VB has XML literal support...Dim x As XElement = <date> <year>2006</year> <month>01</month> <day>01</day> </date>

Page 53: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

C# Not Tightly Coupled toXMLvar x = new XElement("Date");x.Add(new XElement("Year", "2006"));x.Add(new XElement("Month", "01"));x.Add(new XElement("Day", "01"));

Page 54: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

XML and Friends

XPath and Document Object Modelwell supported

To generate complex XML (eg, LIXI), the best way is templating using Erb

All objects have to_xml method with serialises properties to xml

XML Builder is nice to work with and leverages Ruby's flexible method_missing

Page 55: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

XML Builder

>> builder.date { ?> builder.year "2006" >> builder.month "01" >> builder.day "01" >> } <date> <year>2006</year> <month>01</month> <day>01</day><date>

Page 56: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Coexisting in theenterprise

When to go Ruby versuswhen to use C# and .Net?

Enterprise “heavy lifting?”

Cross-language enterprise development?

And what about mixing C# and IronRuby...?

Page 57: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Questions?Ask James and Jim!

ARC 310

Page 58: James Crisp and Jim Webber, ThoughtWorks ARC310. Platform Code affordances Tool support Extensibility Development Process Data access Metaprogramming

Evaluation FormsDon’t Forget!

ARC 310