WPF

WinForms er ut – Windows Presentation Foundation er fremtidens klient-teknologi på windowsplattformen. Her er mine artikler om WPF.

Nytt prosjekt: SharpBrain

Jeg begynte et nytt hobbyprosjekt i helgen – et 2D brettspill i WPF jeg har valgt å kalle SharpBrain, eller #Brain om du vil. Denne gangen tror jeg at jeg har et brukbart konsept, og at det vil være noe jeg kan fullføre. Her er et foreløpig screenshot – en del av grunnlogikken ble ganske raskt klar, men den eneste visuelle sålangt er selve spillbrettet:

CropperCapture[39]

SharpBrain vil i utgangspunktet bli et ganske enkelt spill mellom to eller flere “styrker” plassert på et hexagonalt rutenett. Styrken din vokser for hver runde, og man kan spre styrkene ved å bevege seg rundt og angripe/konsumere andre styrker. Det mest interessante i Sharpbrain vil derimot bestå av diverse “pluggable” moduler:

– For det første vil spillet vil ha et utvidbart sett med game actions – handlinger spilleren kan utføre når det er hans tur. Den grunnleggende handlinger er move, men vil bli utvidet med diverse andre, som teleport, shoot, shield, explode, etc. De ulike handlingene kan ha ulike conditions som gjør at de blir tilgjengelige.

– Sharpbrain vil også kunne endre karakter ganske drastisk gjennom et sett med game rules. Tanken er at dette skal være moduler som kjøres for hver celle etter hver spillers tur, og kan gi spilleren ulike fordeler eller ulemper basert på spillets gang, hvor mange styrker spilleren har i den bestemte cellen o.l.

– Videre vil jeg implementere ulike game judges, som avgjør hvordan man vinner spillet. Et scenario vil for eksempel være at man skal utslette alle andre styrker. Et annet kan være at man skal okkupere en eller flere predefinerte celler i en eller flere runder.., et slags “capture and hold” modus.

– Til slutt vil jeg implementere ulike AI’er, sånn at man kan spille mot maskinen, som kan benytte ulike strategier for å forsøke å slå deg. Jeg tror dette kan bli den mest utfordrende delen av utviklingen – selv om spillet i utgangspunktet er ganske enkelt, så åpner det opp for ekstremt mange muligheter i løpet av spillets gang – ikke minst når man legger til flere actions, rules og judges. Drømmen er at folk får lyst til å bidra med utvidelser når jeg er ferdig med grunnimplementasjonen av spillet. Jeg skal i alle fall sørge for å gjøre det relativt enkelt å legge til ny plug-ins. Dessuten vet jeg at det er mange som har sansen for å lage AI’s, og dette vil kunne bli en brukbar plattform for å kjøre “robot battles” mellom dem. Kanskje kunne jeg lagt opp muligheten for å lage AI’s i IronRuby og IronPython – det hadde vært konge!

Følg med fremover på hvordan dette (forhåpentligvis) utvikler seg..

MSDN Live Bergen – september 09

Einar presenterer WPF og Silverlight på MSDN Live i Bergen

Denne uken var det i Bergen igjen tid for å ta imot MSDN Live – Microsoft’s road show for utviklere. Som nevnt tidligere var det tre foredragholdere denne gangen, Børge Hansen, Einar Ingebrigtsen og Fredrik Kalseth. Jeg minglet litt først på dagen, så jeg fikk ikke med meg Børge sine presentasjoner av hva som er nytt i VS 2010 og C# 4.0, men her er min oppsummering av de andre foredragene..

WPF 4

I sommer har Einar vært med og utviklet en Microsoft Surface applikasjon for underholdningsprogrammet De Ukjente på NRK1, og han startet med en presentasjon av det, og snakket litt om erfaringene fra prosjektet. Deretter tok han for seg noen utvalgte områder i WPF 4 – han snakket litt om multitouch, demonstrerte ribbons (som han nevte også kan benyttes i WPF 3.5), viste hvordan man lager jumplists for Windows 7, og til slutt avlørte han noen nye databindingsteknikker.

Demonstrasjonen ble desverre noe preget av at Einar hadde lastet ned siste versjon av Visual Studio 2010, som krasjet i tide og utide. Jeg antar de klarer å gjøre IDE’en stabil igjen før den endelige releasen, men inntrykket vi fikk under demoen var ikke bra, og førte til at Einar ikke rakk å vise oss WPF’s nye Visual State Manager.

Silverlight 3

Silverlight-sesjonen gikk mye bedre. Versjon 3 inneholder et hav av nye ting, og også her valgte Einar ut et lite sett av de mest spennende tingene. Han demonstrerte en skygge-effekt som bruker Silverlights pixel shader støtte, han viste oss hvordan Out of Browser fungerer, demonstrerte deler av navigasjons-støtten som er bygget inn (deep linking), og hvordan databinding har blitt mere likt slik det er i WPF.

Det var kanskje mest spennende mot slutten, da han bruke .NET RIA services. Jeg er kjent med hva dette er for noe fra diverse podcasts, men hadde faktisk aldri sett det før – og jeg ser nå at dette er noe jeg absolutt bør se nærmere på. RIA services ser ut til å være en veldig naturlig komponent i enhver løsning som har mye funskjonalitet i browseren (Silverlight eller AJAX-heavy web site), og jeg skulle gjerne ha sett et eget foredrag på MSDN Live dedikert til dette rammeverket.

Einar nevnte også Silverlight Toolkit, en samling av kontroller man kan laste ned fra codeplex, og demonstrerte også en av dem som heter Dataform. Denne verktøykassen inneholder mye bra som man bør ta en titt på om man skal utvikle noe i Silverlight.

Til slutt fortalte Einar litt om Balder, 3D motoren han laget for Silverlight, som etterhvert har/skal utvikle seg til å bli en spillmotor også for Xna og OpenGL. Balder er “hovedpersonen” i en bok som lanseres i disse dager: 3D Game Development with Microsoft Silverlight 3: Beginner’s Guide. Sikkert spennende lesestoff om du går med en liten spillutvikler i magen.

ASP.NET 4

Fredrik viste seg å være en meget solid foreleser. I sitt første foredrag brukte han endel slides til å raskt gå over en rekke nye ting i ASP.NET versjon 4: Slankere web.config, cache providers, preload providers, session state compression, viewstate mode, client id mode, encoding-forbedringer, rendering-forbedringer for å støtte XHTML, MSDeploy, JSONP, m.m.

Deretter gikk han mer i dybden på et par ting, nemlig routing – som begynner å bli ganske kjent nå – og client template rendering. I demoen brukte han et “full-fledged” web prosjekt som bl.a. inneholdt enhetstester, bruk av IoC container (Ninject), repository pattern, og god seperasjon av ansvar i presentasjonslaget. Jeg synes dette fungerte veldig bra, og gav foredraget en ekstra dimensjon i forhold til en typisk demo av hva som er nytt i ASP.NET. Vi måtte holde 100% fokus på hva som skjedde på skjermen for å ikke falle av, for Fredrik holdt et ganske bra tempo, og gav oss mye “valuta for pengene”.

Han gav oss også et par andre tips til ting det kan være verdt å se på. Først og fremst var dette ASP.NET Chart Controls pakken fra Microsoft (presentert av ScottGu her). Her har de laget en flott, gratis chart-pakke som kan erstatte mye av behovet for tredjepartskontroller.

Det andre tipset var et lite javascript biblotek som heter datejs – noe jeg gjerne kommer til å bruke selv nå som jeg vet om det.

Smidig utvikling i Visual Studio

Den siste forelesningen til Fredrik fikk jeg bare delvis med meg (måtte rydde NNUG-standen), men likevel var det den jeg likte aller best. Her snakket han nemlig om flere av mine “hjertebarn”; han gav bl.a. en god introduksjon til Onion Architecture og Inversion of Control, og snakket om god utviklingsprosess med bruk av testdreven utvikling, branching, continuous integration, automatisk deploy til test og staging-miljø, automatisk kjøring av funksjonelle tester vha selenium, m.m.

Han brukte flere, nye features i Visual Studio og Team Foundation Server, og viste bl.a. hvordan de nå har tatt i bruk Workflow Foundation for å lage build- og deployment-prosesser, noe som virket ganske bra. Fredrik brukte det samme web prosjektet som han  viste oss i den første sesjonen, og jeg tror som sagt dette gav dem som hørte på noe ekstra, ved at de fikk se et fullverdig prosjekt gjort på den “riktige” måten.

Oppsummering

Dagen ble bedre enn forventet. Beskrivelsen av agendaen, med fokus på Microsoft’s produkter, gav et for snevert inntrykk av hva foredragene inneholdt. Jeg ble spesielt imponert over Fredrik sine presentasjoner, og jeg synes vi absolutt bør forsøke å få ham til å komme og holde noen foredrag for oss på NNUG i Bergen – de fleste utviklere kan lære noe av hvordan han gjør saker og ting.

Holder du til i Oslo kan du forøvrig fortsatt få med deg disse foredragene, da MSDN Live kommer til Oslo Kongressenter tirsdag 29. september.

"Vil du bli en .NET Ninja" lansert

I helgen lanserte jeg endelig første release av DotNetNinjaQuiz, min versjon av Vil Du Bli Millionær for .Net-utviklere. Dette er et prosjekt jeg begynte på i januar i år (blogget om det her) som et første forsøk på å lage en WPF applikasjon. Jeg tok opp tråden nå for å kunne spille spillet på høst-kickoff’en til utviklerne i PSWinCom.

Version1_level1

Jeg har gitt DotNetNinjaQuiz et hjem på google code. Etter at jeg la ut versjon 1 twittet jeg om det, og responsen var bra, for etter bare noen få timer hadde nesten 40 personer lastet det ned, og nå – fire dager senere – har over 80 besvart .NET-spørsmål. Det er gøy å lage ting når folk er interessert i å prøve det ut.

Som sagt kodet jeg det meste av dette programmet i januar – i starten på .Net Ninja-initiativet mitt – og det bærer koden preg av. Jeg hadde praktisk talt ikke gjort noe i Windows Presentation Foundation tidligere, og jeg behersket hverken testdreven utvikling eller presentation patterns på den måten jeg gjør i dag. Men gjennom prosjektet fikk jeg prøvd meg på litt av hvert, som for eksempel dynamisk skalering av elementene på skjermen, lasting av grafikk og avspilling av lydeffekter. Jeg brukte også db4objects for persistering, en teknologi jeg akkurat hadde oppdaget på den tiden.

Hvis du ikke har prøvd spillet enda så håper jeg du vil laste det ned og ta en titt. Hva med å for eksempel kjøre et lite “game show” på jobben? Eller foreslå å spille det på neste brukergruppemøte?!

Jeg er forresten veldig interessert i bidrag til neste versjon – spesielt i form av flere spørsmål – så ta gjerne kontakt om du er interessert.

Enkel integrasjon mot TeamCity

Du tror det kanskje ikke, men versjon 3 av ContikiCenter er sluppet – bare 14 dager etter versjon 1. Dette er en WPF-applikasjon jeg utvikler som står sentralt plassert i resepsjonen der jeg jobber, og viser noen sentrale data om statusen i CMA Contiki’s R&D avdeling.

ContikiCenter TeamCity integration 1
Contiki Center versjon 3.0

Fra før har jeg laget en modul for personellstatus, og en som viser status på vårt nattlige CruiseControl-bygg som produserer installasjonspakker m.m. (litt om den modulen her). Til versjon 3 har jeg utviklet en integrasjon til TeamCity, og her skal jeg fortelle litt om den og dele noen WPF-erfaringer etc.

TeamCity er en server for kontinuerlig integrasjon (CI) fra JetBrains, selskapet bak ReSharper. Hver gang vi sjekker inn endringer i kildekodesystemet vårt, fyrer TeamCity igang automatisk kompilering og kjøring av eventuelle enhets- og integrasjonstester. Kontinuerlig integrasjon er et uvurderlig hjelpemiddel når man jobber i felleskap på samme produkt.

Advarsel: WPF-koden i denne artikkelen utgjør på ingen måte best practice. Jeg har enda ikke lært meg MVVM, og er ikke så flink til å separere logikk og visningskode. Modulene mine er derimot så enkle at dette ikke har vært nødvenig, og jeg håper man kan finne et og annet tips av verdi likevel.

Modulen jeg har laget for ContikiCenter lister statusen på de viktigste CI-prosjektene vi har kjørende. TeamCity tilbyr Atom-feeds med diverse informasjon (Atom er nesten det samme som RSS), og det er dette jeg har brukt for å lage integrasjonen. Med LINQ to XML er det enkelt å hente feeden, parse den og opprette instanser av klassen Build som jeg har laget for å holde informasjon om et TeamCity-bygg. Det gjør jeg på denne måten:

var xml = XDocument.Load(_feedUrl);

XNamespace xmlns = “http://www.w3.org/2005/Atom”;

 

var entries = from xElem in xml.Descendants(xmlns + “entry”)

              select new Build

              {

                  Name = BuildParser.ExtractName(xElem.Element(xmlns + “title”).Value),

                  BuildTime = BuildParser.ExtractTime(xElem.Element(xmlns + “updated”).Value),

                  StatusDescription = xElem.Element(xmlns + “author”).Element(xmlns + “name”).Value,

              };

BuildParser er en enkel hjelpeklasse for å parse ut deler av informasjonen jeg trenger. Selve modulen som skal vise byggene har følgende code behind:

   24 public partial class TeamCityDefaultView : UserControl

   25 {

   26     private string _feedUrl;

   27     private DispatcherTimer _timer;

   28     private ObservableCollection<Build> _builds = new ObservableCollection<Build>();

   29 

   30     public ObservableCollection<Build> Builds

   31     {

   32         get

   33         {

   34             return _builds;

   35         }

   36     }

   37 

   38     public TeamCityDefaultView()

   39     {

   40         _feedUrl = ConfigurationManager.AppSettings["TeamCityFeed"];

   41         FetchBuilds();

   42 

   43         InitializeComponent();

   44 

   45         _timer = new DispatcherTimer();

   46         _timer.Interval = new TimeSpan(0, 1, 0);

   47         _timer.Tick += new EventHandler(_timer_Tick);

   48         _timer.Start();

   49     }

   50 

   51     void _timer_Tick(object sender, EventArgs e)

   52     {

   53         FetchBuilds();

   54     }

   55 

   56     private void FetchBuilds()

   57     {

   58         var teamCityFeed = new TeamCityFeed(_feedUrl);

   59         teamCityFeed.Load();

   60 

   61         _builds.Clear();

   62         foreach (var item in teamCityFeed)

   63         {

   64             _builds.Add(item);

   65         }

   66     }

   67 }

Propertien Builds er en ObservableCollection som til enhver tid inneholder alle byggene fra Atom-feeden. I XAML-delen av kontrollen kan jeg binde mot denne, og brukergrensesnittet vil automatisk oppdatere seg om inneholdet i kolleksjonen oppdaterer seg.

I konstruktøren setter jeg opp en DispatcherTimer til å tikke én gang i minuttet, og for hvert tikk henter jeg feeden på nytt og oppdaterer Builds-properien. TeamCityFeed er klassen min som henter og parser feeden.

Resultatet er modulen du ser nedenfor, som viser navnet og statusbeskrivelsen for hver bygg.

ContikiCenter TeamCity integration 2

Grensesnittet består av to ulike WPF-kontroller. TeamCityDefaultView er den blå, store boksen. DataContext er satt til å peke på seg selv (ved hjelp av den merkelige syntax’en på linje 5 (se nedenfor)), og slik vil den få tilgang til Builds-propertien. TeamCityDefaultView inneholder videre en ItemsControl, som mer eller mindre tilsvarer en Repeater i ASP.NET (om du er kjent med det). Og det er i den kontrollen vi sier at ItemsSource skal bindes mot Builds.

Grensesnittet for hvert enkelt bygg defineres av en annen WPF-kontroll jeg har kalt BuildControl. For å bruke den må jeg inkludere namespacet den ligger i, og det har jeg gjort i linje 3. Ved å sette DataContext={Binding} vil hver kontroll som opprettes på bakrunn av Builds-kolleksjonen motta én Build-instans.

ContikiCenter TeamCity integration 4
Klikk her for større bilde

XAML’en til BuildControl ser du nedenfor. Den inneholder enkelt og greit to tekstblokker som bindes mot henholdsvis Name og StatusDescription fra Build-instansen som er datakonteksten til kontrollen.

ContikiCenter TeamCity integration 5
Klikk her for større bilde

Nå gjenstår det bare en ting: Om en build feiler ønsker jeg at det skal bli veldig synlig for dem som går forbi statustavlen.., jeg vil at den skal skrike rødt. For å få til det overstyrer jeg OnRender i BuildControl-komponenten, henter ut Build-instansen, og sjekker statusbeskrivelsen. Om beskrivelsen er “failed build” overstyrer jeg utseende på Border-kontrollen, som er ansvarlig for hvordan raden ser ut:

   28 protected override void OnRender(DrawingContext drawingContext)

   29 {

   30     Build build = DataContext as Build;

   31 

   32     if (build != null)

   33     {

   34         if (IsFailedBuild(build))

   35         {

   36             RadialGradientBrush failedGradientBrush = new RadialGradientBrush()

   37             {

   38                 GradientOrigin = new Point(1, 1.5),

   39                 SpreadMethod = GradientSpreadMethod.Pad,

   40             };

   41             failedGradientBrush.GradientStops.Add(

   42                 new GradientStop(

   43                     Color.FromArgb(0xFF, 0xFF, 0×93, 0x4A), 0));

   44             failedGradientBrush.GradientStops.Add(

   45                 new GradientStop(

   46                     Color.FromArgb(0xFF, 0xFF, 0×19, 0x0B), 1.3));

   47             _border.Background = failedGradientBrush;

   48             _border.Opacity = 1;

   49         }

   50     }

   51     base.OnRender(drawingContext);

   52 }

   53 

   54 public bool IsFailedBuild(Build build)

   55 {

   56     return build.StatusDescription.ToLower().Equals(“failed build”);

   57 }

Borderen (og dens innhold) har jeg også per default satt til å være gjennomsiktig. Om bygget feiler setter jeg opacity til 1, slik at den blir ekstra synlig. Og sånn blir resultatet:

ContikiCenter TeamCity integration 3

Jeg måtte fremprovosere en feil for å få tatt dette snapshot’et, siden byggene våre er så stabile :)

Håper du fant noe av interesse her. Har du noen kommentarer til mine ynkelige forsøk på bruk av WPF så setter jeg umåtelig pris på en kommentar eller tre.

Knagger: , ,

ContikiCenter version 2.0

Jeg har tidligere fortalt at jeg utvikler et overvåkningssenter internt i Contiki. Versjon 1 var ferdig 31. mars, og inneholdt en modul som viser status for alle ansatte – hvor de befinner seg (på jobb, hos kunde, syk osv.). I dag slapp jeg version 2, med en modul som viser status for nattens bygg.

Jeg har laget en fattigmanns-integrasjon mot vår CruiseControl.net som vi bruker til å bygge prosjektene våre, inkludert MSI pakker, språkfiler, kodesignering med mere. Jeg benyttet enkel screen scraping til å hente status og noen detaljer fra den siste build-rapporten for et bestemt build-prosjekt.

Hvis alt er OK vises kun en uskyldig, liten blå boks med dato for siste bygg. Hvis ting ikke har gått som det skal derimot, slik som er tilfelle akkurat nå, blinker byggstatus-modulen faretruende og ser ut som dette:

BuildStatus

Jeg holder på med dette prosjektet for å lære meg WPF, og denne gangen var utfordringen først og fremst animasjoner. Jeg ønsker at meldingen skulle blinke når den var rød, men å starte og stoppe en animasjon var ikke bare enkelt. Jeg fant til slutt en løsning på stackoverflow, men den føles ikke helt god. 

Jeg hadde også tenkt at hvis musepekeren var over boksen så skulle blinkingen stoppe midlertidig, men der gav jeg rett og slett opp. Moralen er at WPF er vanskelig, og jeg må bruke mer tid på å sette meg grundig inn i dette.

Vil du bli en .NET ninja-spillet

Jeg er i ferd med å planlegge et lite Vil Du Bli En .NET Ninja spill. Jeg tenkte det skulle være et Vil du bli en milionær-lignende spill i WPF – som en liten demo-applikasjon. Kanskje det kunne være noe som var gøy å spille f.eks. i pizzapausen på NNUG.

Men jeg hadde satt pris på litt hjelp. Jeg trenger noen som har lyst til å lage noen spørsmål. Kan du tenke deg å bidra? Det spiller ingen rolle hvor mye du orker – send meg bare en liste med så mange du har lyst til. Fem spørsmål er helt greit. 500 er umenneskelig.

Hvert spørmål må være en forholdsvis kort setning, og ha fire, korte svar, hvorav kun ett er riktig. Og vi bruker engelsk – det er det greieste.

Bruk Excel eller lignende med én kolonne for spørsmålet, kolonne 2 for riktig svar, og kolonne 3 til 5 for tre gale svar. I kolonne 6 er det fint om du kan oppgi vaskelighetsgrad: 1 = banalt enkelt, 2 = sånn passe vanskelig, 3 = veldig vanskelig.

questions.png

Spørsmålene kan omhandle alt du mener en .net ninja bør vite – om .net rammeverket, om programmering generelt, om verktøy man bør kjenne til osv.

Send spørsmålene til torbjorn punktum maro alfakrøll gmail punktum com. Jeg blir deg evig takknemlig, og du vil bli kreditert i spillet!

Internt overvåkingssenter i WPF

Jeg har satt igang et sideprosjekt på jobben. Contiki Center er et slags overvåkingssenter, en slags kiosk-applikasjoner, som skal stå et sted hvor den er synlig for alle på kontoret og vise status for ulike ting. Her kan man se status på vår nattlige build fra CruiseControl.NET, status fra continous integration serveren (TeamCity), support status, sprint burndown for alle utviklingsteam m.m.

ContikiCenter1o.png

Skjermdumpen over viser et WPF shell i full screen mode med noen dynamisk lastede moduler. Foreløpig lite matnyttig, men rammeverket er på plass.

Jeg kunne gjort dette mye enklere, men har valgt å bruke dette behovet til å lære best practices rundt Windows Presentation Foundation. Så jeg baserer hele løsningen min på Prism, som er patterns & practices-teamets referanseapplikasjon for å bygge “composite applications” i WPF og Silverlight. Dette tilsvarer den gode, gamle CAB’en (Composite Application Block) for WinForms.

Jeg har også funnet en feiende flott graf-kontroll for Silverlight og WPF som er open source, nemlig Visifire. Anbefales!

Nå forbereder jeg meg på å ta et dypdukk ned i de ulike mønstrene (patterns) som anbefales for presentasjonslaget. Det er noe som kalles M-V-VM som alle snakker om for tiden: Model-View-ViewModel. Prism refererer ikke til dette, men snakker om Model-View-Presenter, Presentation Model og Supervising Controller. Så nå må jeg lese litt, og få alt dette til å henge sammen.

Julekalender i WPF

Hvert år lager Lene og jeg julekalendere til hverandre. Hva sier du, gjør ikke du sånt for kona di? Ta deg sammen da mann!

Vi synes uansett dette er en fin tradisjon, og hvert år forsøker vi å finne på noe litt nytt. Så i år valgte jeg å laget et lite julekalenderprogram til Lene. Dette er faktisk mitt første forsøk på å lage et brukergrensesnitt vha Windows Presentation Foundation. Jeg gjorde ikke noe spesielt avansert, men det ble nå litt kult likevel. Her er et par skjermbilder.

julekalender1.Png  julekalender2.Png

Tror forresten ikke jeg har nevnt det før: Lene har også en blog. Hun blogger om hobbien sin på Creativity Pursuite. Hun blir sikkert glad om du tar en titt og legger igjen en hilsen.

WPF eller Silverlight + Presentation Model = KANONBRA DESIGN

Gøran Hansen holdt hele tre foredrag på gårsdagens MSDN Live i Bergen. Det første var en slags introduksjon til Silverlight, men jeg har allerede brukt en del tid på å sette meg inn i denne teknologien, så her var det ikke noe nytt for meg.

Deretter snakket han om noe som heter ASP.NET Dynamic Data som kom i SP1 for .NET 3.5. Det dreier seg om et rammeverk for å automatisk generere en web app basert på et databaseskjema. En komplett site med view og edit muligheter av alle tabeller i basen får man vha. et project template + én linje kode. Deretter kan man gå igang og modifisere de delene man ønsker for å lage en mere skreddersydd løsning.

Hele greia minner faktisk mye om Ruby on Rails. Gøran gav en veldig bra demo av teknologien, og argumenterte godt for hvorfor vi ønsker å gjøre det sånn (DRY.., Don’t Repeat Yourself). Han kom også med en prediksjon; han tror at scaffolding-implementasjonen som muligjør Dynamic Data om ikke så alt for lenge også vil dukke opp i WPF og Silverlight. Det høres flott ut. ScottGu har en bra blogpost som går mer i detalj om bruk av Dynamic Data.

Men skulle ikke denne artikkelen handle om Presentation Model?

Jo, det skulle den, for Gjørans siste foredrag var nok det mest interessante. Her demonstrerte han nemlig praktisk GUI programmering i WPF, men med fokus på hvordan koden bør struktureres.

Gjøran koder etter to kjente prinsipper

  1. Programmer mot et interface, ikke en implementasjon
  2. Separation of Concerns

Jeg har utallige ganger hørt om disse, og jeg har utallige ganger hørt og lest om patterns som MVC, MVP og Presenter Model, men aldri før har jeg fått en så konkret og illustrerende kodedemo som jeg fikk i går. Det gikk opp et aldri så lite lys for meg. Med Gjørans kode får man skilt ut GUI logikken fra selve presentasjonen, slik at den både kan gjenbrukes mellom ulike views (Silverlight, ASP.NET, WinForms etc.) og slik at den kan enhetstestes! Faktisk!

Gjørans Presentation Model er et objekt som abstraherer et brukerinterface. Det er et UI uten UI som han sa. Det inneholder UI’ets state og operasjoner, og i WPF eller Silverlight er det koblet til et view gjennom toveis databinding. Toveis databinding er ekstremt bra i disse nye GUI teknologiene, og det er det som gjør at Presnetation Model patternet fungerer ekstra bra her.

Det ble også poengtert at Presentation Model objektene alltid forholdt seg til data modellen gjennom interface – nødvendig for å få til enhetstesting, men også slik kan gjøre endringer enklere etc.

Koden Gjøran viste var fra hans SPRINT Board prosjekt, som han sa han skulle legge ut på Codeplex – men han lovet også å legge den + presentasjonene ut på bloggen sin, du finner den her. Koden, også fra Silverlight demone, er absolutt verdt en titt.


Torbjørn: La oss anta to ulike definisjoner av Template Method pattern - de to ytterpunkte...

Lars-Petter: Hei igjen. Siden du inviterer til å ta diskusjonen i bloggen, og har tatt deg t...

Torbjørn: Lars-Petter: Det er én måte å se det på. Det er absolutt fortsatt Template M...

Lars-Petter: Hei. Har du ikke i prinsippet her gått over fra Template Method (arv) til Strat...

Christian Abildsø: I alle fall i C#, så føles dette som kode som blir mer fleksibel men vanskelig...

Torbjørn: Hei Henrik, og takk for tilbudet. Ble oppmerksom på Rasberry Pi for under en uk...

Henrik Sandaker Palm: Ang. større hobby prosjekt. Du er som er en slik rakker på programmering har j...

Øivind Nilsen: Slutt å bruke mobilnummeret mitt som eksempel !...

Bjørn Einar Bjartnes: Jeg har også latt meg fascinere av Clojure, uten at jeg har kommet så veldig l...

Bjørn Einar Bjartnes: Sweet :) Jeg tror egentlig jeg liker det som det er, med musikk. Litt av utford...

 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • Template Method del 4: Multippel arv
  • Template Method Intermesso
  • Template Method del 3: Bare funksjoner
  • Template Method del 2: På vei mot funksjonell programmering
  • Kategorier

  • .net ninja (37)
  • Bøker (17)
  • Diverse prosjekter (35)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (77)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (33)
  • NNUG / community (60)
  • O/RM & databaser (10)
  • Off topic (116)
  • OO-design/clean code (30)
  • Podcasts (14)
  • Polyglot (77)
  • Ruby (27)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (20)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (32)
  • WPF (9)
  • WTF (12)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta