tirsdag 18. januar 2011 DSL C# Webutvikling
For en gangs skyld skal jeg poste noen andres kode her på bloggen. Jeg har nemlig kommet over et lite stykke C#-kode som jeg syntes var verdt litt ekstra oppmerksomhet. I vinter brukte vi i PSWinCom et rammeverkt som heter OpenRasta til å implementere et REST-API for vårt Intouch-produkt. OpenRasta er et open source-prosjekt utviklet av Sebastian Lambla, og det var her jeg oppdaget en mildt sagt spesiell utnyttelse av C#.
Du kan jo bedømme selv…
10 public class OperationResultPage : Element 11 { 12 public OperationResultPage(OperationResult result) 13 { 14 Root = this 15 [html 16 [head[title[result.Title]]] 17 [body 18 [h1[result.Title]] 19 [p[result.Description]] 20 ] 21 ]; 22 } 23 24 protected Element Root { get; set; } 25 }
Når du ser koden for første gang tar det noen sekunder før hjernen aksepterer at det er C#-kode du ser på.
Gjennom serdeles ukonvensjonell bruk av C# har Sebastian rett og slett laget en ganske så fasinerende DSL for å definere HTML-markup. Det minner en god del om (og er helt sikkert inspirert av) tilsvarende DSL’er i mere dynamiske språk – som f.eks. Hiccup i Clojure.
Her er et par utdrag fra den abstrakte klassen OpenRasta.Web.Markup.Elements.Element, som kaster litt mer lys over hvordan koden kombinerer bruk av indeksere og properties for de ulike HTML-taggene til å kjede sammen markup på en helt nye måte.
47 protected Element this[INode child] 48 { 49 get 50 { 51 ChildNodes.Add(child); 52 return this; 53 } 54 }
..og..
96 public IHtmlElement html 97 { 98 get { return Document.CreateElement<IHtmlElement>(); } 99 }
Sebastian er en dyktig utvikler med smittsomt humør og pipete stemme som i tillegg til OpenRasta akkurat nå er kjent for prosjektet OpenWrap, et “pakkehåndteringssystem” for .NET (ala gems for Ruby). Jeg vet ikke om det er Sebastian som har kommet opp med denne DSL-teknikken, eller om det er noe du kan finne andre steder også, men det er liten tvil om at fyren er genial.
Så vil jeg bare avslutte med å foreslå en aktivite som garantert vil gjøre deg til en bedre utvikler: Les mer kildekode! Det finnes et hav av prosjekter der ute som du kan lære av. Hvorfor ikke begynne med OpenRasta for eksempel?!