fredag 10 september 2010

Det vackra i att dölja komplexitet (I'm back!)

Okej. Det var minst sagt ett tag sen. Strunt i det nu.

Idag avslutade jag dagen på topp. Vi vet ju alla att långt ifrån alla dagar på kontoret slutar så lyckligt. Ibland är man mitt i "zonen" när dagishämtningen pockar, ibland är hemgången en ren lättnad efter en dag fylld av motgångar och trassel. Men idag slutade jag på topp.

Jag har insett att min verkliga fetisch inom programmering är att gömma komplexitet. Att generalisera, parametrisera och göra den där svåra saken EN gång. För att jag sen ska utföra samma åtgärd enkelt och helst med en one-liner. Nu innefattande den lösning vi byggde en klass med tre generiska argument och en konstruktor med ett predikat, en func och en action. Snacka om generalitet.

Ok, ibland gör vi dom där generiska klasserna och snurrorna bara för att polera våra egon. Ibland drar man till med en tenär operation bara för att vi kan. Men det som verkligen ger tillfredsställelse är när man använder dessa kraftfulla konstruktioner rätt.


Ibland sysslar vi med copy-paste programmering, vi gör om samma sak om och om igen eftersom det löser uppgiften. Men i de lägena ringer klockan. Här finns chans för generalisering och förenkling.

Jag har jobbat en hel del med Silverlight och MVVM det senaste. I en situation insåg jag att vymodell 2 var till 50% en kopia av vymodell 1. Det var vid tanken att på att skriva exakt samma tester igen eller supporta samma kod på två ställen som gränsen var nådd. Därmed fann jag ett rätt användbart mönster som går att applicera på MVVM med, enligt mig, bibehållen abstraktion.

Om man behöver samma beteende i två vymodeller innebär det med all säkerhet att man har samma beteende i två vyer. Hade detta varit på min gamla WinForms tid hade jag skrikit UserControl för full hals. Ok. Jag skapar en UserControl med det gemensamma beteendet. Nu, för att använda denna UserControl behöver mina vymodeller publicera en 6-7 properties som vyn kan binda till. 6-7 properties i varje vymodell som är duplicerade... RRRRIIIIINNGGG!

Vad jag gjorde var att skapa en delad vymodell för min UserControl som var separat. Denna vymodell innehåller då de properties som behövs. Vymodell1 och Vymodell2 publicerar då bara en property, av den delade Vymodellens typ. Jag sätter DataContext på UserControlen till denna property och voila!

Det som var ännu bättre var att jag lät den delade Vymodellen ta in ett generiskt argument (ok, jag gillar tydligen dom) och därmed kunde operationerna se lika ut medan det som vyn hanterade kunde variera.
Initieringen av den delade vymodellen kan ta in Func eller Action eller Predicate för att utföra specifika åtgärder. Detta bestämmer ju den vymodell som är host, men den gör det deklarativt och EN gång.

Detta är ett mönster som jag med en gång fann mer användning för. Det har säkert ett namn, det är säkert välkänt och det finns kanske åsikter om dess legalitet... men det funkar OCH det låter mig göra saker EN gång.

Låt gå för att denna post kanske var lite mer low-level än annars. Låt gå för att den skulle innehållit kodexempel istället för "lilla sagan om koden". Låt gå. För nu skriver jag av mig tankar igen och det känns grymt!

Over and out!

[Dagens kodarmusik: RAMsterdam - Jorn van Deynhoven remix edit]

Ps. Jag hörde att Silverlight 5 är på gång. Kan det vara sant? Hur fort ska vi byta versioner egentligen! Ds.

Inga kommentarer:

Skicka en kommentar