MVC-Spagetti – Et gammelt problem i nye patterns
Tænk dig, hvordan vi ville se ud i hovedet, hvis en sagde til os, for bare ganske få år siden, at code-tags i din HTML ville vende tilbage, og lige pludselig blive hyldet? Det er jo nærmest det der er sket idag - og jeg så det ikke komme. Denne post handler om disse code-tags og om at vi må tage nye metoder ibrug, for at holde spegetti-koden i skak.
ASP.NET MVC er for mange frelsen fra Webforms. Webforms ses af mange, som en fejltagelse. Jeg giver dem dog ikke ret i at det var en fejltagelse, at prøve at tage et andet perspektiv på webudvikling. Tænk hvor vi havde været uden at lære af webforms, og tænk hvor mange fede ting der er lavet i webforms, og bliver udviklet i webforms i fremtiden? Webforms er og bliver en god platform, og denne post handler dog ikke om webforms, men om MVC.
Jeg er stadig ikke solgt til at kode også høre til i HTML'en. I mine øjne høre HTML til i HTML'en, og kode til i kode-filer. Men jeg er dog klar over at vi selvfølgelig bliver nød til at have nogle hooks, for at få disse ting til at spille sammen. I Webforms, var det server kontroller som var disse hooks. I ASP.NET MVC, er de de så kaldte HtmlHelpers, og vores det velkendte foreach loop. Jeg giver folk ret i at det ene kan være lige så godt som det andet. Det genialle ved webforms server kontroller er bare det, at de ikke er særligt fleksible. I MVC Views, kan vi alt for let komme til at "se lyset", og lige pludselig kode kompleks logik i vores HTML. Jeg siger ikke at det er umuligt at skrive pæne views i ASP.NET MVC, men det er bare meget sværre at lade sig rive med, og lige pludselig have if-statements over det hele.
Derfor er vi nød til at holde os selv lidt mere i ørene, for at få noget godt HTML, vi kan vedligeholde i MVC. Tilgengæld får vi også 100% det vi beder om – hvilket er et stort plus for os, som føler os godt hjemme i HTML. Dog vil jeg gerne have jer til at tænke på seperation of concerns. Det er et af de punkter som skulle være rigtig godt i MVC, men mange glemmer dette, når de laver deres views.
Javascript er vores nye code-behind
En af de ting som kan hjælpe os meget med denne problemstilling er Javascript. Her snakker jeg ikke om AJAX, og andre pletfjernere, men om at bruge Javascript til at generere og styre din HTML. De fleste kender jQuery, og diverse demo’er, med at en liste lige pludselig bliver til et galleri, bare fordi du giver dit tag en class attribute. Når du ser disse demoer, så læg mærke til hvor lidt HTML du har behov for at skrive og vedligeholde. Javascript står altså for at transformere dit plain-html dokument til noget fedt. Denne tankegang kan give dig effektive web-applikationer som er lette at vedligeholde, fordi vores kode, i vores views, nu kun skal skrive så lidt ud i HTML, som er nødvendigt for at få dit resultat.
Galleriet er et godt eksempel på hvor simpelt du kan lave noget, ved at javascript står for en del af din HTML-genering. Men hvad med alt det i din kode, som ikke er et galleri? Her kommer en liste med normale ting du normalt skriver en del kode i dit view for at opnå, og løsningerne ved at bruge javascript:
- Alternating-items: Vi kender alle det, at vi ønsker zebra striber på vores tabeller. Vi skriver typisk en del kode, som gør at vi kan give hver anden række en bestemt CSS-klasse, som vi så kan give en anden farve. Ved at bruge jQuery, kan vi gøre dette på en linie javascript: $(“.myTable:even”).addClass(“alt”)
- Conditional HTML eller styling: Vi har typisk en problemstilling hvor noget HTML skal vises hvis en bestemt condition er opfyldt. Dette kan f.eks. være at hvis en bestemt person har været syg i en uge, så skal hans profil vises med rød. Dette kan give en masse if-sætninger i din kode. I javascript kan du løse dette ved at kigge på de data der er printet ud, og derefter lave beslutningen om han skal være rød. På denne måde, er det nemt at tilføje at han skal være gul efter en periode, uden at dit view bliver endnu mere rodet, da javascriptet er gemt væk i sin egen fil – faktisk lidt ligesom vores code-behind fil. :)
- Gentaget HTML: Tit har man en liste, hvor hver række indeholder en masse delt HTML. Dette kunne f.eks. være at alle items i listen kan redigeres, slettes osv. Dette producere en masse HTML, som javascript nemt kan generere. Tænk hvis du bare kunne skrive din tabel således:
<table class="updateable deletable stripes"> <tr> <td>1</td> <td>Jesper</td> <td>Jensen</td> </tr> <tr> <td>2</td> <td>Knud</td> <td>Hansen</td> </tr> </table>
Som du kan se, så har vi meget simpel HTML, men vores javascript vil nu sørge for at tilføje det HTML der er nødvendigt for at tilføje et update-link og et delete-link. Bemærk også at hvis du har en liste med 100 items eller mere, så kan det faktisk blive en ganske god del af HTML du spare per gang personen besøger denne side, og selve javascript transformationen kan meget vel gå hen at tage kortere tid, end at hente HTML’en.
Er jeg nu frelst for spagetti kode?
Nej desvære ikke helt. Man skal hele tiden opveje hvor meget javascript der skal til, for at gøre ens views bare en lille smule mere neme at vedligeholde. Du skal jo huske at vores javascript også skal vedligeholdes, og det er vigtigt at veje begge løsninger, før du laver en beslutning – bare husk at dine views, skal være nemme at vedligeholde – lige som resten af din kode.
Happy shooting coding