ASP, PHP og ASP.NET - splitte logik fra præsentationen
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):
1. <?php
2. require_once('product.class.php');
3. require_once('productDAO.class.php');
4.
5. $productDAO = new ProductDAO();
6. $product = $productDAO->get($_GET['id']);
7.
8. // a lot of html etc here... cba :)
9.
10. ?>
11.
12. <table>
13. <tr>
14. <td><?php echo $product->getId(); ?></td>
15. <td><?php echo $product->getName(); ?></td>
16. <td><?php echo $product->getDescription(); ?></td>
17. </tr>
18. </table>
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:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div>
<span id="name" runat="server" />
<span id="email" runat="server" />
</div>
</div>
</form>
</body>
</html>
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:
using System;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
email.InnerText = "mail@domæne.doh";
name.InnerText = "daniel";
}
}
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