2007-02-06

Head First Design Patterns

De flesta utvecklare har väl någon gång kommit i kontakt med designmönster ("design patterns"), men för många har det stannat vid ett flyktigt möte, inte minst bland dem som räknar sig som .NET-utvecklare. Det är i alla fall min erfarenhet efter samtal med kollegor, kunder och andra .NET-utvecklare jag mött genom åren. Detta förhållande har sannolikt att göra med att .NET-plattformen i allmänhet, och verktygsstödet i form av Visual Studio i synnerhet, uppmuntrar utveckling enligt vad Martin Fowler kallar Table Module pattern (som är ett arkitekturmönster). Något förenklat handlar Table Module om att en instans (.NET DataSet) representerar, och hanterar affärslogiken för, alla rader i en databastabell eller -vy. Istället för en domänmodell (Domain Model pattern) och ett mer objektorienterat förhållningssätt underlättar .NET och Visual Studio utveckling med DataSet. I exempelkod och tutorials från Microsoft, liksom i de flesta projekt och kundprojekt jag arbetat med, blir det också ofta proceduriell programmering med metoder som hanterar DataSet som såväl in- som utparametrar (jmf Fowlers Transaction Script pattern). Jag antar att även Microsofts historik, inte minst Visual Basics ställning, gjort att det ser ut på detta sätt. Mot denna bakgrund är det förståeligt om intresset för objektorienterade designmönster inte är särskilt stort bland .NET-utvecklare.

Nu kanske någon tycker att jag målar fan på väggen bara för att få nöjet att piska honom och visst är det så att det finns gott om .NET-utvecklare som är såväl OO-purister som designmönsterevangelister. Enligt min erfarenhet är dessa dock undantagen som bekräftar regeln. Samtidigt är något på väg att hända. Domänmodellen vinner allt större inflytande (som jag varit inne på tidigare här) och Microsofts stora satsning med LINQ, O/R-mapping och den nya Entity Data Model i nästa version av ADO.NET ("Orcas") lär ge ännu mer näring åt denna utveckling. Om inte denna utveckling gör dig mer intresserad av att titta närmare på designmönster kanske ett boktips kan övertala dig? ;-)

Boken "Head First Design Patterns" (Eric & Elisabeth Freeman, Kathy Sierra, Bert Bates; O'Reilly Media 2004; 638 sidor) är utgiven i O'Reillys annorlunda, men populära "Head First"-serie. Head First har tagit fasta på de senaste rönen inom neurobiologi, kognitionsforskning och inlärningsteori och utifrån dessa skapat böcker som är fokuserade på att läsaren verkligen ska lära sig innehållet i dem. Detta har resulterat i visuellt rika framställningar som är fyllda med ingående, pedagogiska och tydliga exempel samt gott om inlärningsövningar av olika slag. Men framför allt är de väldigt underhållande (och lätta) att läsa och det är väl till syvende og sist det som gör dem så lärorika. Själv föll jag omedelbart pladask för det härliga bildspråket, den snygga presentationen, den nördiga humorn (även dåliga skämt underlättar inlärningen enligt folket på Head First) och de käcka 50-talsbilderna med välklädda och välfriserade män och kvinnor som i pratbubblor kläcker ur sig diverse klokskaper:

"I used to think real men subclassed everything. That was until I learned the power of extension at runtime, rather than at compile time. Now look at me!"

Utseendet är förstås inte allt. Head First Design Patterns tar upp ett dussintal (de mest användbara enligt dem själva) av de klassiska mönster som lades fram av "The Gang of Four" (Gamma, Helm, Johnson, Vlissides) i "Design Patterns: Elements of Reusable Object-Oriented Software": Observer, Decorator, Factory, Singleton, Command, Adapter, Facade, Template Method, Iterator, Composite, State och Proxy. Författarna ägnar ungefär 30-60 luftiga och lättlästa sidor åt varje mönster. En mycket liten del, ofta mot slutet av varje kapitel, ägnas åt den formella definitionen av mönstret som diskuteras. Man har istället valt att använda konkreta exempel på problem som kan lösas med hjälp av mönstret i fråga för att sedan på ett pedagogiskt vis arbeta - och inte minst omarbeta - in designmönstret i lösningen. Ett stort fokus ges de objektorienterade designprinciper som ligger bakom designmönstren ("Encapsulate what varies", "Open for extension, closed for modification" o.s.v.).

Även om det är ganska länge sedan jag första gången intresserade mig för designmönster har jag aldrig känt att jag haft särskilt stor användning för dem. Jag har naturligtvis stött på de vanliga och även vid något tillfälle skapat en Factory eller använt Singleton. Men när jag bläddrat i Gang of Fours bok eller ögnat igenom mönsterkataloger har det mesta känts väl abstrakt och lite grann som om det mer berör en annan värld än den där jag bedriver mitt dagliga arbete. Denna känsla har säkert att göra med den bakgrund jag tecknade i början av denna text och det faktum att jag nu tagit designmönster till hjärtat har säkert att göra med att jag i allt högre utsträckning kommit att ägna mig åt verklig objektorienterad analys, design och utveckling. Det sistnämnda skulle i så fall också förklara varför jag var så förtjust i boken Head First Design Patterns. Samtidigt kan jag dock inte göra mig fri från tanken att Head First faktiskt lyckats förklara designmönster på ett sådant sätt att de känns omedelbart användbara.

Om jag ska nämna någon nackdel med boken är det att den efter ett tag kan upplevas som lite tjatig och närmast överpedagogisk, exempel och förklaringar upprepas o.s.v. Å andra sidan vore det orättvist att förvänta sig ett kompakt och faktaspäckat referensverk - i så fall är nog Gamma et al att föredra.

UPPDATERING: Jag glömde nämna att Head First Design Patterns utgår från Java i kodexempel och annat, men denna lapsus beror troligtvis på att det knappast är något man tänker på om man är bevandrad i C#. Några exempel i avsnitten "patterns in the wild" tar upp Javas klassbibliotek, men även i dessa fall är likheterna med .NET Framework så stora att det inte är några problem att förstå för den som inte är bekant med Java.

0 kommentar(er):