5. Suunnittelumallit Suunnittelumallin käsite Suunnittelumallien hyötyjä Suunnittelumallien kuvaaminen Antisuunnittelumallit Esimerkki: Rekursiokooste Suunnittelumallit ja kehykset Suunnittelumallit ja UML Mallikielet Suunnittelumallit eivät ole... Yhteenveto http://www.enteract.com/~bradapp/docs/patterns-intro.html http://www.hillside.net/patterns/ 1
Suunnittelumallin käsitek Cristopher Alexander et al.: A Pattern Language, 1977 Cristopher Alexander: The Timeless Way of Building, 1979 Maailma koostuu toistuvista tiettyjen mallien ilmentymistä Esimerkki: Jokainen maanviljelijä osaa rakentaa ladon - miksi? Malli (pattern) on yleistä suunnitteluosaamista, joka olisi saatettava kaikkien tarvitsijoiden ulottuville Alexander: mallien käyttö johtaa hyvään laatuun Paljon käytetty eri muodoissa insinöörialoilla Erityisen hyödyllinen ajatus ohjelmistotekniikassa 2
Esimerkki: Ikkunat ja ovet hirsitalossa hirret painuvat kasaan Ongelma: ikkunat ja ovet ovat kiinteitä, vaikka hirsiseinä liikkuu ja painuu kasaan. Ratkaisu: ikkunoiden ja ovien karmeja ei kiinnitetä suoraan seinään, vaan "karaan", joka liikkuu vapaasti hirsiin tehdyssä urassa. 3
Mikä on suunnittelumalli? Suunnittelumalli Yleinen ratkaisu usein esiintyvään arkkitehtuuritai suunnitteluongelmaan tietyssä yhteydessä. 4
Selitystä Yleinen ratkaisu... ei liity tiettyyn kieleen tai teknologiaan,. kuvataan yleisellä tavalla... usein esiintyvään... täytyy olla useita soveltamiskohteita (esim. GoF: 3)... arkkitehtuuri- tai suunnitteluongelmaan... sovelletaan ohjelmistotekniikassa arkkitehtuurin ja yksityiskohtaisen suunnittelun tasolla... tietyssä yhteydessä. ongelma esiintyy yhteydessä, josta seuraa erilaisia vaatimuksia ja voimia 5
Suunnittelumallien hyötyj tyjä Suunnittelumallit... tuovat piilossa olevan suunnittelutietämyksen kaikkien saataville; auttavat järjestelmän dokumentoinnissa; antavat uuden korkeamman tason toteutusvälineen; toimivat arkkitehtuurin rakennuspalikoina; antavat suunnittelijoille yhteisen sanaston. 6
Suunnittelumallin kuvaus Keskeiset osat: Nimi Konteksti Ongelma Ratkaisu Seuraukset Kuvaava ytimekäs nimi, tulee osaksi yhteistä sanastoa Lähtötilanne Ongelman ja siihen vaikuttavien tekijöiden kuvaus, oletukset, esimerkki Luokkien ja olioiden organisointi ongelman ratkaisemiseksi (esim. käyttäen UML:ää) Lopputilanne, ratkaisun edut ja haitat 7
"Gang of Four kirja, GoF: GoF:in kuvausformaatti Gamma E., Helm R., Johnson R., Vlissides J.: Design Patterns - Elements of Reusable Object-Oriented Software. Addison-Wesley 1995. Name (and category) Intent Also known as Motivation Applicability Structure Participants Collaborations Consequences Implementation Sample code Known uses Related patterns 8
Antisuunnittelumallit Ongelma Suunnittelumalli Hyvä ratkaisu Seuraukset Antisuunnittelumalli Huono ratkaisu Oireet Muokkaus Antisuunnittelumalli = huono ratkaisu + hyvä ratkaisu Suunnittelumalli = ongelma + ratkaisu Brown W.J. et al.: Antipatterns - Refactoring Software, Architectures, and Projects in Crisis. Wiley 1998. 9
Dokumentoituja antisuunnittelumalleja The Blob Lava flow Golden Hammer Spaghetti Code Cut-and-Paste Programming http://www.antipatterns.com/dev_cat.htm 10
Antisuunnittelumallien oireita Huono ylläpidettävyys Huono uudelleenkäytettävyys Huono laajennettavuus Vaikeasti ymmärrettävä Tehottomuus 11
Vihjeitä antisuunnittelumallien käytk ytöstä Koodin toistoa Mahdolliset vaihtoehdot jollekin asialle kiinnitetään staattisesti koodissa Suuria luokkia ja operaatioita 12
Mitä huonoja ratkaisutapoja olet tunnistanut oliojärjestelmiss rjestelmissä? 13
Esimerkki suunnittelumallista: Rekursiokooste (Composite) Ongelma: kuinka hallita hierarkkisesti järjestettyä oliokokoelmaa niin, että kokoelman käyttäjän ei tarvitse tuntea rakenteen organisointitapaa? Käyttäjä tee joku operaatio lehtiolioille 14
Suunnittelumallin kehittäminen (1) Ensimmäinen ratkaisu: kaksi tasoa Composite forall() * children Leaf operation() if X is Composite then X.forall() else X.operation;... For all children c: c.operation() Seuraukset: - Koosteoliot ja lehtioliot käsitellään eri tavalla koodissa - Vaikea laajentaa ratkaisua uusille kooste- ja lehtioliotyypeille - Sallii vain kaksi tasoa - Ei tue usean tyyppisiä olioita if X is Composite then Op1(, X, ) else Op2(, X, );... 15
Suunnittelumallin kehittäminen (2) Toinen ratkaisu: Yhdistetään kooste- ja lehtiolioluokat * children Item operation() íf I have children then for all children c: c.operation() else dosomething(); Seuraukset: - Kooste- ja lehtioliot käsitellään samalla tavalla - Rajoittamaton hierarkia - Vain yhden tyyppisiä olioita -> koodiin tulee haarautumisia todellisen tyypin perusteella, jos sellaisia on useita - Operaation koodissa kooste vs. lehti haarautuminen Client: item.operation() if item.kind == thiskind then { } 16
Suunnittelumallin kehittäminen (3) Kolmas ratkaisu: Eri tyyppisiä olioita Seuraukset: - Kuten edellä, paitsi että erityyppiset oliot eivät aiheuta haarautumisia koodissa - Silti, yksi tyyppipohjainen haarautuminen jää: kooste vs. lehti * Item children operation() íf I have children then for all children c: c.operation() else dosomething1() Item1 operation() Item2 operation() íf I have children then for all children c: c.operation() else dosomething2() 17
Suunnittelumallin kehittäminen (4) Neljäs ratkaisu: Erotetaan kooste- ja lehtiluokat * children Item operation() Item1 Composite dosomething operation() operation() for all children c: c.operation() 18
Rekursiokooste (Composite) suunnittelumalli Nimi: Rekursiokooste Ongelma: Kuinka hallita hierarkkisesti järjestettyä oliokokoelmaa niin, että kokoelman käyttäjän ei tarvitse tuntea rakenteen organisointitapaa?? Ratkaisu: Item operation() * children Leaf operation() Composite operation() For all children c: c.operation() 19
Rekursiokooste (jatkuu) Soveltuu, kun: haluat esittää hierarkkisesti järjestettyjä oliokokoelmia, haluat että oliokokoelman käyttäjät eivät tule riippuvaiseksi kokoelman organsiointitavasta. Seuraukset: Hierarkiarakenne ei näy käyttäjän koodissa Käyttäjän koodi yksinkertaistuu Rakenteeseen on helppo lisätä uusia kooste- ja lehtiluokkia (ei näy käyttäjälle) Pieni tehokkuusrasite kutsun siirtämisen takia 20
Rekursiokooste (jatkuu) Toteutusnäkökohtia Tarvitaanko linkit lehti kooste molempiin suuntiin? Voiko samalla oliolla olla useita kooste-vanhempia? Yhteinen rajapinta vs. tyyppiturvallisuus? (ks. seur. kalvo) Onko lapsiolioilla järjestys? Kuka luo ja hävittää rakenteen? 21
Rajapinnat Item operation( ) Container add( ) remove( ) User Builder Leaf operation( ) Composite operation( ) add( ) remove( ) 22
Esimerkki soveltamisesta SourceManager <<interface>> Source delete() print() * children File delete() print() Folder delete() print() add(source) For all children c: c.delete(); Delete folder 23
Esimerkki soveltamisesta (Tässä draw voi tehdä jotain yhteisiä aloitustoimenpiteitä) Graphicaltem draw * children Rectangle Circle FigGroup draw draw draw for all children c: c.draw; 24
Suunnittelumallit ja kehykset Graphicaltem draw * children Rectangle Circle FigGroup draw draw draw for all children c: c.draw; 25
Suunnittelumalli ja sen ilmentymä Suunnittelumallin louhinta Suunnittelumalliluettelo Suunnittelumalli Osittainen suunnittelumallin ilmentymä Kehys Suunnittelumallin ilmentymä Sovellus Suunnittelumallin toteutus 26
Suunnittelumallit ja UML Item Composite SourceManager Source delete() print() * Leaf children Composite File delete() print() Folder delete() print() add(source) For all children c: c.delete(); Delete folder 27
Suunnittelumallit ja UML EventSource register(statemachine) * informs * StateMachine run(state) handle(event) 1 Singleton State Observer 1 Event source(): Object current.exit(); current = current.transit(e); current.entry(); uses 0..1 current State transit(event): State entry() exit() Event1 source(): Object Event2 source(): Object StateA transit(event): State entry() exit() StateB transit(event): State entry() exit() 28
Stereotyyppien käyttk yttö <<Composite:item>> Statement * execute() <<Composite:leaf>> SimpleStatement execute() <<Composite: composite>> Block execute() children 29
Mallikielet Suunnittelumallikieli: Systemaattisesti organisoitu kokoelma suunnittelumalleja, jotka kattavat jonkin ongelma-alueen keskeiset ratkaisut. Systemaattisesti organisoitu: mallit liittyvät toisiinsa joillakin suhteilla (esim. hierarkkinen, verkko), jotka auttavat valitsemaan sopivat mallit sopivassa järjestyksessä. => Kieltä voidaan soveltaa kokonaisuutena, ideaalisti se generoi järjestelmän arkkitehtuurin 30
Mallikielen organisointitapoja Hierarkkinen rakenne: Käytä ensin mallia A, sen jälkeen mallia B tai C osaongelmien ratkaisuun, jos käytät B:tä, käytä sen jälkeen mallia D tai E jne. Mallit koskevat ko. kohteen pienempiä ja pienempiä osia. Malli B Malli A Malli C Malli D Malli E 31
Mallikielen organisointitapoja Verkkorakenne: Malli A Malli E Jos olet käyttänyt mallia C, on mahdollista, että mallit A ja D ja E saattaisivat auttaa jonkin C:stä seuraavan ongelman ratkaisussa. Jim: refines suhde vain Malli B Malli D Malli C 32
Mallikielen organisointitapoja Yleistysrakenne: Malli A on abstrakti kuvaus ratkaisusta, joka voidaan tarkemmin toteuttaa tavalla B tai tavalla C. Malli A Jim: ei tällaisia Malli B Malli C 33
Mallikielen organisointitapoja Implisiittinen rakenne: Malli A pre post Kullekin mallille annetaan tuloja jättökonteksti: missä tilanteessa mallia voidaan soveltaa, ja mihin tilanteeseen malli jättää arkkitehtuurin. Jos mallin A jättökonteksti vastaa mallin B tulokontekstia, voi B:tä soveltaa A:n jälkeen = pre Malli B post 34
Mallikielen organisointitapoja 2-ulott. Kehikkorakenne: dimensio 1: dimensio 1: Kehikko voi liittyä esimerkiksi järjestelmän vaatimuksiin tai ominaisuuksiin. dim. 2: luokka luokka x Malli A luokka y Malli D Valitaan ne mallit, jotka ovat kehikossa ko. järjestelmää vastaavissa kohdissa. u dim. 2: luokka Malli B Malli E Esimerkkejä dimensioista: muunneltavuus, tehokkuus, järjestelmätyyppi, ylemmän tason ratkaisu, ym. (suunnittelumallit) v dim. 2: luokka w Malli C Malli F 35
Suunnittelumallit eivät t ole yleinen lääke ohjelmiston laadun parantamiseen; ongelmattomia: arkkitehtuurin monimutkaistuminen mahdollinen ongelman yliratkaisu (overkill) tehokkuushäviö: runsaasti dynaamista sidontaa olion identiteetti hämärtyy: olioskitsofrenia tarvitsevat hyvän dokumentoinnin järjestelmässä 36
Yhteenvetoa Suunnittelumallit antavat hyväksi havaittuja ratkaisuja yleisiin suunnitteluongelmiin Käytä suunnittelumallia vasta kun ongelma on selvästi ymmärretty Suunnittelumallit ovat kokemusperäistä tietoa, eivät innovaatioita 37