Designmönster i Javascript

Relevanta dokument
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Programutvecklingsprojekt Projektgrupp Elvin. Detailed Design Document

Imperativ programmering. Föreläsning 4

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Kursplanering Objektorienterad programmering

TUTORIAL: KLASSER & OBJEKT

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

E13 "Behind the Wild"

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Objektorienterad Programkonstruktion. Föreläsning jan 2016

<script src= "

tentaplugg.nu av studenter för studenter

Inledande programmering med C# (1DV402) Introduktion till C#

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Säkra Designmönster (Secure Design Patterns)

Cacheminne Intel Core i7

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

Introduktion till arv

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Classes och Interfaces, Objects och References, Initialization

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

INFORMATIK - MED SYSTEMVETENSKAPLIG INRIKTNING, GRK/A (1-30 HP)

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna.

Kort om klasser och objekt En introduktion till GUI-programmering i Java

729G06 Föreläsning 1 Objektorienterad programmering

Fördjupande uppsats i datalogi

Objektorienterad programmering Föreläsning 6. Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska metoder

Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det).

Objektorienterad programmering. Grundläggande begrepp

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

DAT043 - Föreläsning 7

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Gissa det hemliga talet

Styrteknik 7.5 hp distans: E-1000 och E-Designer

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Programmering B med Visual C

1 Klasser och objektorientering Vad är objektorientering?

1.1 Runnable och Thread

" «Observable» DataGenerator" betyder att klassen DataGenerator ärver från den abstrakta klassen Observable.

Föreläsning 15: Repetition DVGA02

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

Objektorientering: Lagring, räckvidd och livstid

Objektorientering: Lagring och livstid

E13 Behind the Wild. Dagens agenda. Cookies Context/ändra context Augmentation (förstärkning) Klassiskt arv Att låna metoder Namespaces Postludium

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objektorienterad programmering i Java I

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

Objektorienterad programmering

2.1 Installation of driver using Internet Installation of driver from disk... 3

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Design av en klass BankAccount som representerar ett bankkonto

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Metoder (funktioner) Murach s: kap Winstrand Development

INFORMATIK - MED SYSTEMVETENSKAPLIG INRIKTNING, GRK/A (1-30 HP)

Model View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

TDDD78 Objektorientering: Lagring och livstid

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

1. Enkel sökning Globalsökning Avancerad sökning Historik Söka via klassificeringsstruktur 14

Inkapsling (encapsulation)

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Beijer Electronics AB 2000, MA00336A,

Logging Module into the PRIME Core

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

Akronymer. CD5130 OOP, fk. Mjukvarumönster. Mjukvarumönster. Mjukvarumönster, forts. Mjukvarumönster, forts

SKOLFS. beslutade den XXX 2017.

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

Mjukvarudesign. Designprocessen. Teknisk design. Konceptuell design

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Grundläggande programmering med matematikdidaktisk inriktning för lärare som undervisar i gy eller komvux gy nivå, 7,5 hp

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

Kursplan. IK1004 Java - Grafiska användargränssnitt med Swing. 7,5 högskolepoäng, Grundnivå 1. Java - GUI Programming with Swing - Undergraduate Level

Webbplats med Zend Framework

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

TDDC77 Objektorienterad Programmering

Transkript:

C-uppsats i Datavetenskap Designmönster i Javascript Författare: Fredrik Johansson Handledare: Martin Blomberg Termin:VT11 Kurskod: 2DV40E

Abstrakt Programmeringsspråket Javascript har sina brister som till exempel ingen riktig struktur för Objektorienterad Programmering i jämförelse med andra språk. Detta är en frågeställning som skulle behöva en lösning. Kanske kan man använda ett eller flera designmönster för att lösa detta. I avsnittet Teori visas en kort genomgång på tänkbara designmönster som kan användas för att sedan välja ut maximalt tre av dessa och undersöka dess svagheter samt hur man kan förbättra det. Slutsatsen av rapporten är en övergripande Model-View-Controller där delarna kan ha olika designmönster som passar för den aktuella applikationen. Det designmönster som påminner mest om Objektorienterad Programmering som i andra språk är Revealing Module Pattern som är flexibel, enkel, har inkapsling och publika respektive privata variablar och funktioner. Abstract The programming language Javascript has it flaws, like for example no real structure for Objectoriented Programming compared to other languages. This is one of the questions that requires a solution. Perhaps it is possible to use one or several design patterns to solve this. In the section Theory a short summary will be shown with possible design patterns that could be used and then three of those or less will be chosen to be examined more closely to look for weaknesses and how to solve those. The conclusion of this report is an overall Model-View-Controller where each part can have a different design pattern that is most useful for the application. There is one design pattern that resembles Objectoriented Programming like in other languanges and that is called Revealing Module Pattern. This design pattern is flexible, simple, uses encapsulation but also has public and private variables and functions.

Innehållsförteckning 1. Introduktion...1 1.1 Inledning...1 1.2 Bakgrund...1 1.3 Problemställning...2 1.4 Syfte...2 1.5 Avgränsningar...2 2. Teori...3 2.1 Begrepp...3 2.2 Designmönster...4 2.2.1 Constructor Pattern...4 2.2.3 Singleton Pattern...5 2.2.4 Module Pattern...6 2.2.5 Revealing Module Pattern...7 2.2.6 Command Pattern...8 3. Metod...9 3.1 Revealing Module Pattern...9 3.2 Command Pattern...12 4. Resultat...15 4.1 Slutsats...15 4.2 Test av slutsats...16 5. Diskussion...21 6. Källförteckning...22 6.1 Litteratur...22 6.2 Webbsidor...22

1. Introduktion 1.1 Inledning Detta arbetet handlar om att undersöka och utvärdera vilket eller vilka designmönster som man kan använda i språket Javascript i relation till best practices i Objektorienterad Programmering. När man pratar om best practices finns det ett flertal vanliga områden man hänvisar till som exempelvis: inkapsling, arv, abstraktion, polymorfism, moduläritet, interface och klasser (codeproject.com). Men även området objekt för att lagra och hantera data är en viktig del. Eftersom Javascript inte har en inbyggd funktionalitet för flera av dessa områden kan man titta på designmönster för att lösa detta problem och därmed skapa best practices. Ett designmönster är en återanvändningsbar struktur för att lösa vanliga problem i mjukvara (wikipedia.org). Man kan dela upp designmönster i tre olika kategorier; creational, structual och behavorial. Varje kategori fokuserar på hur man kan lösa ett specifikt problem på bästa sätt. Den första ( creational ) behandlar hur man skapar objekt, kategorien structual fokuserar på hur man organiserar klasser och objekt. Den sista kategorin behavorial har sitt fokus på hur man ska behandla kommunikationen mellan klasser och objekt (addyosmani.com). För att skapa mer interaktivitet i en hemsida eller i en webbapplikation brukar man använda Javascript. Resultatet av att lägga till mer interaktivitet gör att hemsidan eller webbapplikationen uppför sig mer som en vanlig desktopapplikation. Dessutom finns det tekniker som bygger på Javascript som kan hämta extern information och visas på en specifik del i hemsidan eller webbapplikationen (AJAX - Asynchronous JavaScript and XML, wikipedia.org). Javascript började utvecklas i mitten av 1990-talet under namnet Mocha av företaget Netscape som senare blev LiveScript för att slutligen döpas till Javascript i December 1995. Kort därefter påbörjades arbetet att skapa en standard för detta nya programmeringsspråk som ett år senare blev godkänt under namnet ECMAscript (wikipedia.org). Sedan den första implementationen av Javascript i webbläsaren Netscape Navigator 2.0 (wikipedia.org) har språket utvecklats och nya webbläsare tillkommit men faktumet kvarstår att språket lider av sina svårigheter som andra mer objektorienterade språk inte har. 1.2 Bakgrund Tidigare har jag läst flera kurser om Javascript men jag har inte hittat eller använt något designmönster som jag tycker är smidigt och fungerar bra. Därför ville jag ta upp frågeställningen igen för att specifikt titta på designmönster och göra en utvärdering. 1

1.3 Problemställning Dessa frågeställningar togs fram: Vilket eller vilka designmönster passar bäst för Javascript? Vilket eller vilka designmönster visar på ett enkelt sätt hur applikationen är uppbyggd? Vilket eller vilka designmönster har den bästa strukturen att underhålla? Hur kan man skapa klasser och underklasser i respektive designmönster? Hur kan man skapa inkapsling av funktioner och variabler? 1.4 Syfte De metoder som kommer att användas för att inhämta kunskaper som svarar på problemställningen är via böcker samt sökningar på Internet. Efter att detta inledande steg är klart kommer sedan ett utvalt antal designmönster att undersökas närmare för att slutligen välja ett eller några beroende på resultat. 1.5 Avgränsningar Efter att en undersökning har gjorts med vilka designmönster som kan användas i Javascript kommer maximalt tre av dessa att väljas ut för att begränsa antalet. Vidare kommer ramverket JavascriptMVC att uteslutas som dels innehåller designmönstret Model-View-Controller och andra funktioner samt instick därför att detta ramverket har tidigare utvärderats med resultatet att det inte var tillräckligt bra. 2

2. Teori 2.1 Begrepp Funktion Antingen skapar man en funktion globalt eller i ett objekt som till exempel i en klass och har till syfte att utföra en viss uppgift. Global Detta är en variabel eller funktion som är tillgänglig hela tiden i funktionerna. Instans När man förbereder (skapar) ett objekt för användning kallas det nya objektet för en instans. Instansiering Då man skapar en instans av ett objekt kallas detta för instansiering vilket är själva processen att skapa kopian. Klass En klass är en samling funktioner och variabler som ska utföra en viss uppgift. Kontroller I designmönstret Model-View-Controller används en kontroller som tar hand om den övergripande styrningen i flödet. Det engelska namnet är controller vilket är vanligt att man använder. Namnrymd För att förhindra krockar vid namngivning av till exempel funktioner kan man samla objekt eller klasser i en namnrymd. På engelska heter detta namespace vilket är ett vanligt förekommande ord. Objekt En datastruktur som kan innehålla data eller andra funktioner men det kan även vara en klass. Detta är en viktig del i Objektorienterad Programmering. Objektorienterad Programmering Detta är ett programmeringssätt som betyder att man bygger en applikation med hjälp av klasser som objekt. Varje klass innehåller funktioner och variabler. Statisk Till skillnad från objekt är en statisk variabel eller objekt en datastruktur som inte är tänkt att ändras. Variabel För att underlätta vid programmering sparar man information som associeras till ett namn vilket kallas för en variabel. 3

2.2 Designmönster De designmönster som valdes ut för det första steget är en blandning av alla de kategorier som nämndes i avsnittet Inledning med ett undantag. Kategorien behavorial uteslöts därför att sådana designmönster blir lite mer komplexa att sätta sig in i om man inte redan kan det. Två exempel på dessa är Sandbox Pattern och Observer Pattern. 2.2.1 Constructor Pattern Då man instansierar ett objekt är det väldigt smidigt att skicka med och samtidigt spara information till objektet som skapas; för att använda ett sånt här programmeringssätt kan man använda sig av Constructor Pattern. I grunden är det bara en global funktion som man associerar information till för att skapa ett objekt. Figur 2.2.1.1; exempel Constructor pattern 4

Figur 2.2.1.2; resultat ifrån en webbläsare 2.2.3 Singleton Pattern En singleton är ett objekt som endast kan finnas i ett exemplar eller instans och kallas även för statiskt objekt. Denna strukturen har två användningsområden främst; dels genom att fungera som en hållare för olika namnrymder eller ett statiskt objekt som till exempel en samling hjälpfunktioner. Figur 2.2.3.1; exempel singleton pattern 5

2.2.4 Module Pattern Det här designmönstret skapades för att Javascript ska kunna ha privata och publika funktioner samt variabler som annars inte är möjligt (addyosmani.com). I dagsläget är det Objektorienterad Programmering som är praxis vilket kräver att språket man använder har möjligheterna att använda och skapa olika klasser. Det gör det även möjligt att återanvända kod samt att skapa lösa kopplingar mellan olika klasser för en enklare struktur och bättre möjligheter för underhållning av koden. Därför är designmönstret Module Pattern riktigt intressant. Figur 2.2.4.1; exempel module pattern 6

Figur 2.2.4.2; resultat ifrån en webbläsare 2.2.5 Revealing Module Pattern Det här mönstret är nästan samma som Module Pattern fast med en liten tvist; strukturen är lite enklare och lite mera lättläst. Dessutom har den fördelen att enkelt kunna ändra en funktion ifrån publik till privat och tvärtom. Figur 2.2.5.1; exempel revealing module pattern 7

2.2.6 Command Pattern Syftet med Command pattern är att samla ihop funktionsanropen till en klass i en enda funktion genom att skicka olika parametrar. Tanken med detta är att man ska separera koden som utfärdar ordern och klassen där den egentliga funktionen ligger (addyosmani.com). Figur 2.2.6.1; exempel command pattern Figur 2.2.6.2; resultat i en webbläsare 8

3. Metod För att komma fram till en slutsats med vilka eller vilket designmönster som skapar den bästa strukturen i Javascript undersöks de utvalda designmönstren utifrån dessa områden; klasser, underklasser och inkapsling. Genom att använda sig av underklasser får man flera fördelar som kodåteranvändning vilket minskar filstorlek och gör det även möjligt att bygga moduler. Dessutom behöver man titta på eventuella svagheter som ett designmönster har och vad man kan hitta för lösning på detta. 3.1 Revealing Module Pattern Detta mönstret är riktigt intressant därför att man kan skapa en smidig inkapsling och bestämma vad som ska vara privat respektive publikt. Men frågan är hur kan man använda en konstruktor på ett bra sätt. Figur 3.1.1; grunden i Revealing Module Pattern I figur 3.1.1 visas grundfunktionaliteten i detta designmönster som är en anonym funktion. För att klassen ska kunna användas kör man denna funktionen direkt med hjälp av parentestecken. Om man ska skicka in parametrar får man alltså göra detta inom de sista parenteserna. Figur 3.1.2; parametrar till konstruktor 9

Ett exempel på hur man skickar in information till en konstruktor visas i figur 3.1.2. Problemet med detta är att det blir lite svårläst vilket kräver att det behöver en annan lösning. Om man flyttar körningen av den anonyma funktionen med parametrar till konstruktorn skapar man kod som blir lättare att läsa samt att man skapar inget beroende där klassen finns. Detta betyder att man kan skapa en klass eller en modul som ligger i en extern fil och kan användas på en annan plats eftersom instansieringen av den klassen skapas där den används med eventuella parametrar till konstruktorn. Figur 3.1.3; körning av anonym funktion flyttad Som i figur 3.1.3 är nu körningen av den anonyma funktionen flyttad som skapar en lös koppling mellan klassen och där den används eller instansieras. Figur 3.1.4; resultat i en webbläsare med utflyttad körning av anonym funktion 10

För att maximera kodåteranvändning brukar man dela upp klasser i underklasser eller använda en klass och utöka denna med mer funktionalitet. Ett sätt som man vanligtvis löser detta med i Javascript är med så kallad Prototype Chain men eftersom designmönstret Revealing Module Pattern returnerar ett statiskt objekt som inte har denna funktionaliteten behövs en annan lösning. Eftersom varje funktion och objekt har en kedja som heter closure kan man använda detta för att skapa en typ av underklass till en annan klass. Detta fungerar genom att man skapar en ny instans av underklassen i huvudklassen och returnerar sedan underklassen som ett publikt objekt i huvudklassen. Givetvis förutsätter detta att både underklassen och huvudklassen använder designmönstret Revealing Module Pattern. Figur 3.1.5; exempel flera klasser med Reavealing Module Pattern 11

Figur 3.1.6; exempel flera klasser med Reavealing Module Pattern I figur 3.1.5 kan man se ett exempel på hur man kan använda underklasser i en huvudklass. Kodexemplet i figur 3.16 visar underklassen AnimalClass som har hand om namn medan huvudklassen Dino instansierar underklassen samt lägger till den nya funktionen roar för att sedan returnera hela underklassen samt den nya funktionen. Figur 3.1.7; resultat ifrån en webbläsare 3.2 Command Pattern En svaghet som detta designmönster har är hur man på ett smidigt sätt kan ha olika funktioner som tar in olika antal parametrar. Som exempel kan en funktion behöva en parameter medan en annan funktion behöver fem parametrar. För att lösa detta på ett bra sätt kan man ha en egenskap som heter arguments. Till egenskapen arguments kan man skicka ett objekt för att låta funktionen ta hand och även bestämma innehållet av objektet. Genom att skicka ett objekt skapar man flexibel kod där man kan skicka obegränsat antal parametrar som funktionen sedan använder. Ett alternativ till att skicka ett objekt är att skicka in en array. 12

Figur 3.2.1; användningsexempel parametrar i Command Pattern Figur 3.2.2; resultat i en webbläsare 13

Eftersom Command Pattern använder ett statiskt objekt kan man inte använda egenskapen prototype för att ärva ifrån underklasser men man kan lösa detta genom att skapa en initieringsfunktion där man instansierar underklassen. En viktig sak man måste bestämma i förväg är om underklassen ska användas mer än en gång; om detta är fallet kommer man stöta på problem ifall man använder Command Pattern även i underklassen. Anledningen för detta är att ett statiskt objekt bara är tänkt att användas en gång och lagrar man data flera gånger i samma variabel blir det överskrivet. För att lösa detta problem kan man istället välja ett annat designmönster för underklassen vilket gör det möjligt att spara informationen unikt utan några krockar. Figur 3.2.3; exempel initieringsfunktion i Command Pattern I figur 3.2.3 visas ett kodexempel där underklassen har designmönstret Revealing Module Pattern som gör det möjligt att användas mer än en gång och huvudklassen har Command Pattern. 14

4. Resultat 4.1 Slutsats Kan man kombinera flera olika designmönster för att på så sätt skapa en helhetsstruktur som löser frågorna i problemställningen och därmed även en struktur för best practices i relation till objektorienterad programmering. En idé vore att använda Model-View-Controller som en övergripande struktur för att sedan använda olika designmönster för att lösa specifika delar. Det designmönster som fungerar bäst som en klass är Revealing Module Pattern vilket även är ett bra val för underklasser. Därför kan man använda det designmönstret som Model och även till specifika objekt som applikationen kan behöva. För Controller finns det ett flertal olika designmönster som kan användas så här gäller det att man bestämmer vilka krav som ska finnas och utifrån det ta ett beslut vilket som passar bäst. Två exempel på detta är Command Pattern eller Singleton Pattern. Vill man använda flexibiliteten med publika och privata funktioner även i Controller kan man givetvis använda Revealing Module Pattern. Om det är en applikation som har sin tyngdpunkt i Javascript kan det vara lämpligt att låta Javascript ta hand om visningen av vyer vilket kräver ett bra system för att hantera detta. En smidig lösning vore att använda ett externt instick som löser det problemet. Figur 4.1.2; översikt av slutsatsen 15

4.2 Test av slutsats För att testa strukturen i slutsatsen valdes ett tidigare projekt i Javascript att skrivas om. Med denna applikationen kan man skapa post-it-notes och flytta runt dessa med hjälp av Javascript, dessutom sparas dessa i bakgrunden med AJAX som även detta bygger på Javascript. Andra funktioner är diverse inställningar som till exempel att ändra färg på en post-it. I det här testet kommer endast en del av applikationen att skrivas om för att kunna se och utvärdera strukturen. Ursprungligen användes ramverket JavascriptMVC i denna applikationen men sen upptäcktes att flertal problem med detta. Figur 4.2.1; figur över namnrymder och designmönster Först placerades alla objekt i olika namnrymder för att undvika krockar där den första nivån heter som applikationen; MyScribbles. Alla objekt som använder Revealing Module Pattern laddas in efter behov. Eftersom det instick för vy-hantering inte kunde användas direkt krävdes det lite implementation och därmed lades detta som ett eget objekt istället för att instansieras i varje Controller. 16

Figur 4.2.2; initiering av applikationen I figur 4.2.2 visas initieringen av applikationen där namnrymder påbörjas samt hämtning av de första Javascript-filerna. Dessutom kallas modellen User för att se om att namn finns och beroende på svar hämtas antingen Controllern Intro eller Main. Man kan även se funktionen loadscript som skapades för att hantera hämtning av Javascript-filer på ett korrekt sätt samt att ta hand om fel om det misslyckades. 17

Figur 4.2.3; objektet View med hjälpfunktioner I figur 4.2.3 användes privata funktioner för att maximera kodåteranvändning men det publika resultatet hade endast ett urval av funktioner enligt Revealing Module Pattern. 18

Figur 4.2.4; controllern Intro Här visas Controllern Intro som har en publik funktion samt två interna funktioner. Då en Controller körs används den publika funktionen run. 19

Man kan se att objektet View används för att förladda en vy som sedan hämtar huvudvyn för denna Controllern. Till sist kopplas en händelse som kör den privata funktionen submitname. Då användaren har tryckt på knappen i vyn och funktionen submitname körs sparas namnet med modellen User för att sedan hämta Controllern Main där huvudprogrammet fortsätter. Figur 4.2.5; modell User I figur 4.2.5 visas modellen User som har hand om lagring och hämtning av användarens namn. Här kan man se att samtliga funktioner som finns retuneras i det publika objektet. 20

5. Diskussion Det var ett intressant och nyttigt projekt att gå tillbaka till Javascript för att titta på hur man kan använda designmönster för bättre applikationsutveckling. Innan så kände jag att det var ett litet kunskapshål som fattades men nu har detta fyllts igen. Min slutsats att använda Model-View-Controller tillsammans med andra designmönster tycker jag blev ett väldigt bra resultat av flera anledningar. Tack vare designmönstret Revealing Module Pattern får man en flexibel struktur som dessutom är lättläst och går snabbt att sätta sig in i om man tidigare har jobbat med annan Objektorienterad Programmering. Jag anser att detta designmönster har två stora fördelar; enkelt att specifiera publika och privata funktioner samt enkelheten i att ändra mellan dessa. Genom denna flexibilitet blir det enklare vid kodoptimering då man skriver om och delar upp koden till nya funktioner samt klasser. En annan fördel är att det skapas en bra inkapsling som var en frågeställning som skulle lösas. Eftersom detta designmönster påminner mest om annan Objektorienterad Programmering blir det således lätt och enkelt att underhålla. Givetvis kan man anpassa appliceringen av Revealing Module Pattern så att det stämmer in på den kodstil som man föredrar. En tanke är att i de privata funktionerna innuti en klass skulle man kunna dela upp koden i prototypefunktioner om det är ett objekt som instansieras flera gånger för att öka kodåteranvändning. Om man skulle bygga något ramverk eller ett API (Application Programming Interface) där Javascript bara är en mindre del så har Revealing Module Pattern väldigt stora fördelar just därför att man kan specificera vad som ska vara publikt som sedan slututvecklaren har tillgång till. I fortsättningen kommer jag att ha med mig de lärdomar som jag fått till mig i detta projektet med designmönstret Revealing Module Pattern där det är fördelaktigt att använda. 21

6. Källförteckning 6.1 Litteratur Harmes, R och Diaz, D (2008) Pro Javascript Design Patterns, Apress Stefanov, S (2010) Javascript Patterns, O'Reilly 6.2 Webbsidor http://en.wikipedia.org/wiki/api [2011-05-19] http://sv.wikipedia.org/wiki/ajax [2011-05-19] http://www.codeproject.com/kb/architecture/betteroop.aspx [2011-05-19] http://en.wikipedia.org/wiki/ecmascript [2011-04-27] http://en.wikipedia.org/wiki/javascript [2011-04-27] http://en.wikipedia.org/wiki/design_pattern_(computer_science ) [2011-04-27] http://addyosmani.com/resources/essentialjsdesignpatterns/book/ [2011-04-15] http://elegantcode.com/2011/02/15/basic-javascript-part-10-the-module-pattern/ [2011-04-15] 22

351 95 Växjö / 391 82 Kalmar Tel 0772-28 80 00 dfm@lnu.se Lnu.se/dfm 23