PerSalmi.NET

Swedish .Net software developer...
# Saturday den 20 February 2010

Kodkontrakt är en ny teknik som kommer i samband med Visual Studio 2010. Vad är då detta med konkontrakt? Lite förenklat kan man väl säga att det är ett sätt att kunna skriva kod som kontrollerar att inkommande och utgående parametrar och resultat är rimliga och håller sig inom förväntade gränser. Kan alltså vara riktigt bra för att se till att den som använder dina klassbibliotek inte skickar in dåliga parametervärden och ställler till det för sig.

Kodkontrakt har varit i fokus och diskuterats i min närhet vid flera tillfällen de senaste månaderna, dels vid ett frukostseminarie  i december och senare när jag själv presenterade nyheter kring .NET 4 på en konferens i Sälen för några veckor sedan. Först var vi lite besvikna eftersom det verkade som kodkontrakten inte skulle fungera ihop med Visual Studio 2010, de fanns inte med i installationen. Vi hörde rykten om att teamet på Microsoft Research inte hade levererat till Visual Studios byggteam, så kontrakten kom att saknas i betaversion 2.

imageEn del extra efterforskningar efter frukostseminariet visade dock att kontraktstödet faktiskt finns och fungerar, det kräver bara en liten extra nerladding och en separat installation. Både vi som lyssnade och killen som höll frukostföredraget var alltså besvikna i onödan. Det visade sig dessutom fungera bra med Visual Studio 2010 Beta 2 samt nu med den nya RC-versionen.

Det man behöver är antingen Code Contracts Standard eller Premium som finns att ladda ner från Code Contracts på Microsoft DevLabs. Teamet bakom kodkontrakten har mer material i form av publicerade forskningsrapporter och användarhandledning i PDF-form på sin sajt hos Microsoft Research, läs dem här: Contracts - Microsoft Research. Om man vill delta i diskussioner eller ställa frågor finns även ett forum specifikt om kodkontrakt på: Code Contracts MSDN Forum

Ok, det var lite allmän info. Hur kommer man då igång att använda kontrakt i sin dagliga kodning?

Efter att man installerat kontraktstödet så får man en ny panel i projektegenskaperna, Code Contracts:

image

Ovan ser man att jag aktiverat både runtime-kontroller och statiska kontroller som körs vid kompilering. På min labbmaskin har jag installerat premiumvarianten av kontraktstödet, därav har jag både runtime och statisk kontroll. Det är alltså denna projektinställning som behövs för att kontrakt som skrivits in i koden ska vara aktiva och kontrolleras antingen vid körning eller kompilering.

För att visa hur kontrakt för före- och eftervillkor fungerar har jag en mycket enkel metod i mitt C# projekt:

public int PositiveAdd(int a, int b) 
{
    Contract.Requires(a >= 0);
    Contract.Requires(b >= 0);
    Contract.Requires((a + b) > 0);
    Contract.Ensures(Contract.Result<int>() == (a + b));
    return (a + b);
}

Villkoren ovan är avsedda att kontrollera att båda inparametrarna är större än noll och att de tillsammans också ska vara större än noll. Kontrollen av slutresultatet verifierar att returvärdet är ett heltal som är summan av inparametrarna. Detta är ju som ni ser extremt förenklat bara för att visa just själva kontrakten. Requires-raderna ger alltså de “före”-villkor vi vill ha medan Ensures ger oss “efter”-kontroller.

Om man kör kod som utrustats med kontrakt för före- och eftervillkor i sin debugger kan man tydligt se att Contract.Requires(…) och Contract.Ensures(…) inte är kodrader som exekveras som vanligt. I denna sekvens av bilder från en debugger session visar det sig hur kontrakten kontrolleras vid exekvering av metoden.

Vi börjar med att först köra alla sk pre-conditions för att kontrollera utgångsläget när metodens kod påbörjas:

CropperCapture[4]

CropperCapture[5]

CropperCapture[6]

Nästa steg är mer överraskande, det är här man verkligen ser att Contract raderna inte är en vanlig del av metoden, debuggern visar nu att metodens kod kommer att exekvera från början av metodens kodblock:

CropperCapture[7]

Här fortsätter sedan körningen med att utföra det verkliga jobbet i vår metod:

CropperCapture[8]

Den funktionella delen av metoden är nu klar, i normala fall är vi nu färdiga att returnera resultatet till den anropande kodsekvensen:

CropperCapture[9]

Men eftersom kontrakten är aktiverade så är det istället dags att gå igenom och verifiera alla “efter”-villkor:

CropperCapture[10]

Som sammanfattning är alltså Contract-raderna inte en del av metoden som körs procedurellt!

Detta var kontroller för enkla före- och eftervillkor, kontraktstödet innehåller fler varianter av kontroller, men de får vi ta upp en annan gång.

Saturday, February 20, 2010 12:14:08 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | Visual Studio
# Thursday den 16 April 2009

imageHar du lättare att lära dig med hjälp av bilder? Daniel Solis har skrivit en bok som lär ut grunderna i C# på ett lite annorlunda sätt än de vanligaste böckerna om programspråk. Hans bok heter Illustrated C# 2008 och går igenom kärnan i C#, fokus ligger på att förklara koncept som typer, minne, variabler, klasser och språkkonstruktioner i objektorienterad programmering samt moderna C# delar som t ex extension methods.

Daniel går vidare med kapitel om delegater, event. Boken avslutas med ett kapitel om generics som grundläggerl en introduktion till LINQ och till sist ett kapitel om grunderna i flertrådad/asynkron programmering.

Den som är intresserad kan faktiskt läsa boken gratis, Red Gate har gjort det möjligt att ta del av boken i PDF form helt gratis, ladda ner e-boken från: Red Gate - Illustrated C# 2008

Uppdaterat 2009-12-28: Tyvärr finns inte e-boken tillgänglig längre. Man kan dock hitta bästa pris här.

Thursday, April 16, 2009 12:38:35 PM (W. Europe Daylight Time, UTC+02:00)  #    Comments [0]
C# | Kompetensutveckling | Läsning
# Saturday den 14 March 2009

image Gänget bakom MSDN Managed Newsgroup Support har startat upp ett projekt för att bygga upp en Visual Studio Solution med kodexempel för C#, VB och C++. Nu är det ju inte unikt att det publiceras exempelkod, men att ha en enda källa som tar ett samlat grepp på ett antal grundläggande teknikområden och låter de ingående exempelprojekten samspela och kombineras i alla tänkbara varianter känns fräscht. Det är ofta man hittar exempel som går i en riktning tex interop från C# klient till C++ server medan det man egentligen letar efter är det omvända. Här vrider man och vänder på de flesta kombinationer!

Anledningen att jag fastnade för projektet direkt jag såg det är att vi under ganska lång tid jobbat med ett brownfield (C++) system där olika delar bytts ut och strukturerats om och därmed har nya delar gjorts i managedkod (C#), jag tror knappt det är någon variant av interop som inte varit inblandad i det hela. Hade detta funnits och våra google-master-skills hade låtit oss hitta det förra sommaren så hade det varit perfekt.

I dagsläget finns följande tekniker med i projektet:

  • COM & ActiveX
  • Dataaccess
  • Office-anpassning
  • Klassbibliotek
  • RPC & IPC

Kolla in All-In-One Code Framework på CodePlex. Förhoppningsvis kommer det att växa med massor av exempel, tekniker och kombinationer ganska snart. Förresten, det vore inte dumt att blanda in Windows Mobile i leken också för att öka på antalet möjliga kombinationer i de fall det är teknik som är tillämpbar på telefoner och handenheter.

Saturday, March 14, 2009 12:57:07 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]
.Net | C# | C++ | VB | Visual Studio
Blog & Contact
Per Salmi
Per Salmi
Min LinkedIn Profil

Jag arbetar på Combitech AB i Linköping med konsultuppdrag och utbildning inom Microsoft .NET området. Kontakta mig gärna om ni har frågor, behov av konsulttjänster eller är intresserade av utbildning inom .NET.

Copyright © 2019 Per Salmi

Bloggmotor: newtelligence dasBlog 2.3.12105.0

Sign In
Statistics
Total Posts: 73
This Year: 0
This Month: 0
This Week: 0
Comments: 0

Datorer
All Content Copyright © 2019, Per Salmi