Suunnittelumalli

Wikipedia

Loikkaa: valikkoon, hakuun

Ohjelmistotekniikassa suunnittelumalli tarkoittaa yleistä tapaa jonkin usein esiintyvän ongelman ratkaisemiseksi. Suunnittelumalleja käytetään etenkin oliosuunnittelussa. Oliosuunnittelumallit ovat kuvaus keskenään toimivista ja kommunikoivista oliosta ja luokista, jotka muokataan ratkaisemaan yleinen suunnitteluongelma jossain erityisessä tapauksessa. Oliosuunnittelumallit antavat yleisen tason ratkaisuja olioarkkitehtuurin suunnittelussa esiintyviin ongelmiin.

Sisällysluettelo

[muokkaa] Historia

Suunnittelumallien idean esitti ensimmäisenä amerikkalainen arkkitehti Christopher Alexander. Hänen kirjassaan A Pattern Language (1977) esittelemänsä suunnittelumallit on tarkoitettu kaupunkien, rakennusten ja rakenteiden suunnitteluun.

Kent Beck ja Ward Cunningham toivat suunnittelumallit ohjelmistosuunnitteluun vuoden 1987 OOPSLA-konferenssissa. Vaikka he käyttivätkin esittelemiään suunnittelumalleja olio-ohjelmoinnin suunnittelussa, eivät ne olleet oliosuunnittelumalleja sanan nykyisessä merkityksessä vaan pikemminkin käytettävyysmalleja.

Nykyisten oliosuunnittelumallien isänä voidaan pitää Erich Gammaa, joka esitteli ne väitöskirjassaan vuonna 1991. Myöhemmin Gamma kokosi nk. Gang of Four -ryhmän kanssa teoksen Design Patterns – Elements of Reusable Object-Oriented Software. Se on edelleen tunnetuin suunnittelumalleja käsittelevä teos.

[muokkaa] Suunnittelumallin rakenne

Useat Gamman teoksessa esitetyt suunnittelumallit liittyvät arkkitehtuuritason ratkaisuihin, mutta niitä pystyy soveltamaan myös yksityiskohtaisella tasolla. Yleisesti suunnittelumallit käsittelevät vain jotain suppeaa osaa ohjelmistosta. Tällaisen suppean ohjelmiston rakennetta kutsutaan mikroarkkitehtuuriksi. Suunnittelumallien käsitettä ei ole rajoitettu pelkästään arkkitehtonisten ongelmien ratkaisuun vaan samantyyppisillä menetelmillä voidaan myös esittää malleja ohjelmistotuotantoprojektin hallinnasta tai ohjelmiston suunnitteluvaiheesta. Nämä mallit erotetaan kuitenkin omiksi malliperheikseen, jotka eivät kuulu suunnittelumallien alkuperäiseen käsitteeseen. Suunnittelumallissa on yleensä samanlaiset peruskomponentit, jotka kuvaavat ja määrittelevät mallin. Neljä olennaista elementtiä ovat:

  • nimi
  • ongelma
  • ratkaisu
  • seuraukset

[muokkaa] Nimi

Suunnittelumallin nimi kuvaa suunnittelumallin yhdellä tai kahdella sanalla. Malleille pyritään antamaan mahdollisimman kuvaava nimi, joka edistää suunnittelumallin yleistä tunnettavuutta. Suunnittelumallien nimeäminen tehostaa suunnittelumallien käyttöä, koska ohjelmistosuunnittelijat voivat tutkia ongelman ja sopia ratkaisussa käytettävän suunnittelumallin, jolloin aikaa ei kulu eri toteutusvaihtoehtoihin tutustumiseen. Erityisesti Gamman teoksessa esitellyistä suunnittelumallien nimistä on tullut yleisesti tunnettuja.

[muokkaa] Ongelma

Ongelma esittää tilanteen, jossa mallia voidaan soveltaa. Ongelman kuvaus esitetään tarkasti identifioituna, mikä helpottaa käyttöalueen määritystä. Kuvaus voi myös esittää jonkin tyypillisen joustamattoman rakenteen, jota on parannettava. Suunnittelumallia ei ole syytä käyttää ellei ongelman kuvaus vastaa toteutettavassa ohjelmistossa esiintyvää ongelmatilannetta. Yleisesti voidaan todeta, että suunnittelumallien tehokas soveltaminen vaatii huolellista pohdintaa, sillä mallien soveltaminen voidaan tehdä vain suppeasti määritellyllä ongelmaalueella. Joskus ongelman kuvaus sisältääkin listan ehdoista joiden tulee täyttyä ennen kuin on hyödyllistä soveltaa suunnittelumallia.

[muokkaa] Ratkaisu

Ratkaisun tehtävänä on muodostaa yleinen kuvaus ongelman ratkaisusta. Ratkaisu kuvaa toteutuksessa käytettävät luokat, rajapinnat ja oliot, sekä niiden suhteet yleisellä tasolla. Vaikka ratkaisun rakenne esitetään yleensä UML-kaaviolla tai jollain muulla oliorakennetta kuvaavalla notaatiolla, ei ratkaisu kuvaa mitään erityistä tilannetta vaan yleisen tavan ratkaisulle. Tosin yksinkertainen esimerkki helpottaa ratkaisun toteutustavan ymmärtämistä. Ratkaisussa ei yleensä oteta kantaa käytettävään ohjelmointikieleen, mutta esimerkiksi moniperinnän puuttuminen osasta oliokieliä saattaa hankaloittaa ratkaisun toteuttamista. Yleisesti suunnittelumalleissa ei käytetä jonkin tietyn kielen erityisominaisuuksia ongelman ratkaisuun.

[muokkaa] Seuraukset

Suunnittelumallin seurauksissa luetellaan mallin soveltamisesta aiheutuvat tulokset, hyödyt ja mahdolliset kompromissit. Seurauksien avulla arkkitehti voi punnita vaihtoehtoja ja ymmärtää mallin soveltamisen aiheuttamat hyödyt ja haitat. Soveltamisen seurauksien listan avulla suunnittelija voi varmistua, että kyseisen suunnittelumallin käyttö on perusteltua. Koska uudelleenkäytön tehokkuus on tärkeä ominaisuus, kuvaavat seuraukset myös vaikutukset sovelluksen joustavuuteen ja laajennettavuuteen. Seurauksissa voidaan myös esittää huomioita toteutukseen liittyvistä asioista.

[muokkaa] Luokittelu

Suunnittelumallit luokitellaan yleisesti kolmeen ryhmään käyttötarkoituksen perusteella.

Luontimallit pyrkivät tekemään olioiden luomisesta abstraktin tapahtuman. Ne mahdollistavat ohjelman riippumattomaksi siitä miten oliot luodaan, koostetaan ja esitetään. Luontimallit mahdollistavat ohjelman rakenteen perustumaan enemmän luokkien ilmentymistä kuin itse staattisista luokista. Luontimallien kaksi yhteistä piirrettä ovat järjestelmän käyttämien todellisten luokkien kapselointi ja luokkien ilmentymien todellisen syntymekanismin piilottaminen. Ohjelmisto tietää vain olioista, ei niiden takana olevista luokista.

Rakennemallit kuvaavat miten luokat ja oliot yhdistetään laajemmiksi kokonaisuuksiksi. Sen sijaan että rakennettaisiin rajapintoja ja toteutuksia, rakennemallit kuvaavat keinoja, joilla oliot saavat uutta toiminnallisuutta dynaamisesti. Lisääntynyt joustavuus olioiden rakenteessa mahdollistaa olioiden toiminnallisuuden muuttamisen ajonaikaisesti, mikä olisi mahdotonta staattisessa luokkarakenteessa.

Käyttäytymismallit kuvaavat algoritmeja ja ratkaisuja, joissa oliot saadaan käyttäytymään ja toimimaan yhdessä halutulla tavalla. Käyttäytymismallit kuvaavat olioiden ja luokkien lisäksi myös olioiden välistä kommunikaatiota. Monet malleista kuvaavat monimutkaisen tietovuon, jota on vaikea tarkkailla ajonaikaisesti. Käyttäytymismalleilla pyritään eriyttämään näkökulma prosessin kulun asemesta tapaan jolla oliot liittyvät toisiinsa.

Käyttötarkoituksiin jaetut ryhmät voidaan edelleen erotella olio- tai luokkasuunnittelumalleihin. Oliomallit käyttävät olioiden ominaisuuksia ratkaistakseen ongelman. Luokkamallit käyttävät luokkien ominaisuuksia.

[muokkaa] Katso myös

[muokkaa] Lähteet

  • Erich Gamma et al., Design Patterns – Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995
  • Kai Koskimies, Oliokirja. Suomen ATK-kustannus, 2000.
Henkilökohtaiset työkalut