Suunnittelumalli

Suunnittelumalli (engl. Design Pattern) on ohjelmistotekniikassa ohjelmistorakenteen käsitteelliset (abstraktit) avainkohdat määrittävä kuvaus toistensa kanssa yhteistoiminnassa olevista luokista ja olioista. Suunnittelumalli sisältää yleisellä tasolla esitetyn ratkaisun johonkin oliopohjaisen suunnittelussa esiintyvään tavanomaiseen tilanteeseen tai kohteeseen.[1] Suunnittelumalli perustuu käytännön kokemukseen ratkaisun toimivuudesta tietyssä tilanteessa, ja sen käytöstä on pitkä kokemus. Suunnittelumallin tärkeimmät osat ovat ongelma, ongelmayhteys ja ratkaisu.[2] Suunnittelumallia voidaan käyttää työvälineenä suunniteltaessa ohjelman konkreettista arkkitehtuuria[3].

Yleistä

Suunnittelumalli on yleiskäyttöinen, käytännössä toimiva, uudelleenkäytettävä ja oliosuuntautunut ohjelmointilähtökohta, jota aloitteleva ohjelmoija ei tunne[4]. Suunnittelumalli voi myös koskea ohjelman suppeaa yksityiskohtaa[5]. Suunnittelumallin määrittelyssä kerrotaan sen käyttökohde, käyttöä rajoittavat tekijät, mallin seuraukset ja sen vahvuudet ja heikkoudet. Suunnittelumallin käyttö edellyttää riittävät ominaisuudet omaavan oliokielen käyttöä (esimerkiksi C++).[6] Paras keino ymmärtää ja omaksua suunnittelumalli on sen tutkiminen[7].

Suunnittelumallissa ei ole tärkeintä malli itse, vaan se suunnittelukokemus ja asiantuntemus, joka sitä käyttäen saadaan säilytettyä ja siirrettyä muille ohjelmoijille. Kerätty informaatio tulee esittää käytännönläheisessä, selkeässä ja järjestelmällisessä muodossa, jolloin malli antaa käytännön ohjelmointityöhön järjestetyn ja valmiin kokoelman tiettyihin tilanteisiin sopivia ratkaisuja. Suunnittelumalleja ei tule käyttää tilanteissa, joista niistä ei ole hyötyä.[8]

Ohjelmistoarkkitehtuurin kannalta suunnittelumallit käsittelevät yleensä suhteellisen pieniä yksiköitä (mikroarkkitehtuuria), mutta suunnittelumalleja voidaan käyttää myös koko sovelluksen perusrakenteessa (makroarkkitehtuuri). Suunnittelumallien ideaa on sovellettu käänteisenä keräämällä ns. antisuunnittelumalleja, joissa esitetään virheellisiä suunnitteluratkaisuja. Antisuunnittelumallia voidaan käyttää tunnistamaan ohjelmarakenteen virheitä ja suositeltavan suunnittelumallin soveltamiseen virheen poistamiseksi.[9]

Historia

Suunnittelumallin käyttö ohjelmistotekniikassa perustuu amerikkalaisen arkkitehdin Christopher Alexanderin esittämään ajatukseen (Alexander, C. & ym. (1977). A Pattern Language. New York: Oxford University Press[5]) siitä, että rakentaminen perustuu hyväksi havaittujen ratkaisumallien keräämiseen, oppimiseen ja toistamiseen. Eräät ohjelmistotekniikan tutkijat (Kent Beck, Jim Coplien, Erich Gamma, ym.) tutustuivat näihin ajatuksiin, ja ryhtyivät kehittämään niiden käyttöä ohjelmointitekniikan yhteydessä.[2]

Vuoden 1994 elokuussa pidetty PLoP-konferenssin (Pattern Language of Programming) jälkeen aloitettiin useita projekteja suunnittelumallien löytämiseksi. Vuoden 1995 alussa Erich Gamma, Richard Helm, Ralph Johnson ja John Vlissides ("Gang of Four") julkaisivat Design Patterns: Elements of Reusable Object-Oriented Software, jossa esitettiin 23 suunnittelumallia.[10]

Aikaisemmin 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 niitä voidaan pitää käytettävyysmalleina. Erich Gamma oli käsitellyt suunnittelumalleja vuonna 1991 julkaistussa väitöskirjassaan, ja häntä pidetään suunnittelumallien tärkeimpänä kehittäjänä.

Suunnittelumallin sisältö

Suunnittelumallia kuvataan yleensä sen perustiedoilla, jotka määrittelevät mallin ja kuvaavat sen toiminnan.Nämä perustiedot ovat nimi, ongelman kuvaus, ratkaisun kuvaus ja ratkaisun vaikutukset ohjelmistoon ja tietokoneen laitteisiin. Muita suunnittelumallista esitettäviä tietoja voivat olla mm. luokittelu, mallista käytettävät muut nimet, esimerkki käyttötilanteesta, soveltuvuus, rakenteen esittäminen kaaviolla, malliin kuuluvat luokat ja niiden välinen tehtävien jako (vastuut), luokkien väliset rajapinnat, toteutuksessa esiintyvät ongelmat (esim. ohjelmointikielen vaikutus), esimerkki mallin toteuttamisella ohjelmointikielellä, esimerkkejä käytöstä todellisissa ohjelmissa ja mallia muistuttavat muut mallit ja mallit, joiden kanssa mallia olisi hyvä käyttää.[11]

Nimi

Suunnittelumallin nimi kuvaa mallin sisältämän periaatteen lyhyesti ja yksiselitteisesti. Mallin nimen perusteella voidaan nopeasti hahmottaa käytetty rakenne, sen tuottama hyöty ja siihen liittyvät rajoitukset. Mallin nimi auttaa ohjelmiston suunnittelemaan ajattelemaan ohjelmistorakennetta yleisellä (abstraktilla) tasolla, ja sen käyttö voi helpottaa suunnittelijoiden välistä keskustelua.[12] Suunnittelumallin nimen tulisi olla osa suunnittelijan ammattisanastoa, mutta tilannetta on vaikeuttanut mm. se, että sama suunnittelumalli on nimetty eri nimillä tai käytännössä samat suunnittelumallit on nimetty eri nimillä. Samaa nimeä voidaan myös käyttää eri suunnittelumalleille.[13]

Ongelma

Ongelma (Problem) kuvaa ohjelmoinnissa esiintyvää tavanomaista tilannetta, jonka ratkaisemisessa suunnittelumalli on ollut hyödyksi. Ongelman kuvaus voi olla laaja arkkitehtuuriin liittyvä tai sitten suppeampi, esim. tietyn algoritmin kuvaus. Suunnittelumalli voi joskus sisältää ominaisuuksia, joiden vuoksi sitä ei ole tarkoituksenmukaista käyttää muissa kuin erityistilanteissa. Nämä erityistilanteet on kuvattu tässä osassa suunnittelumallin määrittelyä.[14] Ongelman tulee ilmetä toistuvasti monenlaisissa ohjelmistoissa ja sen tulee olla yleisluontoinen (esim. ohjelmointikielestä riippumaton). Muut kuin arkkitehtuuri- tai yksityiskohtaiseen suunnitteluun liittyvät ongelmat rajataan pois.[15]

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ä ongelma-alueella. Joskus ongelman kuvaus sisältääkin listan ehdoista joiden tulee täyttyä ennen kuin on hyödyllistä soveltaa suunnittelumallia.

Ongelmayhteys

Ongelmayhteys (Context) kuvaa sen kokonaisuuden, jossa ongelma ilmenee, ja se kertoo sen, missä tilanteissa suunnittelumallia voidaan käyttää. Ongelmayhteys määrittää lisäksi ratkaisulle asetettavia vaatimuksia ja niitä ohjelman laatuominaisuuksia, joita ratkaisun tulisi parantaa. Usein ongelma ja ongelmayhteys esitetään yhdessä, ja niitä havainnollistetaan esimerkeillä.[16]

Ratkaisu

Ratkaisu (Solution) kuvaa mahdollisen ohjelmointirakenteen ja sen osat (esim. luokat, oliot, algoritmit), osien väliset suhteet ja niiden välisen vuorovaikutuksen (yleensä funktiokutsut) yleisellä tasolla. Ratkaisun antamia ohjelmoinnin suuntaviivoja on käytettävä käsitteellisenä runkona laadittaessa käytännön ratkaisua käsillä olevaan ohjelmointiongelmaan. Ohjelmistosuunnittelija arvioi tapauskohtaisesti sen, miten mallin ratkaisu sopii kyseessä olevaan tilanteeseen.[14] Ratkaisun tulee olla sovellettavissa yleisesti ohjelmoinnissa, ja se tulee pystyä esittämään yleisti käytössä olevalla mallinnuskielellä (esim. UML). Ratkaisun yleiskäyttöisyydestä voi seurata se, että ohjelmiston laatuominaisuudet (esim. nopeus) heikkenee.[15]

Ratkaisu on suunnittelumallin tärkein asia, ja se esitetään usein staattisena rakenteena (esim. UML:n luokkakaavio) jota täydennetään dynaamisen vuorovaikutuksen kaaviolla (esim. UML:n sekvenssikaavio). Kuvausta voidaan täydentää pseudokoodikuvauksella, joka kuvaa ohjelman kulun vaihe vaiheelta.[15]

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 yleisesti tunnetulla kuvaustavalla (notaatio), 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.

Seuraukset

Seuraukset kuvaa mallin vaikutusta ohjelman sisäiseen ja ulkoiseen toimintaan, sekä sen käytöstä seuraavia hyviä ja huonoja seikkoja. Ohjelmistojen toiminnan kannalta tärkeitä seurauksia ovat mm. muisti ja suoritusaika ja ohjelmiston uudelleenkäyttö. Ohjelmiston uudelleenkäytön kannalta tärkeitä seurauksia ovat mm. käytetyn mallin vaikutus ohjelman laajennettavuuteen, muunneltavuuteen ja siirrettävyyteen.[12] Mikään suunnittelumalli ei tuota joka suhteessa parasta ratkaisua, vaan kukin niistä optimoi tietyt ohjelman laatuominaisuudet ja heikentää muita. Seurausten kuvaaminen auttaa suunnittelijaa arvioimaan sitä, miten malli soveltuu käsillä olevaan suunnittelutilanteeseen. Seurauksista kertominen helpottaa suunnittelumallin soveltamista käytännön ohjelmistotyössä.[15]

Toteutusnäkökulma ja esimerkit

Toteutusnäkökulma kertoo käytännön ohjelmoinnissa esiintyvien tilanteiden ratkaisemisesta, esimerkiksi kertomalla mallin käytöstä eri ohjelmointikieliä käytettäessä. Toteutusnäkökulma on pidettävä erillään suunnittelumallin esittämästä teoreettisesta ajattelutavasta. Suunnittelumallin käytöstä voidaan antaa esimerkki todellisen järjestelmän toteutuksessa tai ohjelmointikielikohtaisena.[17]

Luokittelu

Suunnittelumallit luokitellaan yleensä sen tarkoituksen (luonti, rakenne, käyttäytyminen) ja sen kohteen (luokka, olio) perusteella. Mallit voidaan luokitella lisäksi myös sen mukaan, mitä malleja käytetään yleensä toistensa kanssa, mitkä mallit ovat toistensa vaihtoehtoja tai rakenteeltaan toisiaan vastaavia. Mallien luokittelun tarkoituksena on jäsentää ohjelmistoa käsitteellisiä lähestymistapoja (abstraktiotaso) kuvaavat mallit toistensa suhteen ja nopeuttaa mallien oppimista.[18]

Luontimallit

Luontimalli on suunnittelumalli, jolla ohjelmassa toimivan olion rakentaminen esitetään käsitteellisellä tasolla. Luontimalli peittää konkreettisesti käytettävien tuotantoluokkien näkyvyyden niitä käyttäviltä luokilta ja sen, miten tuotantoluokkia luodaan ja yhdistellään toisiinsa, eli tuotantoluokkia käyttävä tilaajaohjelma tuntee niistä vain niiden abstraktissa luokassa esitettävän rajapinnan. Rajapinnan käyttö mahdollistaa sen, että tuotantoluokkia ja niiden välisiä suhteita on helppo muuttaa ilman että sillä olisi vaikutusta luokkia tilaavan ohjelman toimintaan.[19] Luontimalli kuvaa olioiden luomisprosessin, eli sen, kuinka, koska ja mitä olioita luodaan, ja huolehtivat luokkien ja olioiden asetusten konfiguroinnista[20].

Luontimalli on suunnittelumalli, jossa monimutkainen toiminnallisuus toteutetaan yhdistämällä useita eri toiminnallisuuksia. Luontimallit kätkevät tiedon siitä, mitä luokkia toiminnallisuuden toteuttamisessa käytetään ja miten näitä luokkia käytetään, luodaan ja liitetään toisiinsa.[19]

Epäkonkreettinen tehdas

Epäkonkreettinen tehdas (Absract Factory, Kit) on olion luontimalli, jossa konkreettisten luokkien olioryhmä (-perhe) luodaan luokasta jolla itsellään ei ole konkreettista ilmentymää (abstrakti luokka). EKT on rajapintaluokka, joka yhdistää toisiinsa saman tyyppisiä oliota.[21]

EKT:tä voidaan käyttää ohjelman rakenteen mallina esim. käyttöliittymän toteutukseen eri alustoilla seuraavasti: Sovellusta käytetään eri käyttöliittymässä, jolloin käyttöliittymän rakentamistyökalun tulee tukea erilaisia käyttöliittymästandardeja. Käyttöliittymää luotaessa sovellus kutsuu abstraktin luokan (esim. UITehdas) funktiota (esim. luoIkkuna(), luoVierityspalkki(), luoPainonappi), joka edelleen kutsuu kyseisen ohjelmaympäristön konkreettista luokkaa, joka toteuttaa tarvittavat toiminnallisuudet.[21]

EKT toteutetaan usein tehdasmenetelmällä, ja toteutuksessa voidaan käyttää myös prototyyppimallia. Abstraktin tehtaan alaluokka konkreettinen tehdas on tavallisesti ainokainen (luokasta luodaan vain yksi ilmentymä).[22]

Rakentajarajapinta

Rakentajarajapinta (Builder) on olion luontimalli, jossa erotetaan toisistaan olion esitysmuoto ja sen luomisprosessi. Tämän vuoksi sama prosessi voi tuottaa erilaisia olioita. Abstrakti rakentaja on abstrakti rajapintaluokka, joka luo konkreettisen rakentajaluokan osat. Rakentajaluokka toteuttaa halutut toiminnallisuudet (tuotteet).[23]

Rakentajaa voidaan käyttää ohjelman rakenteen mallina esim. muunnettaessa RTF-muotoista tekstiä muihin tekstiformaatteihin (esim. ASCII, muotoiltu teksti, jota ei voida muokata, muotoiltu teksti, jota voidaan muokata). RTFLukija (pääohjelma) kutsuu abstraktin rakentajan (TekstiKonvertoija), joka kutsuu edelleen konkreettisen rakentajan (ASCIIKonvertoija, TekstiKonvertoija, TekstiMuokkausKonvertoija) pääohjelman funktiokutsun sisältämän tiedon mukaan. Konkreettinen rakentaja määrittelee tuotteen kokoamisen prosessin ja kokoaa tuotteen sisäisen esitysmuodon.[23]

Rakentajarajapinta muistuttaa epäkonkreettista tehdasta siinä, että molemmilla voidaan toteuttaa monimutkaisia toiminnallisuuksia. Mallit eroavat toisistaan siinä, että epäkonkreettinen tehdas palauttaa pyydetyn tuotteen välittömästi, kun taas rakentajarajapinta valmistaa tuotteen vaiheittain ja palauttaa sen prosessin viimeisenä vaiheena. Rakentajarajapintaa käytetään usein rekursiokoosteen kokoamiseen.[24]

Tehdasfunktio

Tehdasfunktio (Factory Method, Virtual Constructor) on luokan luontimalli, jossa käytetään abstraktia funktiokutsua. Olion kutsumuoto on määritelty, ja luokan ilmentymän luominen on aliluokan tehtävä. Tehdasfunktiomallissa abstrakti luokka kapseloi konkreettisen luokan tarvitsemat tiedot ja välittää ne konkreettiselle tuotantoluokalle.[25] Tehdasfunktiota voidaan käyttää ohjelman rakenteen mallina esim. sovelluksessa, joka tuo käyttäjän muokattavaksi useita dokumentteja.[26]

Prototyyppirajapinta

Prototyyppirajapinta (Prototype) on olion luontimalli, jossa olion määrittely suoritetaan abstraktilla prototyyppiluokalla. Olio luodaan prototyyppiluokkaa kutsumalla ja luomalla siitä kopioita (kloonaus). Kopioiden ominaisuuksia voidaan muokata parametreilla, jolloin voidaan vähentää luokkien määrää.[27]

Ainokainen

Ainokainen (Singleton) on olion luontimalli, jossa luokasta luodaan täsmälleen yksi konkreettinen ilmentymä. Ilmentymään pääsy on globaali.[28]

Rakennemallit

Rakennemalli on suunnittelumalli, joka kuvaa luokkia (ja olioita) ja niiden yhdistelyä suuremmiksi rakenteiksi[29]. Rakennemalli kuvaa tavan, jolla luokkia ja olioita käytetään laajoissa rakenteissa. Rakennemalli esittää rajapinnat ja toteutuksen toisistaan erotettuina.[7]

Sovitin

Sovitin (Adapter, Wrapper) on luokan tai olion rakennemalli, jossa kaksi toisiinsa sopimatonta rajapintaa liitetään toisiinsa käyttäen rajapintaluokkaa.[30]

Silta

Silta (Bridge, Handle, Body) on ohjelmiston rakennemalli, jossa sovellukseen liitetty abstrakti rajapintaluokka kutsuu haluamansa toiminnallisuuden abstraktilta toiminnallisuuden rajapintaluokalta. Nämä kaksi rajapintaa muodostavat sillan, ja molempia rajapintoja voidaan vapaasti muunnella.[31]

Koosteensa sisältävä kooste

Koosteensa sisältävä kooste (rekursiokooste, Composite) on ohjelmiston rakennemalli, jossa yksi koosteolion rakentava abstrakti luokka käsittelee kyseistä koostetta samalla tavalla ja samanaikaisesti konkreettisten aliluokkien olioiden kanssa. Ohjelma käsittelee kaikkia itsensä sisältävän koosteen osia samalla tavalla.[32]

Kuorruttaja

Kuorruttaja (Decorator, Wrapper) on suunnittelumalli, jossa oliolle (ei koko luokalle) lisätään toiminnallisuutta (vastuita) ajon aikana (dynaamisesti) käyttämällä abstraktia rajapintaluokkaa, jonka alaluokat toteuttavat toiminnallisuuden. Kuorruttaminen on joustava vaihtoehto perinnälle.[33]

Julkisivu

Julkisivu (Facade) on ohjelmiston rakennemalli, jossa julkisivu-luokka tarjoaa yhden yhtenäisen rajapinnan alijärjestelmäluokkien rajapintojen joukolle ja niiden keskeisille palveluille. Julkisivu vähentää alijärjestelmien riippuvuuksia ja niiden välistä kommunikaatiota ja helpottaa alijärjestelmän käyttöä.[34]

Hiutale

Hiutale (Flyweight) on ohjelmiston rakennemalli, jossa yhteiskäyttöistä oliota käytetään samanaikaisesti useissa eri yhteyksissä. Hiutale käyttäytyy jokaisessa käyttöyhteydessään itsenäisesti. Hiutaleessa olion sisäinen ja ulkoinen tila on erotettu toisistaan, sisäinen tila on tallentuneena hiutaleeseen, ja ulkoinen tila vaihtelee tilanteen mukaan ja riippuu asiayhteydestä.[35]

Edustaja

Edustaja (Proxy, Surrogate) on ohjelmiston rakennemalli, jossa olioille luodaan korvike (tai paikan pitäjä) käyttäen abstraktia rajapintaluokkaa, jonka alaluokka konkreettinen Edustaja-luokka on. Edustaja-luokka kontrolloi olioon kohdistuvia pyyntöjä.[36]

Käyttäytymismallit

Käyttäytymismalli kuvaa ohjelman kulun vaihe vaiheelta (algoritmi), olioiden tehtävät (vastuut) ja olioiden suhteet toisiinsa ja niiden välisen yhteistyön (vuorovaikutus). Käyttäytymismalli kuvaa lisäksi ohjelmiston staattisen rakenteen (luokat).[37] Käyttäytymismalli voi olla luokkiin perustuva (mm. operaatiorunko- ja tulkkimalli), olioihin perustuva (mm. tarkkailija-, vastuuketju- ja välittäjämalli) tai toiminnallisuuden kapselointi olioon (mm. iteraatio-, komento-, strategia-, tila- ja vierailijamalli).[38] Käyttäytymismalli kuvaa olioiden välisen ohjelman suorituksen aikana tapahtuvan dynaamisen vuorovaikutuksen[7]

Yleisfunktio

Yleisfunktio (Template Method) perustuu toimintojen delegointiin luokille perintää käyttäen. Abstraktissa rajapintaluokassa määritellään tuotantoluokkien ne toiminnallisuudet, jotka ovat samat kaikissa alaluokissa. Tuotantoluokissa määritellään ne toiminnallisuudet, joiden käyttäytyminen voi vaihdella.[38]

Tulkki

Tulkki (Interpreter) perustuu toimintojen delegointiin luokille perintää käyttäen. Laaditaan ohjelmointikieli, jolla voidaan määritellä haluttu toiminnallisuus. Ohjelmoidaan luokkia käyttäen tulkkausohjelma, joka kääntää kieliopin mukaiset käskyt toiminnallisuudeksi.[39]

Tarkkailija

Tarkkailija (Observer) Perustuu toimintojen delegointiin olioille käyttäen koostamista. Olioiden välinen tiedonsiirto tapahtuu tarkkailijaa käyttäen, joka muuttaa olion tiedon niissä olioissa, jotka ovat siitä riippuvaisia (yksi-moneen-suhde). Klassinen esimerkki tarkkailijasta on MVC-malli (Model-View-Controller; Luokkamalli-Näkymä-Valvoja-malli).[39]

Vastuuketju

Vastuuketju (Chain of Responsibility) perustuu toimintojen delegointiin olioille koostamista käyttäen. Olioiden välinen tiedonsiirto perustuu pyynnön mahdollisesti käsittelevien olioiden (kandidaattioliot) muodostamaan ketjuun, jossa pyyntö käsitellään siinä oliossa, joka voi toteuttaa pyynnön. Pyynnön vastaanottava (käsittelevä) olio ei ole sidottu pyynnön lähettäneeseen olioon.[39]

Välittäjä

Välittäjä (Mediator) perustuu toimintojen delegointiin olioille koostamista käyttäen. Eri olioiden välinen tiedonsiirto tapahtuu abstraktia kapseloitua välittäjäoliota käyttäen eli vuorovaikutuksessa olevat oliot eivät voi viitata toisiinsa, edistää olioiden löyhää sidontaa.[39]

Iteraatio

Iteraatio (Iterator) perustuu toiminnallisuuden kapselointiin olioon ja funktioiden kutsumiseen tarpeen mukaan. Esimerkiksi tietorakenteen läpikäymiseen peräkkäisjärjestyksessä käytettävä toiminnallisuus kapseloidaan olioon.[39]

Komento

Komento (Command) perustuu kutsun kapselointiin abstraktiin olioon ja funktioiden kutsumiseen tarpeen mukaan tätä oliorajapintaa käyttäen.[39]

Muisto

Muisto (Memento) perustuu olion sisäisen tilan kapselointiin. Olion sisäinen tila kapseloidaan muisto-olioon, jonka tietoihin on pääsy vain tiedon lähdeoliolla.[39]

Strategia

Strategia (Strategy) perustuu olion ohjelma-algoritmien kapselointiin tuotanto-olioihin, joista muodostuu tuotanto-olioperhe. Abstrakti strategiaolio ohjaa pyynnön tuotanto-oliolle.[39]

Tila

Tila (State) Perustuu olion tilan (ja tilaan liittyvän vaihtuvan toiminnallisuuden) kapselointiin abstraktin olion valitsemaan tuotanto-olioon. Kun a.oliota kutsutaan, se valitsee sen hetkisen tilansa mukaisen toiminnallisuuden toteuttavan konkreettisen olion.[39]

Vierailija

Vierailija (Visitor) Perustuu kutsuvien luokkien yhtäpitävän toiminnallisuuden kapselointiin tuotantoluokkaan ja funktioiden kutsumiseen tarpeen mukaan abstraktia rajapintaluokkaa käyttäen. Kutsuvien luokkien toiminnallisuutta voidaan lisätä ilman niiden luokkarakenteen muuttamista tuotantoluokkia lisäämällä.[39]

Suunnittelumallit ja ohjelmistokehykset

Suunnittelumalleilla ja kehyksillä on läheinen yhteys, koska molempien tarkoituksena on tavallisesti lisätä ohjelmiston joustavuutta ja siirrettävyyttä. Suunnittelumalleja voidaan käyttää myös kehysten dokumentointiin perusteltaessa sitä, miksi valittuun suunnitteluratkaisuun on päädytty.[40]

Katso myös

Lähteet

  • Gamma, Erich, Helm, Richard, Johnson, Ralph & Vlissides, John. (2001). Olio-ohjelmoinnin Suunnittelumallit. Suomentanut Anita Toivanen. Alkuperäisteos Design Patterns: Elements of Reusable Object-Oriented Software. Helsinki: IT Press. ISBN 951-826-428-7
  • Koskimies, Kai. (2000). Oliokirja. Jyväskylä: Satku - Kauppakaari. ISBN 951-762-720-3
  • Koskimies, Kai & Mikkonen, Tommi. (2005). Ohjelmistoarkkitehtuurit. Jyväskylä: Talemtum. ISBN 952-14-0862-6

Viitteet

  1. Gamma, Helm, Johnson & Vlissides 2001, 4-5.
  2. a b Koskimies & Mikkonen 2005, 102-103
  3. Koskimies & Mikkonen 2005, 32-35 ja 101
  4. Eriksson & Penker 2000, 221
  5. a b Koskimies 2000, 245
  6. Gamma, Helm, Johnson & Vlissides 2001, 5.
  7. a b c Eriksson & Penker 2000, 223
  8. Koskimies 2000, 245-247
  9. Koskimies 2000, 247
  10. Eriksson & Penker 2000, 222
  11. Gamma, Helm, Johnson & Vlissides 2001, 2-3 ja 6-8
  12. a b Gamma, Helm, Johnson & Vlissides 2001, 3
  13. Koskimies & Mikkonen 2005, 106
  14. a b Gamma, Helm, Johnson & Vlissides 2001, 5
  15. a b c d Koskimies & Mikkonen 2005, 105
  16. Koskimies & Mikkonen 2005, 105-106
  17. Koskimies & Mikkonen 2005, 107
  18. Gamma, Helm, Johnson & Vlissides 2001, 9-11
  19. a b Gamma, Helm, Johnson & Vlissides 2001, 81
  20. Erikssen & Penker 2000, 223
  21. a b Gamma, Helm, Johnson & Vlissides 2001, 87
  22. Gamma, Helm, Johnson & Vlissides 2001, 95
  23. a b Gamma, Helm, Johnson & Vlissides 2001, 97-99
  24. Gamma, Helm, Johnson & Vlissides 2001, 105-106
  25. Gamma, Helm, Johnson & Vlissides 2001, 107-108
  26. Gamma, Helm, Johnson & Vlissides 2001, 107
  27. Gamma, Helm, Johnson & Vlissides 2001, 117-118
  28. Gamma, Helm, Johnson & Vlissides 2001, 127
  29. Gamma, Helm, Johnson & Vlissides 2001, 137
  30. Gamma, Helm, Johnson & Vlissides 2001, 139
  31. Gamma, Helm, Johnson & Vlissides 2001, 151-152
  32. Gamma, Helm, Johnson & Vlissides 2001, 163-164
  33. Gamma, Helm, Johnson & Vlissides 2001, 175-176
  34. Gamma, Helm, Johnson & Vlissides 2001, 185
  35. Gamma, Helm, Johnson & Vlissides 2001, 195-196
  36. Gamma, Helm, Johnson & Vlissides 2001, 207-209
  37. Gamma, Helm, Johnson & Vlissides 2001, 221
  38. a b Gamma, Helm, Johnson & Vlissides 2001, 221-222
  39. a b c d e f g h i j Gamma, Helm, Johnson & Vlissides 2001, 211-
  40. Koskimies 2000, 264


Kirjallisuutta

  • Gamma, Erich, Helm, Richard, Johnson, Ralph & Vlissides, John. (2007). Design Patterns: Elements of Reusable Object-Oriented Software. Westford, Massachusetts: Addison-Wesley. ISBN 0201633612

Aiheesta muualla

Read other articles:

Japanese baseball player and coach Baseball player Satoshi KomatsuKomatsu with the Orix BuffaloesPitcher / CoachBorn: (1981-10-29) October 29, 1981 (age 42)Iwaki, Fukushima, JapanBatted: RightThrew: RightNPB debutJuly 16, 2007, for the Orix BuffaloesLast appearanceSeptember 29, 2016, for the Orix BuffaloesNPB statistics (through 2016)Win–loss record25-26ERA4.38Strikeouts388 TeamsAs player Orix Buffaloes (2007–2016) As coach Orix Buffaloes (2017–2020) C...

 

County in Montana, United States County in MontanaGarfield CountyCountyGarfield County Courthouse in JordanLocation within the U.S. state of MontanaMontana's location within the U.S.Coordinates: 47°17′N 106°59′W / 47.28°N 106.99°W / 47.28; -106.99Country United StatesState MontanaFoundedFebruary 7, 1919[1]SeatJordanLargest townJordanArea • Total4,847 sq mi (12,550 km2) • Land4,675 sq mi (12,110&...

 

American football player (born 1942) Not to be confused with Bull Curry or Bill Currey. For other people named William Curry, see William Curry (disambiguation). American football player Bill CurryNo. 50, 55Position:Center, linebackerPersonal informationBorn: (1942-10-21) October 21, 1942 (age 81)College Park, Georgia, U.S.Height:6 ft 3 in (1.91 m)Weight:235 lb (107 kg)Career informationHigh school:College ParkCollege:Georgia Tech (1961–1964)NFL draft:1964 ...

Japanese video game company Not to be confused with Atlas or Altus. This article is about the Japanese video game company. For its American subsidiary, see Atlus West. Atlus Co., Ltd.Headquarters at Osaki Garden Tower in Nishi-Shinagawa, TokyoNative name株式会社アトラスRomanized nameKabushiki gaisha AtorasuCompany typeSubsidiaryIndustryVideo gamesFounded7 April 1986; 38 years ago (1986-04-07) (as Atlus Co., Ltd.)5 September 2013; 10 years ago (2013-...

 

Indian film actor This article may require copy editing for tone and language. You can assist by editing it. (July 2023) (Learn how and when to remove this message) Sabyasachi MishraBornSabyasachi Mishra (1987-10-06) 6 October 1987 (age 36)Sambalpur, Odisha, IndiaNationalityIndianAlma materSilicon Institute of Technology, BhubaneswarOccupationsActormodelplayback SingerYears active2002–2007 As an Album Actor 2007 – Present as a Film ActorSpouses Seema Mishra ​ R...

 

土库曼斯坦总统土库曼斯坦国徽土库曼斯坦总统旗現任谢尔达尔·别尔德穆哈梅多夫自2022年3月19日官邸阿什哈巴德总统府(Oguzkhan Presidential Palace)機關所在地阿什哈巴德任命者直接选举任期7年,可连选连任首任萨帕尔穆拉特·尼亚佐夫设立1991年10月27日 土库曼斯坦土库曼斯坦政府与政治 国家政府 土库曼斯坦宪法 国旗 国徽 国歌 立法機關(英语:National Council of Turkmenistan) ...

This article is missing information about the film's reception. Please expand the article to include this information. Further details may exist on the talk page. (May 2021) 1989 British filmThe Lady and the HighwaymanDirected byJohn HoughWritten byBarbara Cartland (novel Cupid Rides Pillion)Terence Feely (screenplay)Produced byAlbert FennellJohn HoughPeter Manley Sir Lew Grade(executive producer)StarringHugh GrantLysette AnthonyCinematographyTerry ColeMusic byLaurie JohnsonDistributed byGain...

 

Marchese di SalisburyCorona araldica Sero sed serioFasciato di 10 pezzi (argento e azzurro), sul tutto partito di sei scudi di nero tre, due e uno, ciascuno incaricato di un leone rampante di argento ParìaParìa di Gran Bretagna Data di creazione1789 Creato daGiorgio III del Regno Unito Primo detentoreJames Cecil, I marchese di Salisbury Attuale detentoreRobert Gascoyne-Cecil, VII marchese di Salisbury Trasmissioneal primogenito maschio Titoli sussidiariConte di SalisburyVisconte CranborneBa...

 

18th-century British naval officer and explorer For other people named Philip Carteret, see Philip Carteret (disambiguation). Philip CarteretBorn(1733-01-22)22 January 1733Trinity Manor, JerseyDied21 July 1796(1796-07-21) (aged 63)Southampton, EnglandPlace of burialAll Saints' Church, Southampton(Destroyed by WW2 bombing)Allegiance Great BritainService/branch Royal NavyYears of service1747–1794RankRear AdmiralCommands heldSwallowEndymionRelationsCarteret family Rear-Admiral Philip...

Politeknik Kesehatan Kementerian Kesehatan SurabayaLogo Poltekkes Kemenkes SurabayaJenisPoliteknik KesehatanDidirikan12 Nopember 2001Lembaga indukKementerian Kesehatan Republik IndonesiaRektorLutfi Rusyadi, SKM, M.ScLokasiSurabaya, IndonesiaSitus webpoltekkesdepkes-sby.ac.id Politeknik Kesehatan Kementerian Kesehatan Surabaya (disingkat Poltekkes Kemenkes Surabaya atau Polkesbaya) adalah sebuah institusi pendidikan tenaga profesional di bidang kesehatan di bawah naungan Kementerian Kesehatan ...

 

Part of a series on theOlympic water polorecords and statistics Topics Overall statistics men women Champions men women Team appearances men women Player appearances men women Medalists men women Top goalscorers men women Goalkeepers men women Flag bearers and oath takers Venues Teams Men's teams Australia Belgium Brazil Canada Croatia Egypt France Germany Great Britain Greece Hungary Italy Japan Kazakhstan Montenegro Netherlands Romania Russia Serbia Serbia and Montenegro Soviet Union Spain...

 

Large stone used to build a structure or monument Dolmen at Ganghwa Island, South Korea (c. 300 BC) Megalithic Batu Brak in Batu Brak District, West Lampung Regency, Lampung Province, Indonesia (c. 2100 BC) Megalithic grave Harhoog in Keitum, Sylt, Germany (c. 3000 BC) A megalith is a large stone that has been used to construct a prehistoric structure or monument, either alone or together with other stones. There are over 35,000 in Europe alone, located widely from Sweden to the Mediterranean...

  Grand Prix Austria 2020Detail lombaLomba ke 5 dari 15Grand Prix Sepeda Motor musim 2020Tanggal16 Agustus 2020Nama resmimyWorld Motorrad Grand Prix von ÖsterreichLokasiRed Bull Ring, Spielberg, Styria, AustriaSirkuitFasilitas balapan permanen4.318 km (2.683 mi)MotoGPPole positionPembalap Maverick Viñales YamahaCatatan waktu 1:23.450 Putaran tercepatPembalap Álex Rins SuzukiCatatan waktu 1:24.007 di lap 7 PodiumPertama Andrea Dovizioso DucatiKedua Joan Mir SuzukiKetiga ...

 

Kiziba refugee camp in the west of Rwanda, 2014 Refugee camp in Beirut, c. 1920–25 Temporary settlement for refugees Refugee camp (located in present-day eastern Congo-Kinshasa) for Rwandans following the Rwandan genocide of 1994 A camp in Guinea for refugees from Sierra Leone Nahr el-Bared, Palestinian refugee camp in North Lebanon in 2005Mitzpe Ramon, development camp for Jewish refugees, southern Israel, 1957 A refugee camp is a temporary settlement built to receive refugees and pe...

 

Disambiguazione – Se stai cercando gli album intitolati Domenico Modugno, vedi Domenico Modugno (disambigua). Domenico ModugnoDomenico Modugno a Partitissima nel 1967 Nazionalità Italia GenereMusica leggeraMusica d'autoreCanzone napoletanaFolk Periodo di attività musicale1953 – 1994 EtichettaRCA Italiana, Fonit, Curci, Carosello, Panarecord Album pubblicati30 Studio26 Live4 Raccolte(numerose) Sito ufficiale Modifica dati su Wikidata · Manuale Domenico Modu...

Student union of University of Liverpool Not to be confused with Liverpool Students' Union. Liverpool Guild of StudentsInstitutionUniversity of LiverpoolLocationLiverpoolEstablished1889PresidentVasiliki SamuelsOther officers Lina Dubbins (Deputy President) Kathryn Manley (Vice-President) Rowan Bradbury (Vice-President) AffiliationsNational Union of Students, Aldwych GroupWebsitewww.liverpoolguild.org Liverpool Guild of Students is the students' union of the University of Liverpool.[1]...

 

Pour les articles homonymes, voir Saint-Quentin (homonymie). Vous lisez un « bon article » labellisé en 2015. Saint-Quentin-sur-Indrois Le village vu du sud. Administration Pays France Région Centre-Val de Loire Département Indre-et-Loire Arrondissement Loches Intercommunalité Communauté de communes Loches Sud Touraine Maire Mandat Cécyl Deruyver-Averland 2020-2026 Code postal 37310 Code commune 37234 Démographie Populationmunicipale 486 hab. (2021 ) Densité 18 ...

 

English surgeon William Sands Cox, drawing by Thomas Herbert Maguire William Sands Cox (1802 in Birmingham – 23 December 1875 in Kenilworth[1]) was a surgeon in Birmingham, England. He founded Birmingham's first medical school in 1825[2] as a residential Anglican-based college in Temple Row, where a blue plaque commemorates him on the House of Fraser department store, and in Brittle Street (now obliterated by Snow Hill station). Cox went on to found the Queen's Hospital in B...

City in Minnesota, United States Lake Crystal redirects here. For the nearby lake, see Lake Crystal (Blue Earth County, Minnesota). City in Minnesota, United StatesLake CrystalCityMain Street in 2019Motto: The Place To BeLocation of Lake Crystal, MinnesotaCoordinates: 44°06′19″N 94°13′08″W / 44.10528°N 94.21889°W / 44.10528; -94.21889CountryUnited StatesStateMinnesotaCountyBlue EarthGovernment • TypeMayor - Council • MayorBrad A...

 

Polish cultural golden age RenaissanceThe School of Athens (1509–1511) by Raphael Aspects Architecture Dance Fine arts Greek scholars Humanism Literature Magic Music Philosophy Science Technology Warfare Regions England France Germany Italy Poland Portugal Spain Scotland Northern Europe Low Countries History and study Age of Discovery Continuity thesis High Renaissance vte Part of a series on theCulture of Poland History Middle Ages Renaissance Baroque Enlightenment Romanticism Positivism Y...