ASP, PHP og ASP.NET - splitte logik fra præsentationen

Tags:    diverse
Skrevet af Bruger #13543 @ 07.10.2008
Det har altid været en udfordring at dele sin applikation op i lag. Man vil helst ikke have for meget logik i præsentationslaget og helst ikke have have nogle database kald i forretningslaget. Det er nemmere at dele det op hvis teknologien tillader dig at gøre det ordentligt.

Jeg er først lige begyndt at kigge på PHP, men for mig er det næsten ligsom at komme tilbage til den gode gamle ASP verden. Til dem der ikke ved det: PHP er programmeringssprog, ASP og ASP.NET er server teknologi og skal bruge en server for at afvikle. Sidstnævnte (ASP.NET) er en del af Microsofts .NET Framework og er en efterfølger til ASP 3.0.

Grunden til at jeg vil skrive denne artikel, og vise hvordan man nemt kan seperere sin logik fra sit præsentationslag, kommer udfra en debat der har været her på sitet. Du kan følge med eller selv deltage i debatten her.

Ofte så rammer man flere udfordringer når man udvikler web applikationer, en af disse udfordringer er "hvordan adskiller jeg mit HTML fra min kode" ?

Jeg kunne nemt afslutte artiklen her ved at skrive, "man kan aldrig undgå at mikse kode og markup med hinanden" - også ville jeg ikke engang lyve! Men det ville være kedeligt :)

Det handler vel i bund og grund om, at man gerne vil gøre sin kode så læsbar som muligt, så man nemt kan vende tilbage til den og i bedste fald genbruge den. Det er svært at 100% genbruge kode på tværs af applikationer, især når det gælder de ydre lag - præsentationen og datalaget, for bare at holde os til 3-lags arkitektur. Spørg dig selv om hvor tit du laver en applikation der ligner den du lige lavede på en prik ? Det gør man jo nok aldrig :)

I samtlige af teknologierne ville det ikke være unormalt at have en struktur der minder om dette:

1. Databasen
2. UserDataClass (Create, Update, Delete, GetUser, GetAllUsers, etc) - datalag
3. UserBusinessClass (UserExists, FilterNames, etc) - forretningslag
4. FilterUser.asp - (HTML og forbinder kode mellem lag) - præsentationslag

Du kan hverken i ASP, PHP eller ASP.NET komme udenom at skulle have noget koder der ligsom "kickstarter" dine kald igennem lagene og på en eller anden måde "merge" det ind i markupen. Men der er stor forskel på hvordan du gør dette i ASP/PHP i forhold til ASP.NET.

Et glimrende eksempel på dette er (taget fra foraet):

Fold kodeboks ind/udKode 


Ovenstående kunne ligså have været ASP. Læg mærke til at i de første mange linier er PHP. Det er her du "kickstarter" det der ligger længere inde i din applikation. Der bliver bla. inkluderet nogle filer og instansieret et objekt af typen ProductDAO. Jeg kan sagtens huske hvordan disse filer så ud - markup mikset med kode overalt, og det er enormt svært at undgå dette, uanset hvordan man vender og drejer den.

Hvad nu hvis man ikke behøvede at inkludere dette "plumbing" kode toppen/midten/bunden af sine filer, men derimod havde et ekstra lag mellem præsentation og det faktuelle forretningslag ? På den måde kunne man stort set slippe for det miks af markup og kode som man så gerne vil væk fra. Det ville gøre det nemmere at holde sin markup mere eller mindre helt fri fra kode og på den måde gøre den nemmere at finde rundt i og stringent.

Det bedste af det hele er, at et kan sagtens lade gøre :)

I ASP.NET er der indbygget et koncept der hedder code-behind. Det er valg du kan tage når du opretter en .aspx fil i Visual Studio, og betyder altså om du vil have din markup og kode splittet op. Lad os se på hvad det betyder.

Vi har noget markup som vi plejer:

Fold kodeboks ind/udKode 


Det første du sikkert undre dig over er direktivet i toppen af siden. Noget af det direktivet gør her er at fortælle vores markup at den "afhænger" af klassen _Default og at kode filen hedder Default.aspx.cs. Vores kode fil er en C# (C Sharp) fil og det er netop denne der optræder som den tidligere omtalte code-behind fil.

Vores code-behind fil ser således ud:

Fold kodeboks ind/udKode 


Dette er en helt separat fil.

Ved compile time sker der det at vores code-behind fil bliver kompilteret til en assembly (dll) og dele af vores direktiv i toppen af vores .aspx side bliver ændret til at pege på denne kompilerede assembly istedet.

Når man ser siden i browseren er der fjernet et par ting fra den .aspx side vi ellers plejer at arbejde med i Visual Studio. Compileren fjerner runat="server" attributen fra vores 2 span tags og selvfølgelig fjerner den også side direktivet i toppen af filen, men ellers er alt ved sig selv. Faktisk tilføjer ASP.NET motoren også noget til vores side, men det er skjult for brugeren.

Uanset om du vælger ASP, PHP eller ASP.NET, så vil man aldrig kunne komme helt af med, at skulle have en eller flere variabeler liggende i sin markup, men derimod er der ingen tvivl om at det nemmere at skjule kode fra sin markup i nogle teknologier, deriblandt ASP.NET. Code-behind modellen er rigtig god og man kan ikke andet end at blive en smule afhængig af den. Den nemme implementation med code-behind i ASP.NET skyldes primært vi har med en event-drevet teknologi at gøre, og ikke bare fortolker som f.eks ASP. Derfor har vi også nemmere ved at abstrahere mange ting væk fra vores sider.

Husk at dette er indbygget direkte i ASP.NET, men du har selvfølgelig også valget med at lave din kode "inline" som vi f.eks kender det i standard ASP eller PHP.

Jeg har selv udviklet rigtig meget i ASP, men der er ingen tvivl om at du med ASP.NET, har et meget mere robust og veludviklet rammeværk hvor muligheden for at dele præsentation og kode op er langt bedre end f.eks ASP.

Jeg håber i fik noget ud af det :)


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (9)

User
Bruger #6559 @ 07.10.08 17:52
God artikel, men PHP er også serverside som ASP og ASP.NET :)
User
Bruger #2330 @ 07.10.08 22:25
Du nævner ASP, PHP og ASP.NET, men præsentere kun den reelle kode til det som artiklen handler om, i ASP.NET. Derudover syntes jeg at artiklen er meget kort, til et emne som MVC, og der kunne nemt være godt mere i dybden med ideen bag, hvilket jeg gerne havde set.
Til sidst, så passer niveauet ikke til artiklen - i en begynder artikel ville jeg som udgangspunktet have ventet at der var lavet løsningsforslag i alle de sprog som bliver nævnt, men istedet vises kun et forslag i ASP.NET, og det er oven i købet en sprogfeature som ikke umiddelbart findes i PHP og ASP(såvidt jeg ved). Desuden kunne du godt have forklaret yderligere om inddelingen af siden i komponenter, igen i forhold til artiklens niveau.
Ellers et godt emne du har valgt at skrive om, men desværre syntes jeg at artiklen mangler en del for at nå op på et niveau hvor den giver et rigtigt udbytte, så desværre kun en 2'er herfra.
User
Bruger #1151 @ 08.10.08 08:27
PHP er et scriptingsprog der KAN defineres som et programmeringssprog udfra de sammenhæng sproget indgår i.
User
Bruger #10647 @ 08.10.08 14:17
Dette er en fuldstændig manipulerende artikel. Jeg syntes måske du skulle have undersøgt de forskellige muligheder før du skriver en artikel der er så meget for ASP.NET frem for PHP. Til PHP findes der også frameworks (som ASP.NET jo er) som kan lette arbejdsgangen og fuldstændig eliminere det problem du omtaler der er med PHP og ASP, med at man blander markup og kode samme. Dette er en forkert påstand.

Jeg må desværre give dig 1 point da denne artikel både er mangelfuld, manipulerende og slet ikke egnet for nybegyndere da du ikke tager kritik af alle sprog med men kun af PHP og ASP (som jo allerede er så godt som et dødt sprog)
User
Bruger #2730 @ 09.10.08 08:28
Jeg synes for det første at det er et farligt emne at tage op!

Jeg synes også som det er nævnt tidligere at der er for meget vægt mod ASP.NET (selvom jeg selv er asp.net fan). Jeg synes ikke det vigtige kommer frem i artiklen. For mig at se er det vigtige hvordan man lagdeler sin kode (bemærk at dette ER uafhængigt af filer, om det hedder codebehind, eller man includer en .php fil - det er nøjagtigt det samme) hellere havde jeg set man grupperede sin funktionalitet alt efter hvilket lag de tilhørte (de lag du nævner i starten). Det man bør sikre sig er at man fra hvert enkelt lag kun kalder mod det lag der ligger direkte under det nuværende lag, således man lagdeler sin applikation. Dette er sprog uafhængigt og havde været en bedre indgangsvinkel - synes jeg.
User
Bruger #13543 @ 12.10.08 11:31
Tak for rigtig god feedback.

The-freak, der er da et eksempel i PHP også.

Emil, jeg er ikke tvivl om at der findes utallige frameworks til PHP der kan løse problemmet med opdelingen. Du nævner ASP.NET er et framework. Det er ikke helt rigtigt. Det er noget der ligger oven på et framework. Mener du ikke at PHP er et framework ?

Brian, god feedback som altid :). Jeg vil give dig ret i at lagopdeling er vigtigt og det kunne sagtens emnet til min næste artikel.
User
Bruger #2330 @ 12.10.08 12:25
Ja, Daniel, der er et eksempel i PHP, men det er et eksempel på problemet og ikke løsningen, hvilket jeg syntes er forkert - hvis man inddrager noget i et sprog som et eksempel på problemet, så løser man det ikke kun i et andet sprog, som det er gjort her.
User
Bruger #5789 @ 12.10.08 18:20
Syntes xml/xslt bestemt mangler, det er så vigtigt et led for at kunne præsentere sit data på forskellige enheder, og med forskellig technologi- uden noget arbejde.

Alle større CMS fungerer sådan, og det adskiller 100% frontend-arbejde med backend-arbejde - en perfekt skillelinie. Til sidst, men ikke mindst, 100% technologi- og platformsuafhængigt.

Jeg har også altid svoret til asp.net og dets controllere, men med xslt har man så meget mere fleksibilitet og kontrol over præsentation, at der er meget få ting man savner fra webcontrols'ene. Og netop derfor bygger de fleste store Asp.net CMS systemer på xml.

Så lige med hensyn til at splitte kode fra markup, er jeg overvidst om fordele i xml/xslt frem for tvungent markup fra .net - for ikke at nævne ajax.net.

Så fra DB til xml gennem webservice/webserver til transformering i xslt til forskellige enheder, som webbrowser, mobile browser, lokale storskærme, rss reader, mediarss, js filer, etc.

Desuden er xml rimeligt let at cache på forskellige måder og med forskellig cache parametre, og performance er i top.
User
Bruger #10647 @ 13.10.08 23:36
Hej Daniel,

Nej PHP er et sprog, men ASP.NET er et framework da du jo har et sprog der ligger under (F.eks. C# eller VB).

Derfor min kritik.
Du skal være logget ind for at skrive en kommentar.
t