1. Definition av skikt
Vi gör följande definition:
- Skikt: Ett skikt är en grov indelning av en applikation på fysisk nivå, ofta med avseende på distribution. Skiktens komponenter kommunicerar med komponenter inom skiktet och med komponenter i närliggande skikt. Ett skikt ansvarar för en grupp av funktioner.
På SUNs webbplats visas följande bild som beskriver de 3 skikten i en typisk applikation:
Skikten i bilden ovan är:
- Klientskiktet: Klienten kan vara en fristående klient (troligtvis byggd i Java Swing) eller webbläsare.
- Mittenskiktet: Här utförs alla beräkningar.
- Dataskiktet: Detta skikt innehåller data, som kan hämtas från ett filsystem, en databas eller något annat informationssystem.
I det allmänna fallet körs programvaran i de tre skikten på olika maskiner (distribuerad applikation).
- MVC: De tre skikten uppfyller MVC-mönstret (Model View Controller), där klientskiktet är "view", mittenskiktet är "controller" och dataskiktet är "model".
I J2EE delar man ofta mittenskiktet till två skikt:
- Webbskiktet: Innefattar all Javakod som kör i webb-behållaren.
- EJB-skiktet: Innefattar all Javakod som kör i EJB-behållaren.
Webbskiktet och EJB-skiktet är i J2EE fysiskt separerade i egna behållare som även kan köras på olika maskiner. Anledningen till denna ytterligare uppdelning är att skaparna av J2EE-ramverket vill få en klar rollfördelning mellan webbutvecklare och utvecklare av affärslogik.
2. Definition av lager
Vi gör följande definition:
- Lager: Ett lager i en applikation är en uppdelning på funktion, där de delar av programvaran som har liknande funktion hamnar i samma lager. Ett lager är alltså som ett skikt, men vi behöver inte ha en en fysisk separation mellan lagren. Ett skikt kan innehålla ett eller flera lager. Vi använder i fortsättningen termen lager för både skikt och lager, eftersom skikten är en delmängd av lagren. Poängen med ett lager är att det endast får anropa metoder inom det egna lagret eller metoder hos det underliggande lagret.
Att ett skikt kan innehålla ett eller flera lager innebär alltså att de skikt vi har i applikationen är det antal lager vi får "automatiskt". Utöver dessa "automatiska" lager kan vi godtyckligt definiera extra lager efter behov. Det är t.ex. vanligt att koden inuti EJB-skiktet delas i flera lager, t.ex. ett lager för affärslogik och ett DAO-lager (som har till uppgift att kommunicera med databasen). Se bilden nedan:
3. Fördelar med lager
Idén med ett lager är att kod i ett lager endast har rätt att anropa:
- Kod i det egna lagret.
- Kod det lager närmast under sig själv.
Fördelarna med att använda lager är:
- Flexibilitet: Vi får ökad flexibiliteten hos applikationen. Vi kan nu byta ut komponenter i ett lager utan att det påverkar någon annan kod än den i lagret direkt ovanför.
- Lägre komplexitet: Det blir lättare att hitta i koden, eftersom lagren är hanterar olika funktionalitet.
- Produktivitet (Samarbete mellan programmerare): Vi får ett effektivt samarbete mellan programmerarna i projektet eftersom lagren ger en eklare ansvarsfördelning. Vi låter programmerarna ansvara för ett eller flera av applikationens lager.
- Produktivitet (Resursutnyttjande av enskild programmerare): Ofta används olika tekniker i de olika skikten/lagren. Vi kan öka produktiviteten om en programmerare med teknisk specialkompetens bara behöver arbeta inom det lager/skikt han hon behärskar bäst.
4. Problem med lager
Lager inför följande problem:
- Sämre prestnada: Vi får sämre prestanda för varje extra lager som införs. En större mängd klasser och metodanrop försämrar prestandan, speciellt om metodanropen går över nätverket.
- Lägre produktivitet: Applikationen tar längre tid att programmera för varje lager som införs, vilket ökar konstnaden.
Den andra punkten (lägre produktivitet) behöver inte gälla då vi har många programmerare, eftersom lagren samtidigt förenklar samarbetet. Om en programmerare däremot bygger applikationen ensam måste programmeraren ändå befatta sig med alla delar av applikationen, han/hom kommer då att slutföra arbetet snabbare med färre lager. kommer vi få en lägre produktivtet.
5. Slutsats
Om och hur många lager som ska anvädas handlar ofta om hur många programmerare som är inblandade i projektet och projektets storlek. Stora projekt drar mest nytta av att använda lager.