Behöver du byta e-postadress på ditt Windows Live-konto?

clock februari 15, 2010 13:35 by author Daniel Hognert
Det kan du göra via https://accountservices.msn.com/, och samtidigt behålla din befintliga kontaktlista.


SweNug-möte i Göteborg, 25 mars 17:00-21:00

clock februari 27, 2009 19:48 by author Daniel Hognert

Den 25 mars mellan 17:00 och 21:00 körs ett Open Event i samarbete med Swenug i anknytning till SDC2009 under ämnet "Tools and Technologies for .NET Developers". Kvällen kommer att bestå av 2 timmar blixtdragningar (på vardera 10 minuter) och sedan 2 timmar Open Space med förtäring, där deltagarna själva bestämmer vad vi ska prata om.

Läs mer på http://www.scandevconf.se/open-event/all/ eller http://www.swenug.com.



S.O.L.I.D. Design Principles – Separation Of Concerns

clock februari 5, 2009 17:54 by author Magnus Härlin

Separation Of Concerns är den första principen i SOLID och innebär att en klass bara ska göra en enda sak. I mitt exempel har vi en PriceCalculator klass som räknar ut hur mycket det kostar att hyra en film. Förutom att räkna ut priset kollar den vad det är för kundtyp och filmtyp. Switch och if satsen är inte helt otydligt men det går att få klassen betydligt tydligare. Nu har den fler ansvar och skulle man lägga till en kundtyp eller en filmtyp till skulle koden börja likna spagettikod och vara jobbig att underhålla.

 

Ett anrop till klassen ser ut såhär:

 

PriceCalculator priceCalculator = new PriceCalculator();

int price = priceCalculator.CalculatePrice(CustomerType.VIP, MovieType.Normal);

 

När CalculatePrice klassen anropas med VIP kund och Normal film kommer den att skicka tillbaks ett pris på 20 kr för att VIP kunden får 5 kr i rabatt. Här nedanför är koden för att komma fram till det.

 

public enum CustomerType

{

    Normal,

    VIP

}

 

public enum MovieType

{

    Normal,

    Transfer

}

 

public class PriceCalculator

{

    public int CalculatePrice(CustomerType customerType, MovieType movieType)

    {

        switch (customerType)

        {

            case CustomerType.Normal:

                if (movieType == MovieType.Normal)

                {

                    return 25 - 0;

                }

                else if (movieType == MovieType.Transfer)

                {

                    return 35 - 0;

                }

                break;

            case CustomerType.VIP:

                if (movieType == MovieType.Normal)

                {

                    return 25 - 5;

                }

                else if (movieType == MovieType.Transfer)

                {

                    return 35 - 5;

                }

                break;

        }

 

        return 0;

    }

}

 

 

Ett första steg för att få koden mer lättläst är att ta bort CalculatePrice klassens ansvar för att kolla kundtyp, filmtyp och vad det ska vara för rabatt. Vi delar upp det i två klasser. Kundtypen används bara för att ta reda på vad det ska vara för rabatt så vi skapar en kundklass med en property för rabatt. Filmtypen används för att bestämma vad det ska vara för pris på filmen så vi skapar en klass filmklass som har en property för pris. Genom att göra det här så blir det inte så mycket kvar att göra för PriceCalculator mer än att ta priset – rabatten och returnera värdet. Slutresultatet för PriceCalculatorklassen blir alltså:

 

    public class PriceCalculator

    {

        public int CalculatePrice(Customer customer, Movie movie)

        {

          return movie.Price - customer.Rebate;

        }

    }

 

Men hur ska vi göra för att på ett tydligt sätt visa att det finns olika filmtyper som har olika pris? Ett sätt är att skapa en basklass som heter film och har ett fast pris på 25 och sen göra en underklass som ärver den klassen och gör en override på priset.

 

    public class Movie

    {

        public virtual int Price { get { return 25; } }

    }

 

    public class TransferMovie : Movie

    {

        public override int Price { get { return 35; } }

    }

 

På precis samma sätt kan vi göra med kundklassen för att kunna sätta olika rabatt.

 

    public class Customer

    {

        public virtual int Rebate { get { return 0; } }

    }

 

    public class VIPCustomer : Customer

    {

        public override int Rebate { get { return 5; } }

    }

 

För att göra ett anrop för en VIP kund på en normal film nu så skiljer det inte så mycket från tidigare. Man byter ut Enum typerna till klasserna man skapat istället bara.

 

PriceCalculator priceCalculator = new PriceCalculator();

int price = priceCalculator.CalculatePrice(new VIPCustomer(), new Movie());

 

Returvärdet man får kommer att vara 20 kr precis som tidigare.

 

Separation Of Concerns är alltid bra att ha i bakhuvudet när man kodar och börjar få nestlade if satser eller switchsatser. Ibland går det att på ett smidigt sätt bryta isär det man gör och på så sätt få kod som är lättare att underhålla och tydligare att använda.



BOM - Byte-Order Mark i början av xml dokument

clock februari 4, 2009 07:48 by author Magnus Härlin

Byte-Order Mark (BOM) används för att tala om vad det är för UTF encoding på en fil och ligger alltid som dom första teckna i filen. Har man en texfil som är har UTF encoding är det tre tecken längst fram i filen som säger vilken UTF det är. Det här är inga problem så länge man jobbar i windowsmiljö. Öppnar man filen i notepad är dom tre första teckna osynliga men tittar man med en hexeditor eller något annat kan man se dom.

 

Den potentiella risken är om man exporterar filer till andra system som får fel vid inläsning om BOM teckna sitter i början av filen.

 

Här är ett exempel på en xml fil som kommer att sparas ner med BOM i början.

 

            XElement xmlDoc = XElement.Load("xmlDocumentToLoad.xml");

 

            //Make changes to the xml Document

 

            xmlDoc.Save("updatedXmlDocument.xml");

 

För att komma runt det här problemet kan man använda en xmlWriter för att spara istället för Save funktionen. På det här sättet får vi en chans att välja om vi vill skriva ut BOM i början av filen när vi initierar Encoding klassen. Det här fungerar förstås utmärkt om det är så att man behöver använda en annan encoding än UTF också.

 

            XElement xmlDoc = XElement.Load("xmlDocumentToLoad.xml");

 

            //Make changes to the xml Document

 

            XmlWriterSettings writerSettings = new XmlWriterSettings();

            writerSettings.Encoding = new System.Text.UTF8Encoding(false);

            writerSettings.CloseOutput = true;

            writerSettings.Indent = true;

 

            XmlWriter xmlWriter = XmlWriter.Create("updatedXmlDocument.xml", writerSettings);

            xmlDoc.Save(xmlWriter);

            xmlWriter.Flush();

            xmlWriter.Close();

 

 



Cacha mera i din webbsajt

clock januari 24, 2009 16:22 by author Daniel Hognert

Det kan vara många där ute som sitter med icke-optimerade webbsajter som gång på gång ställer samma fråga till databasen, trots att det egentligen inte skulle behövas. Genom att exempelvis använda System.Web.Caching.Cache kan man slippa många anrop till databasen, om det är så att data inte ändras väldigt ofta.

Exempelkod i VB.NET:

Public Function GetCachedDataView() As DataView
   Dim _dv As DataView = CType(Cache("myDataViewObject"), DataView)
   If _dv Is Nothing Then
      _dv = [...] 'Collect your dataview as usual here
      Cache.Insert("myDataViewObject", _dv, Nothing, Date.Today.AddDay(1), TimeSpan.Zero)
   End If
   Return _dv
End Function

Public Sub InvalidateCache()
  
Cache.Remove("myDataViewObject")
End Sub


PDC 2008 - Los Angeles

clock november 11, 2008 22:32 by author Janne Hasslöf

Microsoft är proffs på stora evenemang.
Det märks redan vid hotellet med veckoagendan på ett stort uppslag i lobbyn och tidtabeller för bussar till pdc och evenemang. Det är bara att gå ut på trottoaren på morgonen så kommer en funktionär och tar hand om en och visar till bussen.
Efter en kort stund sitter jag på andra raden i den stora key-note-salen.  Rockmusiken dunkar. Rökmaskinerna jobbar och alla är spända. Snart....snart börjar det.....Nu tar kameramannen på sig lurarna. Det är mycket tv-kameror här och säkert plats för 100 journalister....spännande. Visst låter man lite som ett barn på julafton, men så är det :-)

Det första Microsoft lanserade på PDC var Windows Azure, Microsofts nya plattform för att drifta och koppla samman tänster på nätet, eller i molnet som man säger numera.
Windows Azure tillhandahåller idag 4 tjänster som utveklare och driftavdelningar kan använda sig av:

Service Bus
En klassisk buss som knyter ihop tjänster i molnet enligt samma principer som en vanliga företagsbuss knyter ihop tjänstebaserade applikationer på ett intranät.  

SQL Data Services
Enklare databastänst som håller en applikations data tillgängligt i molnet.  Kommer sannorlikt att bygas ut till en kraftfulare version i kommande releaser.

Workflow Service
Här kan man utvekla och drifta sina flöden av aktiviterer som skall ske när applikationer postar meddelanden på service-bussen .

Access Control Service
Denna tjänst styr behörigheten i de övriga tänsterna och har möjlighet att hämta behörighetsinformation från en mängd olika identites och behörighetssystem. Så som Microsoft LiveID, ett företags Active Directory, etc.  

För att lära dig mer om Windows Azure, gå in på http://www.microsoft.com/azure/default.mspx. Här kan man även anmäla sig till att vara med i ett utvecklarprogram. Jag kommer att återkomma till Azure i kommande inlägg när jag gett mig på att testa lite mer. 

Andra ämnen som jag tycker var speciellt intressanta och som jag kommer att återkomma till är 

Dublin
Den nya runtime-miljön för WCF och WF som är en utbyggnad av WAS som finns i dag.  Prestanda, enklare konfiguration och möjlighet till övervakning har varit fokus i denna version som Dan Eshner beskriver med orden "It just works!" 
Kolla Dublin här: http://channel9.msdn.com/pdc2008/BB18/

B2B
Kolla in hur man kan utnyttja Azure till att bygga en ny typ av Business-To-Business applikationer
http://channel9.msdn.com/pdc2008/BB59/

REST
Mycket av kommunikationen i Azure och andra ställen i molnet kommer att baseras på  REST-protokollet framöver. Här visas det hur man bygger WCF-tjänster som utnyttjar REST.
http://channel9.msdn.com/pdc2008/TL35/

Skalbarhet
Många siter växer ur sin kostym och designen kan inte längre leverera de responstider som förväntas. Här är en dragning om hur Microsoft ser på skalbarhet i framtiden och vilka principer som man kan sikta in sig på i framtiden.
http://channel9.msdn.com/pdc2008/BB54/

VS2010
Det händer massor i VS2010 tillsammans med TFS och det är riktigt kul att se alla nya features som man ju helst vill ha redan nu! Vill du tex. lära dig att analysera hur man skall angripa en befintlig applikation som akritekt så kolla på:
http://channel9.msdn.com/pdc2008/TL15/
Om du vill se hur man kan använda nya VSTS för att höja kvaliten på kod och applikationer så kolla på:
http://channel9.msdn.com/pdc2008/TL03/

Vill du själv botanisera i föreläsningar på PDC så bandades nästa alla och ligger uppe på
http://sessions.microsoftpdc.com/timeline.aspx
http://channel9.msdn.com/pdc2008/

Vi Hörs!
-Janne



Tips: Strängar över flera rader

clock juni 26, 2008 15:33 by author Ola Håkansson

Vid saker som hanterar långa strängar ser jag ofta kod som delar upp strängen på flera rader och sedan slår ihop dem igen genom att konkatenera. Säg att vi av någon anledning har en sträng med SQL så här:

string sql = "SELECT * FROM OrderLines" + "WHERE OrderID = @OrderID" + "AND Quantity > 100";

Att konkatenera strängar på det här sättet är dumt och onödigt då vi har så kallade verbatim string literals i C# sedan version 1.0 där vi kan skriva ut en sträng på flera rader. Detta görs genom att sätta ett @-tecken framför strängen:

string sql = @"SELECT * FROM OrderLines WHERE OrderID = @OrderID AND Quantity > 100";

På så sätt slipper vi konkateneringen och kan ha en sträng på flera rader. Verbatim string literals kan också vara mycket användbara till annat också då de behandlas ord för ord och inte tar hand om escape sequences. T ex för sökvägen till en katalog:

string path = @"C:\Verbatim\String\Literals";

Du hittar mer om verbatim string literals i C# Language Specification.