Pirate Party Ad

fredag 5 december 2008

MVC, Django och webbgränssnitt

Häromdagen skrev Slashdot om Model-View-Controller-modellen, allmänt kallad MVC. Intressant läsning om en design pattern som har tappat sin ursprungliga betydelse. Kul timing, då jag den senaste månaden har provat en hel del olika ramverk för webbutveckling som säger sig ha baserat sig just på MVC.

Slashdot artikeln hänvisar till blogginlägget Removing the Model-View-Controller Straitjacket av Malcolm Tredinnick, ett inlägg som ger en sammanfattad bakgrund till vad MVC är och brukade vara. Inlägget förtsätter och ger inblick i hur hela designmönstret (en: design pattern) har blivit luddigt då man försökt att applicera det på icke-GUI-program.

MVC användes ursprungligen för att enkelt utveckla grafiska användargränssnitt, alltså t.ex. vanliga Windows-program med fönster och knappar mm. I allmän mun brukar MVC beskrivas i tre delar


  • Modellen, som hanterar datastrukturerna som programmet använder sig av. Ibland kan detta vara en databas. Exempel kan t.ex. vara en lista över namn och telefonnummer.

  • Vyn, som är det som användaren ser, i GUI-implementation är detta det fönster du ser framför ögonen.

  • Controllern, som hanterar kommunikation mellan Modell och Vy.

Den ursprungliga idéen med MVC var att Vyn skulle bli påmind om någonting i modellen förändrades (liknande Observer). Ett problem är att detta inte kan implementeras på en webbplattform då sidorna generas vid behov. Av den anledningen modifierades den ursprungliga idéen så att Controller-delen var den del som fick ta emot anrop från klienterna och som tillsammans med mallar genererade den HTML som skickades tillbaka.

Malcolm menar att denna 'modifikation' är större än man tror. Hela idéen med MVC baserade sig på GUI-utveckling och genom att föra in MVC i webbutvecklingen så har man modifierat designmönstret alltför grovt för att kunna säga att man fortfarande håller på med MVC-utveckling. Malcolm tar Django som exempel, även om han påpekar att Django inte är ett undantag. Då jag lagt några dagar på att utveckla en halvklar sajt i Django, blev Malcolms analys ännu mer intressant.

Django är en ramverk för att utveckla hemsidor som slaviskt följer (det modifierade, asynkrona, om man så vill) MVC-mönstret. Ramverket är skrivet i Python och tanken är att man genom att tvinga utvecklaren att dela upp sin kod i löst kopplade delar (Modell, Vyn och Controllern) ska göra hemsidans kod mer strukturerad och lättadministrerad.

Min erfarenhet av Django och många andra ramverk för webbutveckling, som hävdar att de bygger på MVC-modellen, är att de i fel spår. MASSOR av dessa ramverk ställer för stora krav på programmeraren och saknar den flexibilitet som kan behövas. Exempelvis så är Djangos template-system (sv: mall) Kid riktigt förfärligt med en knölig syntax som dessutom inte tillåter att data modifieras i mallarna, något som aldrig krävdes i det ursprungliga MVC-mönstret. Idéen är god med det blir mer knöligt och mer hopp i kod än kontinuitet när man läser den.

Ruby-on-Rails i all ära, men syntaxen är förfärlig. Kanske PHP är det bästa vägvalet ändå, trots att det inte kräver någonting av ens programmerare alls. Än.

2 kommentarer:

Unknown sa...

kolla in Zend Framework. PHP-framework som inte saknar mycket. Riktigt trevlig och när man väl fått kläm på det går allt av bara farten...

Jens sa...

Tack för tipset! Av någon anledning hade jag fått för mig att Zend var utvecklingsverktyg och inget ramverk.

Just nu kikar jag på CakePHP som kan vara närmre det jag tänker mig...