LINQ extensions - nogen ideer til hvad vi mangler?

by DotNetNerd 31. October 2008 11:32

En af de rigtigt fede ting ved LINQ er at det er så nemt at udvide, så jeg troede egentlig det ville vælte frem med extension librarys. Der er da også kommet nogen stykker man kan finde rundt omkring, men ikke gået så stærkt som jeg egentlig ville tro. Jeg overvejer derfor selv at begynde at lave et med nogle af de helt oplagte, som man ofte står og mangler med udgangspunkt i at extende IEnumerable<T>. Fra dag ét undrede jeg mig f.eks over at der ikke findes en ToCollection i samme stil som ToList? Nu jeg roder med Silverlight er ToObservableCollection også en der springer i tankerne?! Og i god funktionel stil undrer man sig også umiddelbart over at der ikke er en foreach, men det viser sig at være fordi VB ikke kan håndtere statement lambda udtryk. Det vil sige at man eksempelvis ikke kan skrive nedenstående - da det ikke returnerer en værdi.

function(p) Response.Write(p.Name) 

Statement lambda expressions virker imidlertid i C#, så den ryger stadig med i listen over metoder jeg gerne vil have med, især da den er helt oplagt at "låne" her. Klassen der kan hentes via linket indeholder desuden også er andre interessante extensions eksempelvis til at generere sequences ud fra algoritmer/enumerators og til at skrive pretty formated strings ud fra collections. Sidstnævnte kunne iøvrigt passende laves sammen med Scott Hanselmans "Pure evil ToString"

Diverse extensions til serialisering synes jeg også virker oplagte, omvend jeg nok vil ligge dem separat således at man ikke altid får dem med hvis man vil bruge de andre - ToJSON, ToYAML, ToXml, ToBinary osv springer mig umiddelbart i tankerne som muligheder? Hvis du ellers sidder med en god ide til hvad der mangler i standard pakken, så skriv endelig for jeg tager gerne imod forslag, da det kunne være interessant at lave en pakke andre også har gavn af.

Tags:

vNext features i C# og VB

by DotNetNerd 30. October 2008 22:09

Den seneste måned er der begyndt at blive talt om nye features i næste version af kernesprogene i .NET. Personligt er jeg glad for at der er nogen features der idag kun eksisterer i et af sprogene der bliver portet så de findes i begge sprog. Her er der umiddelbart tale om optionel arguments der kommer til C# og automated properties til VB. Begge features er små forbedringer, men nogen man indimellem savner når man, som mig, springer lidt imellem sprogene.

Udover denne synkronisering af sprogene kommer der naturligvis også helt nye tiltag. Herunder named parameters som man kender det fra blandt andet F#, og den mest omtalte feature som er dynamisk bundne metodekald. Sidstnævnte gør det muligt at deklarere et objekt med keywordet dynamic hvorefter man kan kalde metoder på det, som først bliver resolved på afviklingstidspunktet. Det gør det meget enklere at skrive kode som idag vil kræve brug af reflections Method.Invoke eller DynamicMethod.

For at se eksempler og læse mere kan du kigge her hvor Justin Etheredge laver en sammeligning af performance i forhold til reflection baserede løsninger.

Tags: ,

Dotnetnerd - nu også som podcast

by DotNetNerd 28. September 2008 21:36
Så fik jeg mit første podcast under bæltet, og udover at det jo altid er forfærdeligt at høre sin egen stemme synes jeg det er blevet ganske vellykket - især da jeg lige var kommet igennem den indledende nervøsitet. Stor tak her fra til Søren Spelling Lund for en god snak og hans gode arbejde med castet.

Tags:

JQuery nu en del af .NET pakken!

by DotNetNerd 28. September 2008 20:29

Jeg er selv en af de mange der har forelsket mig i JQuery, da det er et fantastisk værktøj der gør livet meget lettere for webudviklere. Dagens gode nyhed som kan læses fra Scott Gu her og fra Hanselman her er at Microsoft fra nu af shipper JQuery sammen med .NET og der vil blive lavet kommentarer til javascript intellisence til det :)

ANUG snak og de korte nyheder

by DotNetNerd 25. September 2008 18:10

Snak for ANUG om F#

Igår var det så langt om længe dagen hvor jeg skulle til Århus for at snakke om F# for Århus .NET usergroup. Jeg har set frem til den udfordring det er i et stykke tid, og heldigvis gik snakken rigtigt godt, og jeg blev meget positivt modtaget i smilets by. Det er fedt at se at der er så mange andre der har interesse i at lære om et sprog som F#, og at stemningen var helt i top med et fagligt højt niveau og plads til at grine lidt af tingene. Jeg gik selv derfra med en rigtig god oplevelse i bagagen, og en hel del erfaringer rigere, da det var en super fed udfordring at tale om et meget nørdet emne for en relativt stor forsamling. Alle deltagende skal ihvertfald have tak for en fed aften herfra :-)

AntiXssLibrary

I den seneste udgave af MSDN magazine faldt jeg over en artikel der hedder "SDL Embraces The Web" som jeg synes var ganske interessant. SDL står for "Security Development Lifecycle" som er et team der arbejder med af lave værktøjer til og beskrive sikring af applikationer imod angreb. Artiklen omhandler helt basale princippet for hvordan man kan sikre sine applikationer ved hjælp af validering, encoding, permission restriction og Parameterized SPROCS.

So far so good. Ikke meget nyt under solen, men det er altid sundt lige at få genopfrisket de her ting - og til det formål er artiklen ganske velskrevet og med nogen gode eksempler. Det der gjorde artiklen mere interessant for mig er hvor de nævner AntiXssLibrary som man kan bruge til at sikre imod XSS (cross-site scripting) ved at encode sit output. Der nævnes syv forskellige scenarier der kræver at man bruger en forskellig type encoding (HTML, HTML attribute,  URL, Javascript, VBScript, XML og XML attribute) og at Microsoft Application Consulting and Engineering teamet derfor har lavet det her library. AntiXssLibrary består af en hovedklasse der hedder AntiXss, som indeholder en stribe statiske metoder til at håndtere de her forskellige typer encoding let og smertefrit. Min personlige erfaring er at det er de færreste udviklere der er gode til at huske at encode deres output - selvom jeg kender nogen der gør det indimellem er det sjældent helt konsekvent. Netop af den årsag synes jeg det her library er interessant fordi det gør encoding så let at der ikke er nogen undskyldning for ikke at bruge det.

DateTime.Utc

For nylig fik jeg til opgave at skrive en applikation der skal bruges fra Danmark, Hong Kong og Kina og som skal kunne vise dato og tid korrekt. Det lød jo ikke som nogen større udfordring, for hvor svært kunne det være at korrigere for nogen tidszoner med plus minus nogen timer. Det viste sig imidlertid at det faktisk ikke er så nemt endda, hvis applikationen skulle laves så der også kunne komme andre lande til. I virkeligheden er det åbenbart ikke kun hele timer der kan være i forskel, og der er stor forskel på om lande bruger sommer/vintertid og i givet fald hvornår de skelner imellem de to. Jeg gav mig til at google lidt og fandt ud af at der faktisk ikke havde været noget til at hjælpe med den slags i .NET 2.0. Heldigvis til min store glæde fandt jeg ud af at der er dukket en ny klasse op i .NET 3.5 som er en af de små tilføjelser man ikke har hørt så meget om da det meste af snakken har omhandler større ting som eksmepelvis LINQ. Klassen hedder TimeZoneInfo, og den indeholder både metoder til at trække information ud om de forskellige tidszoner, men den indeholder også en metode til at konvertere fra UTC til lokaltid. Det eneste man skal gøre er at gemme ens datoer ved hjælp af DateTime.UtcNow eller i Sql via GetUtcDate(), og så sætte Kind på DateTime objektet til UTC når man hiver det ud af eksmepelvis en database hvor kind informationerne går tabt. Ellers håndterer metoden ConvertTimeBySystemTimeZoneId konverteringen for en, så hvad er i kort tid lignede en "tip of the iceberg" opgave hvor det ser nemt ud men der stikker mere under, blev i virkeligheden pludselig meget overskuelig at have med at gøre. Tak skal du have .NET 3.5 :)

Gazelle igen!

Efter et spændende år hvor der er sket rigtigt meget i butikken, både i kraft af omstrukturering, nye metodikker og større kunder der afføder mere komplekse løsninger end tidligere er det lykkedes os igen at blive Gazelle virksomhed. Det er en titel man næppe nogensinde bliver træt af, da det viser at man er der hvor det sker.

Bøger

CLR via C# og Framework design guidelines blev jeg nærmest provokeret til at læse da John Robbins skrev i sin bog "Debugging Microsoft .NET 2.0 Applications" at de to bøger var must read hvis man ville kalde sig selv .NET udvikler. Selvom det selvfølgelig er en provokation vil jeg gerne støtte op om den, da det er nogen bøger der giver noget essentiel viden henholdsvis om hvordan CLR'en er skruet sammen og om "best practices".

Jeg ender tit med at diskutere vigtigheden af best practices med folk, men en vigtig parameter i at skrive god kode (læs: “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” -Martin Fowler) er nu engang konformitet så man undgår misforståelser. Og hvem ved mere om best practices i frameworket end de folk der har udviklet det?

De næste bøger jeg selv har planer om at kaste mig over bliver "Introducing Microsoft Silverlight 2.0, 2nd Edition", "Professional ASP.NET 3.5: In C# and VB" og "LINQ in Action" som jeg netop har bestilt hjem. Især Silverlight bliver interessant for alvor at komme igang med, hvor de andre bøger mere er nogen jeg håber kan give lidt supplerende viden om .NET 3.5 og LINQ - hvorefter deres hovedformål bliver at fungere som opslagsværker.

Tags: , ,

Blogroll - et let ferie indslag

by DotNetNerd 22. August 2008 12:58

Ferie med SP1 

Så blev det endelig tid til at holde ferie, hvor jeg har været pænt heldig med timingen, da det passede med udgivelsen af .NET 3.5 SP1 - og det er jo altid godt med lidt legetøj til ferien. Jeg vil dog ikke skrive så meget om SP1 da der allerede bliver blogget på livet løs rundt omkring. Istedet synes jeg det er på tide at jeg laver et af de famøse link indlæg som alle andre bloggere også smider på fra tid til anden.

Blogs of interest

Scott Gu: http://weblogs.asp.net/scottgu/default.aspx trivielt at nævne ham, men det er bare en af de vigtigste blogs at følge som .NET udvikler.

Scott Hanselman: http://www.hanselman.com/blog/ næsten lige så trivielt, men dog mere en "fun to follow" blog end en egentlig nødvendighed.

Inside F#: http://lorgonblog.spaces.live.com/ skrives af en udvikler på F# teamet, der fortæller om både udvikling med F# men også om F# projekt systemet til Visual studio.

Code thinked: http://www.codethinked.com/ omhandler blandt andet IronRuby, som der er en serie omkring der har været rigtig interessant som Ruby n00b.

John Lam: http://www.iunknown.com/ Microsoft udvikler der arbejder med IronRuby, som skriver om integration med forskellige systemer og frameworks.

Rick Strahl: http://www.west-wind.com/weblog/ webudvikling på .NET platformen, især med fokus på klienten og dermed Ajax og JavaScript.

Save the developers: http://www.savethedevelopers.org/ slå et slag for at aflive outdatede browsere.

Video spas - som sagt er det jo ferietid :)

Not giving a fuck: http://www.youtube.com/watch?v=6wS5xOZ7Rq8

Font conference: http://www.youtube.com/watch?v=i3k5oY9AHHM

99 words for boobs: http://www.youtube.com/watch?v=DLD31GPt46w

Tags:

JavaScript - fra skældsord til spændende mulighed

by DotNetNerd 26. June 2008 08:52

Ligesom for rigtigt mange andre udviklere har javascript altid været et skældsord for mig. Opgaver der på overfladen virker simple er altid overraskende besværlige fordi browserne opfører sig forskelligt, udviklingsmiljøerne har ikke haft god tool-support og det at manipulere DOM’en på en webside har altid krævet urimeligt meget kode.

Der er heldigvis sket en masse på den front det sidste stykke tid, hvor jeg tidligere har kigget på intellisence og debugging af javascript i VS2008 samt Microsofts ASP.NET Ajax framework. Nu jeg har ferie har jeg som opfølgning på dette givet mig til at lege lidt med nogle af de andre frameworks der findes, da det så småt er ved at være en lille jungle at finde rundt i. Heldigvis har det vist sig at være en jungle med mange forskellige blomster, og overraskende lidt ensartet vegetation – eller på almindelig dansk, de frameworks der er har en masse at tilbyde uden at der er en masse overlap i funktionalitet.

Jeg vil starte med lige kort at skrive lidt om javscript som sprog, da jeg har på fornemmelsen at der er mange der ligesom mig i lang tid aldrig rigtig fik taget mig tid til at finde ud af nogle af de grundlæggende ting omkring objekter og funktioner i javascript.

Lidt JavaScript basics, som du måske alligvel ikke ved

Ligesom mange andre har jeg i min karriere primært brugt javascript til simple ting, som validering og at vise alerts, popup vinduer osv. Jeg måtte derfor for lidt tid siden erkende at jeg egentlig vidste for lidt om hvordan sproget virkelig fungere, da min indlæring havde været meget drevet af tilfældighed ud fra hvad jeg lige havde haft af små problemer der skulle løses. Jeg brugte derfor lidt tid på at blive klogere og vil lige starte helt kort med nogle af de vigtigste ting jeg lærte dengang.
Som udvikler der er uddannet og hovedsageligt har arbejdet i et OO miljø, er javascript en underlig størrelse, da begreberne object og function forstås en del anderledes i javascript end i Java, C#, VB osv.

I OO sprog er en property på et object fast defineret i en klasse, og som kan tilgås via dot notation. I javascript er properties noget der tilknyttes dynamisk, og disse kan tilgås både via dot notation og via indexer syntaks. Det vil sige at i nedenstående kode vil de to nederste linier gøre præcis det samme. Den sidste måde at tilgå properties på dog giver mulighed for at bruge tegn der ellers er ugyldige i propertynavne som eksempelvis punktum og mellemrum.

var hund = new Object();
hund.Navn = "King";
hund['Navn'] = "King";

Det kan på overfladen virke smart at properties på den måde er dynamiske, men ”there is no such thing as a free lunch”. Problemet er selvfølgelig at en subtil stavefejl eller bare casingfejl vil bevirke at man tilknytter en ny property, og man derved ikke får sat værdien på den property man troede. Det er her prototyping kommer ind, da det giver os mulighed for at definere noget der minder om classes og properties samtidig med det giver mulighed for at bruge namespaces til at strukturere klasserne. Jeg vil dog vælge at springe let hen over det i denne omgang, da det er en større omgang at gå i dybden med og ikke hovedfokus for det jeg vil skrive om i det her indlæg.

Funktioner i javascript er som nævnt også meget anderledes i javscript, da funktioner er ”first class” koncepter. Det vil sige at disse opfattes som objekter og kan passes som argumenter til metoder og bruges som værdier på properties. Derfor vil de to nedenstående kodelinier betyde præcis det samme, da funktionen blot er et ”objekt” med et navn.

myFunc = function() {}
function myFunc {}

En anden vigtig forskel er brugen af this keywordet, der forstås anderledes end i andre sprog. I OO sprogene er this en reference en objektet hvorpå den kaldte metode findes, hvorimod det i javascript er en reference til det objekt der kalder funktionen. Man kan dog i javascript selv angive hvad this skal betyde ved at kalde en funktion igennem dennes .call eller .apply metode og passe en reference som første argument til det objekt man ønsker skal være this i den aktuelle kontekst.

var myCaller = new Object();
myFunc.call(myCaller);

JSON eller JavaScript Object Notation, er en anden måde at skabe objekter på i javascript, som er ved at vinde frem, da den kan være rarere at arbejde med i javascript, samtidig med det er et oplagt format til at serializere objekter i når de skal sendes imellem klienten og serveren og konverteres imellem javscript og dit OO language of choice. Jeg har skrevet om dette før men kort fortalt fungerer det ved at tuborg-klammer definerer et objekt, hårde klammer et array, kolon adskiller property navn og værdi, og elementer adskilles af komma.

var hunde = [
{Navn: ’King’, Fødselsdato:  new Date(2004,8,12)},
{Navn: ’Pluto’, Fødselsdato:  new Date(2006,6,10)}
 ];

JQuery – bliv gode venner med din DOM

Oprindeligt troede jeg egentlig bare at JQuery var en open source udgave af det scripting library der følger med til ASP.NET Ajax – en sammenligning jeg også har læst andre fremføre. Den sidste måned havde jeg imidlertid hørt nogle gode ting om det, så jeg ville lige kigge lidt nærmere på det. Efter at have læst og leget lidt med det, må jeg konkludere at det er meget lidt det har til fælles med ASP.NET Ajax, da det er nogle grundlæggende forskellige ting de to librarys søger at løse. ASP.NET Ajax er lavet med fokus på at give mulighed for at arbejde med et typesystem der minder mere om det der er i .NET, samtidig med at det understøtter udviklingen af Ajax Controls og Ajax Control Extenders. JQuery derimod har hovedfokus imod at det at arbejde med DOM’en på en html side, sådan at man på en præcis måde kan finde og modificere Dom elementer. Rigtigt nok er der overlap imellem ASP.NET Ajax og JQuery, da begge eksempelvis indeholder wrappere til at lave kald til webservices – men hovedfokus i de to er helt forskelligt.

JQuerys udgangspunkt er som navnet antyder at det giver mulighed for at ”query” elementer på en webside. Dette gøres meget naturligt igennem selectors ligesom man kender dem fra CSS. JQuery giver mulighed for at anvende et bredt udsnit af disse – og herunder flere end dem der reelt er standard i CSS i alle browsere i dag. Et helt basalt eksempel kunne være:

$(document).ready(function() {
$("div:odd").html("Woot"); 
});

Eksemplet viser et par forskellige ting som JQuery gør muligt. Den første linie kode viser brugen af et event som JQuery stiller til rådighed der bliver affyret når sidens elementer er hentet, men inden eksterne elementer som f.eks. billeder er læst helt ind. Det løser et problem man tit render på som er at hvis man skriver javscript i starten af en side, så kan man risikere at denne køres inden alle elementerne endnu er loaded, og omvendt hvis man bruger onload eventet ender man med at vente til alt er læst helt ind hvilket heller ikke altid er ønskværdigt. Den næste linie viser brugen af en selector der henter hvert andet (ulige) div element på siden, og sætter deres indhold til ”Woot”. Dette illustrerer hvor powerfull JQuery er, da man faktisk kan manipulere flere elementer i det der kaldes et wrapped set med meget lidt kode.

Udover at kunne manipulere eksisterende elementer vil man selvfølgelig også ofte gerne kunne tilføje nye elementer. Også her er det JQuery to the rescue, da det gør det meget enkelt.

$("<div>Totalt dynamisk indsat tekst der!<div/>").appendTo("#someParentDiv");

Her ses en af de andre mådet at bruge $ funktionen på, da den her fodres med noget html, som så udgør ens wrapped set. Derefter kaldes appendTo med en selector der finder de eksisterende elementer som der skal føjes til.
JQuery tilbyder en bred vifte af metoder til at arbejde med disse wrapped sets, manipulere elementer, properties, attributter osv. Fælles for dem alle er at de virker crossbrowser, hvilket er en af hovedpointerne i JQuery – nemlig at gøre det nemt og ensartet at skrive sine scripts. Udover almindelig element manipulation skal det nævnes at JQuery tilbyder funktioner til at lave animationer og effekter, wrapper funktioner til at foretage Ajax kald og det er bygget til at kunne extendes med plugins, som der allerede findes flere af.

En vigtig ting hvis JQuery skal bruges i samspil med andre javascript librarys er funktionen $ som også bruges af andre librarys. For at undgå denne konflikt kan man disable brugen af $ og i stedet tilgå funktionen direkte som ”jQuery”, hvilket $ i virkeligheden blot er en genvej til. For at disable $ skal man blot kalde jQuery.noConflict();

Har du fået lyst til at læse mere om JQuery kan jeg anbefale bogen JQuery in Action, som har været min primære inspirationskilde.

LINQ to JavaScript – endnu et skridt imod begrænsningen af for-loops

Navnet siger jo egentlig det hele, da de fleste efterhånden har hørt om og sikkert også leget lidt med LINQ. LINQ to JavaScript er helt enkelt et codeplex projekt, som implementere det der svarer til LINQ to objects i JavaScript. Fordelene ved LINQ er der allerede skrevet alt for meget om rundt omkring, så jeg vil gå lige på og fortælle lidt mere konkret om JavaScript implementationen.
Indtil videre er følgende operatorer implementeret, men der er med garanti flere på vej:

From, Where, Select, OrderBy, OrderByDescending, Count, Distinct, Any, All, Many, Reverse, First, Last, ElementAt, InterSect, DefaultIfEmpty, ElementAtOrDefault, FirstOrDefault og LastOrDefault.

Et eksempel på at bruge de mest gængse kunne være.

var myArray =  [
{Name:"Hans", Age:20 },
{Name:"Erik", Age:10 },
{Name:"Christian", Age:26 }
];

var myResult =
    From(myArray).
    Where(function(item){return item.Age > 15}).
    OrderBy("item.Name").Select(function(item){return item});

Som eksemplet viser kan operatorerne generelt tage to slags argumenter til at beskrive hvilken property der arbejdes på, idet man enten kan bruge en streng (eksempelvis ”item.Name”) eller en funktion der tager item som argument.
Jeg synes personligt at de er sluppet meget godt af sted med det der er implementeret i LINQ to JavaScript, og jeg er sikker på jeg selv nok skal komme til at bruge det en del fremover.
Ellers er der ikke mere jeg har tilbage at skrive om javascript og javascript frameworks for denne gang, men jeg håber det giver andre blod på tanden. Det i hvert fald har givet mig lyst til at arbejde mere med javascript efter at jeg har set hvad nogle af de her frameworks giver af muligheder.

Presseomtale og usergroup i Odense

by DotNetNerd 30. May 2008 16:39

Presseomtale 

Så nåede vi til den tid på året hvor der blev offentliggjort årsresultat, og pressen var ikke lang tid om at skrive om hvor godt det er gået det seneste år - som det kan ses på TV2fyn, Bureaubiz og fyens.dk.

Update: også børsen, erhvervsbladet og computerworld har nu bragt artikler om årets resultat :-) 


Det har også været et spændende og hektisk første år - men det er også sådan jeg helst vil have det :) Det ser heldigvis ud til der fortsat er masser af spændende opgaver og udfordringer fremover, så vi kan vidst godt tillade os a være lidt glade.

"Its a nerd!" Onug blev født!

Torsdag var jeg på hotel Radisson Sas til Microsoft Community arrangement hvor hovedformålet var at få startet en .NET usergroup i Odense. Opbakningen til initiativet var fantastisk, og især det at der var en flok fra Anug der var kommet forbi for at hjælpe os igang var helt fantastisk. Idag (fredag) fik jeg så luftet det for min chef, og nu ser det ud til at vi bliver sponsorer for gruppen, og han var bestemt positiv over for muligheden for at vi kan benytte vores lokaler. Det er jo altid fedt at møde nogle ligesindede ildsjæle, så jeg glæder mig meget til at se hvordan det skrider frem.

 

Tags:

MIX Essentials

by DotNetNerd 22. May 2008 20:49

Arrangementet 

Onsdag inden jeg fik set Manchester United blive kronet som europas konger, var jeg til MIX Essentials i Cinemaxx i København. Vi tog afsted 4 mand høj, eller to mandlige udviklere og to kvindlige grafikere for at være helt præcis, for at lære lidt mere om Silverlight, og søge inspiration til hvordan vi kan benytte det i vores virksomhed. Uden at jeg gik derfra med hænderne over hovedet, synes jeg det var et udemærket arrangement. Niveauet var måske lidt lavere end forventet og der var knap så mange rigtige eksempler som vi kunne have ønsket os, men vi fik da set nogle bud på hvad Silverlight kan bruges til. Mere vigtigt for mig ihvertfald var at vi fik nogle links og navnene på nogle tools sådan at jeg har noget mere at gå videre med.

Links til inspiration

En af de ting jeg ikke selv havde hørt så meget til var deepzoom og dertil værktøjet deepzoom composer, der er i beta og kan hentes direkte hos Microsoft. Deepzoom giver som navnet antydet mulighed for at man kan lave virkelig store billeder i virkelig høj kvalitet, som downloades delvist til klienten sådan at der kun sendes de detaljer der er nødvendige i forhold til det gældende zoom niveau. Et fedt eksempel på dette og hvad det kan bruges til kan ses på hardrockcafe.com under memorabelia.

Af tools der blev fremvist synes jeg især KAXAML ser lækkert ud. Det er et lille letvægts værktøj til at arbejde med XAML i et splitview. Helt sikkert et tool jeg selv skal lege lidt med fremover :) Et andet tool der så spændende ud er Silverlight Spy der er til at udforske hvordan Silverlight applikationer er skrevet. Og som med alle andre teknologier er der naturligvis også en WPF Profiler, som nok skal vise sig uundværlig på et tidspunkt, som den slags tools ofte viser sig at gøre.

Sidst i den mere futuristiske afdeling så og hørte vi lidt mere til surface som mange umiddelbart forbinder med "a big ass table". Naturligvis er perspektivet i teknologien meget mere og andet end den prototype som det her bord er - men som så tit før ser den almindelige forbruger ikke længere end på det der er lige foran dem. Jeg tror imidlertid nok teknologien skal vinde frem, og håber da også selv en dag at komme til at lave en surface baseret løsning.

Tags: ,

Test driven development – my two cents.

by DotNetNerd 11. May 2008 13:07

Test driven development – my two cents.

Unit testing er en metode til at teste at en individuel enhed kildekode fungerer korrekt.  Egentlig har unit testing været brugt i flere årtier, men begrebet har den seneste tid udviklet sig til lige at være et buzzword der er oppe i tiden – især som metodik i form af Test Driven Development. TDD bliver der blogget enormt meget om for tiden – og netop derfor vil jeg ikke kaste mig ud i at forklare hvad det er, men lader det være en forudsætning for at læse videre.

Udbredelsen af TDD/unit testing er en stor del af grundlaget for at Microsoft har kastet sig over at lave MVC frameworket, som et alternativ til den klassiske måde at udvikle ASP.NET applikationer på.

Rob Conery der står bag SubSonic, og nu er ansat hos Microsoft er for tiden i gang med en serie på sin blog som han kalder MVC storefront, hvor han går efter at blive klogere på både MVC og TDD. En sjov detalje han har bemærket er at alle i miljøet snakker om ”at hvis man nu er purist skulle man gøre sådan og sådan”, men han har umiddelbart ikke kunne finde nogen der direkte er purister inden for TDD.

Personligt kan jeg godt se anvendeligheden i TDD, men jeg mener helt klart at der er alt for meget hype om det, og at det bestemt ikke er alting det er velegnet til. Min holdning skyldes helt enkelt to ting; for det første at man ofte ikke har en god nok beskrivelse af hvad man skal udvikle til at man kan skrive en rigtigt god unit test, og for det andet at det ikke altid er noget godt kvalitetsmål. Med det mener jeg at det ikke er alting man kan teste ved hjælp af unit tests, både fordi eksempelvis usability slet ikke er noget mål for en unit test, men også fordi omkostningerne ved at skrive og vedligeholde tests kan være større end gevinsten. Dette er i nogen grad en pointe ”Joel on software” også har fremført, blandt andet ved en tale på Yale.

Jeg laver selv en del applikationer, hvor beskrivelserne er sparsomme, og udviklingen derfor ikke kan undgå at blive ”trial and error” baseret. Ikke forstået som i at der er masser af ”fejl” som sådan i koden (selvfølgelig er der også det), men fordi kundens ønsker ændrer sig markant i løbet af processen. Teoretikeren vil nok sige at så er analysen af projektet ikke god nok, en pointe der ikke går helt tabt på mig, men der er mange kunder hvor det simpelthen ikke er muligt i praksis. Let the religious battle between theory and pragma begin!

Min anden pointe med at det ikke er alting der lader sig unit teste, er selvfølgelig også et spørgsmål om vilje. Brugerflader og sprocs er vanskelige at teste, og selvom man gør sig en masse anstrengelser for at lave unit tests af disse ting er værdien mindre - i forhold til at kunne teste ”rene funktioner”, med kendt input og output. En sidste observation jeg har gjort mig, er at fejl oftere skyldes integrationsproblemer end direkte logiske fejl – og i systemer hvor det er tilfældet er integrationstests i virkeligheden mere formålstjenlige.

Selvom jeg måske nu lyder meget skeptisk, synes jeg at unit tests og TDD er rigtigt godt, til de ting det rent faktisk er opfundet til. Min indsigelse er blot imod den megen hype der er, da heller ikke det er nogen Silver bullet, og jeg føler at anvendeligheden af unit tests har det med at blive overdrevet.

Frameworks og tools – de små måske vigtige forskelle.

De fleste jeg har snakket med der har arbejdet med unit testing kender NUnit frameworket, som nok er det mest udbredte framework til unit testing i .NET. Frameworket er oprindelig portet fra JUnit og har efterhånden en del år på bagen.

Der findes imidlertid også to andre udbredte open source  alternativer som er MbUnit og XUnit – forskellene imellem de tre frameworks er relativt små, men som man siger ”god is in the details”.

MbUnit omtales som NUnit på crack, og er et framework der er udviklet til at være mere udvidelsesvenligt end NUnit er. Det er i dag nok det mest advancerede unit testing framework og giver blandt andet mulighed for at man via attributter beskriver data der skal passes til en testmetode, og derved kan den samme metode kaldes flere gange hvor forskellige grænseværdier testes.

[RowTest]
[Row("Christian", "123")]
[Row("Christian", "", ExpectedException = typeof(InvalidUserException))]
[Row("", "123", ExpectedException = typeof(InvalidUserException))]
[Row("Christian", "qwerty", ExpectedException = typeof(InvalidUserException))] 
public void CheckUserLogins(string name, string password)

Det har desuden også en feature til at rulle database ændringer tilbage ved hjælp af attributterne SqlRestoreInfoAttribute, RollBack og RestoreDatabaseFirst.

XUnit findes på codeplex, og det er udviklet med henblik på at skulle passe bedre ind i .NET miljøet, samtidig med der er ryddet op i attributter og assertions med henblik på at få pænere testkode. Jeg kan personligt virkelig godt lide at det gør brug af generics, og at det giver mulighed for at lave en slags aspect oriented programming.

Generics bruges blandt andet til fixture setup, sådan at man ved at bruge IUseFixture<T> kan passe klasser til ens testmetoder, som man så kan arbejde med.

public class MyTests : IUseFixture<MyFixture>, IDisposable
{    
    public void SetFixture(MyFixture data)    
    {                
        data.SomeMethod();    
    }
}

Aspect oriented programming fungerer ved at man laver ens egne attributter ved f.eks. at extende BeforeAfterTestAttribute, som blot er at overskrive et par metoder.

public class PrepreDatabaseAttribute : BeforeAfterTestAttribute
{    
    public override void Before(MethodInfo methodUnderTest)    
    {        
        // Do your pre-test stuff    
    }    
    public override void After(MethodInfo methodUnderTest)    
    {        
        // Do your post-test stuff    
    }
}

Udover et decideret testframework skal man også bruge et tool til at udføre ens tests og give overblik over hvad der går godt og hvad der fejler – de berømte grønne lamper man nyder at se lyse når man benytter TDD. NUnit har den fordel at der følger et lille separat tool med der kan lige præcis det, og som virker ganske fint til de flestes behov. Til XUnit er der et lignende tool under udvikling, men det er stadig eksperimentalt og virker ikke just som et færdigt tool endnu.

Alle 3 frameworks kan imidlertid også bruges sammen med TestDriven.NET og ReSharper , som begge er bedre bud hvis man vil have en ordentlig brugsoplevelse.

 TestDriven.NET er et add-in til Visual Studio, som giver mulighed for afvikling af unit tests, og er det tool flertallet bruger. Jeg må dog erkende at jeg synes TestDriven.NET er relativt dyrt, taget i betragtning af at det startede som et gratis værktøj og i bund og grund stadig er et simpelt add-in.

Resharper er også et Visual Studio add-in som man kan skaffe til rundt regnet samme pris som TestDriven.NET, men man får bare meget mere med i pakken, da det blandt andet også tilbyder hjælp til refactoring, formattering og kode analyse. Som det fremgår er jeg selv faldet lidt for ReSharper, selvom jeg var lidt skuffet over at det endnu ikke er klar i en .NET 3.5 udgave, så kodeanalysen fejler hårdt på LINQ queries o.lign. En ny version målrettet .NET 3.5 skulle dog være på trapperne, så jeg må bare leve med at slå kodeanalyse fra indtil da.

Test af sprocs – der hvor det bliver mere vanskeligt.

Når jeg nu tidligere har nævnt at jeg mener sprocs er vanskelige at teste, skylder jeg også at beskrive hvordan man kan gøre det - og uddybe hvad jeg mener med at værdien i mine øjne er mindre end ved test af mere isolerede funktioner.

Jeg læste i går en ganske god artikel i MSDN magazine omkring brugen af LINQ to SQL til test af sprocs. Der var egentlig ikke et perspektiv der i første gang havde slået mig, men det er egentlig klart at LINQ to SQL er godt til at teste sprocs på meget lettere vis end det var muligt i tiden pre-LINQ. Helt enkelt består sproc tests af.

·         Klargøring af database, så den er i en velkendt tilstand.

·         Afvikling af sproc.

·         Test af databasens tilstand er som ønsket.

De tre trin lyder simple nok, man har naturligvis en række komplikationer i forhold til det her med databasens tilstand. Det letteste er sandsynligvis at arbejde med en tom kopi af databasen, som gerne er separat fra ens anden test/udviklings database der typisk indeholder en røvfuld ”real world” data. Ved hjælp af LINQ kan man så faktisk med meget få linjer kode slette alle data i en tabel, og indsætte de data man ønsker som grundlag for testen.

Ligeledes kan man i LINQ afvikle den sproc der skal testes, og så er der egentlig ”bare” tilbage at teste databasens tilstand efterfølgende. Et godt tip fra artiklen er at hente alt data i en tabel, hashe det ved hjælp af eksempelvis en MD5 hash. Resultatet kan så meget enkelt sammenlignes med en hash som man udregner ved udformning af testen – noget der kan være en kende besværligt, da det at tage hashen første gang man afvikler koden kun beviser at resultatet er det samme ved efterfølgende afvikling og ikke nødvendigvis om det er korrekt.

Få overblik med Unit testing af sprocs

En anden måde at bruge unit tests på i forbindelse med sprocs, som jeg selv har været med til at implementere er at skrive en parser der undersøger hvilke sprocs man kalder fra sin kode og sammenligne med de sprocs der rent faktisk findes i databasen. Selvom det ikke er nogen test af funktionaliteten som sådan, kan det på store projekter bruges til at teste om de sprocs man kalder findes og omvendt om man har sprocs der ikke længere bliver brugt.

Lidt i samme boldgade kan man skrive en unit test der læser ens sprocs ud, og gemmer dem i databasen igen - giver dette en exception er det en god indikation af at sproc’en er knækket. Igen er det ikke nogen gylden løsning da man ikke finder logiske fejl og ikke engang alle slags fejl på den måde. Det er imidlertid et simpelt værktøj, som har sin berettigelse i at det kan give overblik og finde alvorlige problemer med meget simple midler.

Tags: ,

Who am I?

My name is Christian Holm Diget, and I work as an independent consultant, in Denmark, where I write code, give advice on architecture and help with training. On the side I get to do a bit of speaking and help with miscellaneous community events.

Some of my primary focus areas are code quality, programming languages and using new technologies to provide value.

Microsoft Certified Professional Developer

Microsoft Most Valuable Professional

Month List

bedava tv izle