Hirviö. Design Patterns



Samankaltaiset tiedostot
Hirviö. Design Patterns

T SEPA - päiväkirja: Design Patterns. ETL työkalu

T SEPA - päiväkirja: Design Patterns. ETL työkalu

SEPA - Design Patterns

Ohjelmistotekniikan menetelmät, suunnittelumalleja

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

T Henkilökohtainen harjoitus: FASTAXON

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Muusta kuin vesisioista

<e.g. must, essential, conditional>

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Hirviö Vertaistestausraportti

Graafinen käyttöliittymä, osa 1

Ohjelmistotuotanto. Luento

Graafisen käyttöliittymän ohjelmointi Syksy 2013

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Oliosuunnittelu. Oliosuunnittelu

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

XPages käyttö ja edut Jarkko Pietikäinen toimitusjohtaja, Netwell Oy

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Testivetoinen ohjelmistokehitys


Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmoinnin jatkokurssi, kurssikoe

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Kehitysohje. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

Rakennusten elinkaarimittareiden verkkotyökalun käyttöohje.

Web Services tietokantaohjelmoinnin perusteet

Suunnittelumallien käyttö ohjelmistosuunnittelussa

Ohjelmoinnin perusteet Y Python

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Osio 4: Graafinen käyttöliittymä

Ohjelmistoarkkitehtuurit. Syksy 2008

Suunnittelumalleja, MVC. Juha Järvensivu 2008

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Ohjelmistoarkkitehtuurit. Kevät

1 Tehtävän kuvaus ja analysointi

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat


TIE Ohjelmistojen suunnittelu

SEPA päiväkirja. Aihe: Suunnittelumallit Tekijät: Tuukka Laakso ja Antti Kettunen

TIE Ohjelmistojen suunnittelu

1. Olio-ohjelmointi 1.1

Kehyspohjainen ohjelmistokehitys

Projektisuunnitelma. Projektin tavoitteet

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Ohjelmistojen mallintaminen. Luento 11, 7.12.

SEPA diary. Dokumentti: SEPA_diary_PK_HS.doc Päiväys: Projekti: AgileElephant Versio: V0.3

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

Mikä yhteyssuhde on?

12. Kehysarkkitehtuurit

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Muutamia peruskäsitteitä

Sovellusarkkitehtuurit

Ohjelmistokehykset ohjelmistorunkoja uudelleenkäyttö olioperustaisista ohjelmistorunko

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Perusarkkitehtuurin ja vuorovaikutuksen mallintamisen perusteita.

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

INTINU13A6 Java sovellukset

2. Olio-ohjelmoinista lyhyesti 2.1

XHTML - harjoitus. Tehtävä1: Tee xhtml tiedosto käyttäen notepad (muistio) ohjelmaa. Tiedoston tallennus notepad (muistio) ohjelmassa:

Bomgar etähuoltoohjelmisto

Tietorakenteet, laskuharjoitus 7,

Ohjelmistoarkkitehtuurit. Syksy 2007

Tarjolla tänää: Ohjelmiston toteutuksesta. Kuinka tulla hyväksi ohjelmoijaksi? CRC-kortit. Testilähtöinen kehittäminen JOT2007. Uudelleenrakentaminen

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Määrittelydokumentti NJC2. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

7 Viestipohjaisten yritysjärjestelmien suunnittelumallit

Tietokannat II -kurssin harjoitustyö

T Ohjelmistojen määrittely- ja suunnittelumenetelmät Harjoitustyöraportti TNT - Tarkistetaan Ne Tentit Arkkitehtuuri- ja suunnittelumalli

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

P e d a c o d e ohjelmointikoulutus verkossa

Verkkosivut perinteisesti. Tanja Välisalo

Javan perusteita. Janne Käki

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

VisualStudio Pikaopas, osa 1: WEB sivujen suunnittelu

Viestinvälitysarkkitehtuurit Lähtökohta:

T Tietojenkäsittelyopin ohjelmatyö Hirviöryhmä loppukatselmointi. Hirviö. Projektikatselmointi

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Viestinvälitysarkkitehtuurit

Järjestelmäarkkitehtuuri (TK081702) Hajautettu tietokanta. Hajautuksen hyötyjä

SEPA päiväkirja. Aihe: Suunnittelumallit Tekijät: Tuukka Laakso ja Antti Kettunen Ryhmä: Neptune T Ohjelmistoprojekti I

Sunnittelumallit Harjoitustehtävät syksy 2015 / Simo Silander

Palveluperustaiset arkkitehtuurityylit

Hirviö Tekninen spesifikaatio

Transkriptio:

Hirviö SEPA-päiväkirja Design Patterns Anssi Kalliolahti Liia Sarjakoski 15. maaliskuuta 2005 1

Sisältö 1 Johdanto 3 2 Menetelmän käytäntöön soveltaminen 3 3 Kokemuksia ja muutoksia 3 3.1 PP.......................................... 3 3.2 I1........................................... 4 3.2.1 Model View Controller........................... 4 3.2.2 Command.................................. 4 3.2.3 Chain of Responsibility.......................... 4 3.2.4 Visitor.................................... 4 3.2.5 Singleton / Factory............................. 5 3.2.6 Composite.................................. 5 3.2.7 Strategy................................... 5 3.2.8 Decorator.................................. 5 3.3 I2........................................... 5 3.4 Viimeistely ja toimitus............................... 6 4 Analyysi 6 4.1 Model View Controller............................... 6 4.2 Command...................................... 6 4.3 Chain of Responsibility.............................. 7 4.4 Visitor........................................ 7 4.5 Singleton / Factory................................. 8 4.6 Composite...................................... 8 4.7 Strategy....................................... 8 4.8 Decorator...................................... 8 5 Yhteenveto 8 2

1 Johdanto Tämä dokumentti on suunnittelumallien (Design Patterns) käytöstä kertova SEPA-päiväkirja, jonka tarkoituksena on esitellä, kuinka kirjoittajat ovat käyttäneet suunnittelumalleja Hirviöprojektissa. Suunnittelumallit ovat dokumentoituja ja toimiviksi todettuja ratkaisuja yleisiin suunnitteluongelmiin olio-ohjelmoinnissa. Toisin sanottuna suunnittelumallit ovat uudelleenkäytettävän suunnittelun rakennuspalikoita. Järjestelmäarkkitehti Liia Sarjakoski valitsi SEPA-aiheekseen suunnittelumallit, sillä hän oletti niiden olevan hyödyllisiä järjestelmän arkkitehtuurin suunnittelussa ja oli aikonut muutenkin tutkia niitä tarkemmin. Myös Anssi Kalliolahti on mukana Hirviön arkkitehtuurin suunnittelussa ja kokee suunnittelumallit hyödyllisiksi ja mielenkiintoisiksi. Tärkeimpänä lähteenä suunnittelumallien soveltamiseen on käytetty teosta Design Patterns: elements of reusable object-oriented software / Erich Gamma et al. Tämä teos on suunnittelumallien raamattu, katalogi, jota käytetään lähteenä useissa muissa suunnittelumalleja käsittelevissä teoksissa ja artikkeleissa. 2 Menetelmän käytäntöön soveltaminen Suunnittelumalleja käytetään Hirviön arkkitehtuurin suunnittelussa siten, että suunnittelun aikana mietitään valmiiden suunnittelumallien soveltuvuutta käsillä oleviin ongelmiin sen sijaan, että yritettäisiin keksiä kaikkiin ongelmiin ratkaisut itse. Suunnittelumalleja käytetään soveltuvilta osin, eikä arkkitehtuuria yritetä väkisin pakottaa suunnittelumallin mukaiseksi. Hirviö on jaoteltu osiin, joiden sisäinen kohensio on suuri. Nämä ovat järjestelmän moduleita (AAA, DataManagement, GUI ja sovelluslogiikka). Järjestelmä halutaan toteuttaa siten että moduleiden väliset sidokset ovat järkeviä, ja toisaalta itse moduleiden rakenteen tulee olla laajennuskelpoinen. Näiden ehtojen toteuttamiseksi tutkitaan rakenteellisia suunnittelumalleja, joiden toivotaan auttavan sekä kokonaisarkkitehtuurin että modulien sisäisen rakenteen suunnitellussa. Hirviö on sovellus, joka koostuu selkeästi HTML-käyttöliittymästä, tietokannasta ja sovelluslogiikasta. Arkkitehtuurisuunnitelijoilla on tarkoitus hyödyntää Hirviössä Model-View- Controller suunnittelumallia, jolla on ensisijaisesti tarkoitus eriyttää näkymä varsinaisesta sovelluslogiikasta. Tämä on tärkeää, koska perinteistä käyttöliittymäkoodin (XHTML) ja sovelluskoodin (PHP) sekoitusta on hankala lukea, se on heikosti ylläpidettävää ja virhealtista. Jotta MVC-mallin mukainen arkkitehtuuri olisi mahdollinen, on suunniteltava tätä tukeva alusta. Tämän suunnittelussa käytetään apuna sisäiseen käyttäytymiseen keskittyviä malleja (behavioral patterns) ja rakentamiseen keskittyviä malleja (creational patterns). Suunnittelumalleja käytetään ensisijaisesti iteraation I1 alussa, sillä järjestelmän perusarkkitehtuuri suunnitellaan silloin. Suunnittelumalleja pyritään soveltamaan myös iteraation I2 alussa arkkitehtuuriin tulevien tarkennusten osalta. On kuitenkin todennäköistä, että suunnittelumallien merkitys silloin on jo varsin pieni, ja suunnittelu keskittyy enemmän järjestelmän yksityiskohtiin. 3 Kokemuksia ja muutoksia 3.1 PP Suunnittelumalleja ei käytetty PP-iteraation aikana. 3

3.2 I1 Iteraation I1 aikana suunnittelumalleja käytettiin arkkitehtuurisuunnittelun apuna. Arkkitehtuurissa voitiin useissa kohdissa hyödyntää valmiita suunnittelumalleja ja toisaalta osan tehdyistä ratkaisuista huomattiin toteuttavan jo jonkin suunnittelumallin perusajatuksen. Suunnittelumalleihin liittyviä UML-kaavioita löytyy Hirviön teknisestä spesifikaatiosta. 3.2.1 Model View Controller Model-View-Controller -mallissa eriytetään näkymä, malli ja kontrolli. Hirviössä tämä toteutetaan siten että sovelluslogiikka toimii kontrollina, joka ottaa vastaan näkymältä saatuja käyttäjän aiheuttamia tapahtumia. Tapahtuman saatuaan Hirviö voi hakea, päivittää tai muokata mallia, joka käsittää tietokannan, sen käsittelyyn tarkoitetut luokat sekä muut väliaikaisdatan säilytykseen tarkoitetut luokat. Vastoin perinteistä MVC-mallia, Hirviössä näkymä ei suoraan hae muutoksia mallilta, vaan kontrolli välittää mahdolliset muutokset mallilta näkymälle. Tämä johtuu osittain siitä, että mallin ja näkymän välille ei haluttu suoria sidoksia, ja toisaalta siitä, että käyttöliittymän XHTML- ja PHP-kielien sekoitus haluttiin minimoida. 3.2.2 Command Hirviössä käytetään tapahtumapohjaista WWW-käyttöliittymää. Tämä on toteutettu yksinkertaisesti siten, että jokainen sovelluksen toimia vaativa input-elementti (linkit ja painikkeet) saavat automaattisesti generoidun uniikin ja satunnaisen tunnisteen, jota käytetään varsinaisessa käyttäjän selaimelle välitettävässä XHTML-sivussa. Sivun luontivaiheessa näitä uniikkeja tunnisteita vastaamaan luodaan tapahtumia, jotka enkapsuloidaan luokkaan Event, ja säilötään odottamaan käyttäjän toimia. Tälläinen toiminnon, tai komennon säilöminen luokkaan toteuttaa Command-suunnittelumallin. 3.2.3 Chain of Responsibility Jotta tapahtumilla olisi jokin merkitys on ne käsiteltävä. Kun käyttäjä painaa linkkiä tai painiketta, lähettää hän käytännössä palvelimelle vastaavan tapahtuman tunnisteen joko HTTP:n POST- tai GET-muuttujassa. Tämän tunnisteen perusteella säilötty tapahtuma voidaan ottaa käsiteltäväksi. Tätä varten järjestelmä tarjoaa abstraktin luokan, joka toimii tapahtumakuuntelijana. Tapahtumakuuntelijat voivat sisältää muita tapahtumakuuntelijoita, jolloin niistä muodostuu käytännössä puu. Lähetettävä tapahtuma ei tiedä suoraan mikä tapahtumankäsittelijä sen hoitaa, vaan se lähetetään etenemään puun juuresta, jolloin tapahtuma läpikäy kaikki tietyn haaran tapahtumakäsittelijät, kunnes se käsitellään. Tällainen käsittelijöiden ketjuttaminen toteuttaa Chain of Responsibility -suunnittelumallin. 3.2.4 Visitor Linkki- ja painike-elementtien lisäksi on XHTML:ssä tarjolla erilaisia syötteenantomahdollisuuksia kuten tekstikentät, checkboxit ja pudotusvalikot. Näiden käsittely ei aiheuta tapahtumia, mutta niiden sisältöön halutaan päästä käsiksi, ja niitä pitää pystyä päivittämään. Hirviössä tällaisten komponenttien käyttö on toteutettu siten, että niissä näkyvä data syötetään suoraan niitä esittäviin olioihin, ja vastaavasti käyttäjän antama syöte halutaan lukea suoraan niitä esittävistä olioista. Linkkien ja nappien tapaan jokainen syöte-elementti saa uniikin tunnisteen, joka välitetään käyttäjälle XHTML-sivussa. Kun käyttäjä operoi syöte-elementeillä, niihin syötetty data toimitetaan pavelimelle HTTP:n POST-muuttujissa, jotka on nimetty annetulla tunnisteella. 4

Jotta syöte saadaan takaisin haluttuihin olioihin, on niihin lisätty joukko visitor -metodeja joilla dataa voidaan operoida. Kun elementti luodaan ruudulle, se kutsuu alustan syötteenhallintaoliota saadakseen uniikin tunnisteen. Kutsuessaan tätä olioita, jokainen inputelementti antaa syötteenhallintaoliolle viittauksen itseensä, jolloin syötteenhallintaolio voi tätä viittausta ja visitor -metodeja hyväksikäyttäen operoida elementin datalla. 3.2.5 Singleton / Factory Jotta kaikkien syöte-elementtien tunnisteet olisivat yksilöllisiä ja niitä voitaisiin järkevästi hallita, tarvitaan keskitetty palvelu. Koska tämä keskitetty palvelu sijaitsee abstraktisti ajateltuna puun juuressa ja palvelua käyttävät elementit lehdissä, ei viittausta palveluun haluta välittää läpi puun haarojen. Hirviössä tämä palvelu toteutetaan staattisena luokkana, jonka ainoaa suorituksenaikaista instanssia voi käsitellä luokan staattisten metodien välityksellä. Luokan konstruktorista on tehty privaatti, jolloin sitä ei voida luoda, vaan luokka luo itse ainoan instanninsa, kun sen staattisia metodeja ensi kerran kutsutaan. Tällainen yhden instanssin luokka toteuttaa Singleton-suunnittelumallin. Tämä palvelu toimii samalla myös luokkana, joka luo jokaista toiminnon aiheuttavaa syöteelementtiä vastaavan tapahtumaolion, ja säilöö sitä niin pitkään kuin elementti on olemassa (kahden sivupyynnön välisen ajan). Tällainen toisia olioita tuottava luokka toteuttaa suunnittelumallin Factory. 3.2.6 Composite Hirviön käyttöliittymä on luonteeltaan sellainen, josta löytyy paljon uudelleenkäytettäviä elementtejä, kuten esimerkikis päävalikko. Näistä elementeista luodaan omia luokkia, joita voi yhdistellä. Hirviön käyttöliittymä koostuukin sisäkkäisistä elementeistä, joista muodostuu puumainen rakenne. Puussa olevia elementtejä voidaan hallita tarvittaessa isäelementtiensä avulla. Tälläinen yhdistely toteuttaa Composite-suunnittelumallin. 3.2.7 Strategy Strategy-mallia on käytetty mahdollistamaan erilaisten todennusmenetelmien ja tietokantojen käyttö järjestelmässä. Eri todennusmenetelmillä on yhteinen rajapinta siten, että mitä tahansa menetelmää voidaa käyttää sen kautta. Eri todennusmenetelmät ovat siis vaihdettavissa keskenään. Käytettävä menetelmä valitaan käyttäjän asetuksien mukaan. Järjestelmä voi käyttää myös erilaisia SQL-tietokantaohjelmistoja vastaavalla menettelyllä, mutta luonnollisesti vain yhtä kerrallaan ja vain niin kauan kuin SQL-lauseet tuottavat kaikilla tietokannoilla saman lopputuloksen. Ratkaisu eroaa puhtaasta Strategy-mallista siten, että Context käyttämisen lisäksi myös luo tarvitsemansa Strategyn. Context ja Strategy ovat Strategy-mallin käsitteitä. 3.2.8 Decorator Decorator on suunnittelumalli, jolla täydennetään jo olemassaolevaa luokkaa. Hirviössä tietokantayhteydet hoidetaan DatabaseConnection -rajapinnan toteuttavien luokkien avulla. Sovelluslogiikan tasolla ei kuitenkaan haluta käyttää suoraan SQL:ää, joten DatabaseConnection -luokkaa luodaan täydentämään DataManager-luokka, joka abstraktoi SQL:n pois sovelluslogiikan näkyvistä. 3.3 I2 Suunnittelumalleja ei käytetty I2-iteraation aikana. 5

Järjestelmän arkkitehtuuri suunniteltiin kokonaisuudessaan iteraation I1-aikana. Iteraatiolla I2 arkkitehtuuriin ei tehty mitään muutoksia, jolloin myös käytetyt suunnittelumallit pysyivät muuttumattomina. Kierroksen aikana oli tarkoitus implementoida varsinainen sovellus, käyttäen hyväksi kierroksella I1 valittuja ratkaisuja. Näiden ratkaisujen soveltuvuus havaittiin hyväksi, eikä alustaan kaivattu mitään muutoksia. SEPA-pari on tyytyväinen tekemiinsä valintoihin. Käytettyjen suunnittelumallien soveltuvuutta pyritään tarkemmin analysoimaan vasta viimeisellä iteraatiolla, jolloin sovellus on valmis, sekä kaikki mahdolliset kokemukset (tämän projektin puitteissa) ovat käytössä. 3.4 Viimeistely ja toimitus Suunnittelumalleja ei käytetty FD-iteraation aikana. Käytettyjen suunnittelumallien soveltuvuutta on analysoitu seuraavassa kappaleessa 4 Analyysi Alla on arvoitu käytettyjen mallien soveltuvuutta sovelluksen valmistuttua. Suunnittelumallien varsinainen käyttö on esitetty kappaleessa 3.2. 4.1 Model View Controller PHP ei sellaisenaan pakota sovelluksia mihinkään tiettyyn malliin, eikä sille ole mitään vakiintunutta kirjastoa / runkoa, jota käyttäen sovelluksia voisi toteuttaa. Tämä antaa toteuttajalle vapaat kädet luoda mieleisensä runkoarkkitehtuurin. Ryhmän koon, sekä iteratiivisen toteutuksen vuoksi yhtenäinen tapa toteuttaa ja lisätä toiminnallisuutta kuitenkin nähtiin välttämättömyytenä. Arkkitehtuurin suunnittelussa pyörää ei haluttu lähteä keksimään uudelleen, vaan lähtökohdaksi otettiin tapahtumapohjainen MVCmalli, jollainen esimerkiksi Javan Swing on. MVC-malli oli ehkä kaikkein tärkein käytetyistä suunnittelumalleista. Yksittäisten komponettien luonti käyttäen tätä arkkitehtuuria oli perinteistä HTML:n skriptailua hitaampaa, mutta kokonaisuudessa sen edut olivat huomattavasti tätä haittaa suuremmat. Malli mahdollisti useiden käyttöliittymäkomponenttien ja käyttöliittymäkokonaisuuksien uudelleenkäytön sovelluksen eri osissa (nopeuttaen kehitystä kokonaisuudessaan). Ehkä kaikkein tärkeimpänä, se helpotti toiminnallisuuden lisäämistä iteratiivisesti, sekä teki siitä huomattavasti vähemmän virhealttiimpaa. (Vertailukohteena on käytetty muita vastaavanlaisia, mutta perinteisin tavoin tehtyjä työ- ja kouluprojekteja). Sovelluksen rungon arkkitehtuuri noudatti siis MVC-mallia. PHP ei kuitenkaan tarjonnut suoraan mahdollistuutta toteuttaa sovellusta käyttäen tätä suunnittelumallia, joten ensin oli luotava tämän mahdollistava runko. Rungon oli hoidettava tapahtumien käsittely, sekä samalla piiloitettava sovellustason ohjelmoijilta kaikki heille tarpeeton toiminnallisuus. Loput käytetyistä suunnittelumalleista mahdollistivat tämän. 4.2 Command Tämä oli erittain käyttökelpoinen ratkaisu. Alla on esimerkkinä yksittäisen linkin luominen, sekä tälle määriteltävä tapahtumankäsittelijä, jota runko kutsuu sovellusohjelmoijalle näkymättömästi kun linkkiä on painettu. Sovellusohjelmoija luo linkin ja määrittelee kutsuttavan käsittelijän nimen: 6

$do_something_link = new Link( DoSomethingPressed, Press this to do foo ); Sekä määrittelee varsinaisen tapahtumakäsittelijän sovelluslogiikkaluokkaan: public function ondosomethingpressed(event $event) { } dofoo(); dobar(); Malli mahdollisti käyttäjän syötteen keskitetyn käsittelyn. Tämä oli eräs eniten sovellusohjelmoijiin vaikuttaneista suunnittelumalleista, palaute ohjelmoijilta oli myönteinen. 4.3 Chain of Responsibility Tämän mallin tarkoituksena oli mahdollistaa tapahtumia kuuntelevien olioiden ketjutus puuksi siten, että sovelluslogiikka olisi voitu pilkkoa useisiin osiin. Kaikki sovelluslogiikka kuitenkin keskittyi yksittäiseen luokkaan, jolloin tätä mahdollisuutta ei hyödynnetty. Jälkeenpäin kuinenkin huomattiin, että logiikka olisi ollut järkevää pilkkoa useampiin oliohin (jo päivityskonfliktien estämiseksi), mutta tässä vaiheessa koodia oli jo niin paljon, ettei sitä enää jälkikäteen tehty ongelmien välttämiseksi (tai refaktoroitu vastaavan SEPA-parin toimesta). 4.4 Visitor Erilaisten syöte-elementtien (tekstikenttien ja valikoiden) haluttiin toimivan mahdollisimman samankaltaisesti kuin muissa vastaavissa toteutuksissa (esimerkiksi Java Swing). Tavoitteena oli toteuttaa sellaisia syöte-elementtejä, joihin käyttäjän antama syöte siirrettiin sovellusohjelmoijalta näkymättömästi seuraavan sivulatauksen yhteydessä. Käytännössä tämä tarkoitti sovellusohjelmoijan kannalta sitä, että esimerkiksi tallennusnappia vastaavassa tapahtumakäsittelijässä ohjelmoija pystyi lukemaan käyttäjän antaman syötteen suoraan inputelementtiä kuvaavasta olioista: $search_field = new FormTextField(); Ja tallennuksen jälkeisessä tapahtumakäsittelijässä käyttäjän syöttämään arvoon päästiin käsiksi seuraavasti: $search_field->getvalue(); Tällä suunnittelumallilla toteutettu toiminnallisuus oli myös sovellusohjelmoijille näkyvä. Ohjeilmoijien palaute tästä oli myönteinen. 7

4.5 Singleton / Factory Tämän suunnittelumallin mukaisesti toteutettiin tapahtumien käsittelyn ydin (InputProcessor, joka ei ole sovellustasolla näkyvissä). Ratkaisu osoittautui toimivaksi ja sitä ei ollut tarve muttaa jälkikäteen. 4.6 Composite Käyttöliittymäoliot luotiin composite-mallia hyödyntäen. Mallin käyttö mahdollisti yksittäisten komponenttien, ja jopa suurempien kokonaisuuksien uusiokäytön eri sovelluksen osissa. Hyvä ratkaisu, joka omalta osaltaan vähensi työtä loppuvaiheessa. 4.7 Strategy Tämän suunnittelumallin tarkoituksena on mahdollistaa sovelluksen helppo siirrettävyys tietokantaympäristöstä toiseen (esimerkiksi PostgreSQL:stä MySQL:ään), sekä mahdollistaa useiden erilaisten autentikontimenetelmien käytön, siten että vaaditut muutokset keskittyisivät yksittäiseen sovelluksen osaan (ei varsinaiseen sovelluslogiikkaan). Projektin aikana sovellukseen ei kuitenkaan luotu kuin yksi autentikointimenetelmä sekä yksi kantayhteys (PostgreSQL), joten mallin toimivuuden toteaminen jää mahdollisille jatkokehittäjille. 4.8 Decorator Tätä suunnittelumallia käyttäen saatiin abstraktoitua sovellusohjelmoijilta tietty monimutkaisuus pois. Mallin hyödyntäminen keskittyi käytännössä tietokannan käsittelyyn: PostgreSQLConnection on varsinainen tietokantayhteysluokka, joka toteuttaa DatabaseConnectionrajapinnan. Tälle rajapinnalle on kuitenkin syötettävä SQL-lauseita, jotta niitä voi käyttää. Varsinaiseen sovelluslogiikkaan ei kuitenkaan haluttu SQL:ää, joten DatabaseConnectionia hyödyntämään luotiin DataManager-decorator luokka, joka käytti DatabaseConnectionin tarjoamaa toiminnallisuutta ja tarjosi samalla itsensä käyttäjälle hyvin yksinkertaisen rajapinnan haluttujen hakujen tekemiseen. Mallin käyttö oli hyödyllistä, koska näin kantariippuvainen SQL saatiin varsinaisesta sovelluslogiikasta täysin pois. 5 Yhteenveto Suunnittelumalleja käyttämällä saatiin aikaan normaali tapahtumapohjainen, MVC-mallin mukainen sovellus, ilman että pyörää olisi tarvinnut keksiä useassa paikassa uudelleen (tai oikeastaan pyörän muotoa, varsinainen pyörä oli käytännössä toteutettava). Toteutettu sovellus on näin myös tilallinen (palvelimen osalta), mikä poikkeaa yleisestä käytännöstä websovelluksien yhteydessä. Suunnittelumalleja hyödyntämällä varsinaisille sovellusohjelmoijille saatiin luotua ympäristö, joka oli tarpeeksi nopeasti opittavissa ja mahdollisti helpon iteratiivisen kehityksen, ilman suurempia sudenkuoppia. Arkkitehtuurista, käytetyistä suunnittelumalleista, sekä tilallisesta sovelluksesta johtuva suurin negatiivinen asia on näkyvissä loppukäyttäjälle oli se, että selaimen navigointinappeja ei voi käyttää (toisaalta nyt käyttäjä ei voi myöskään korruptoida sovellusta tai tietokantaa käyttämällä navigointinappeja). 8