Ohjelmistoarkkitehtuurit Kevät 2016 Suunnittelumallit Samuel Lahtinen http://www.cs.tut.fi/~ohar/ Ohjelmistoarkkitehtuurit 2016 1
Yleistä Visio ja UML 2.x: http://www.softwarestencils.com/uml/
Komponenteista Komponenttikauppoja, vapaan lähdekoodin komponenttikirjastoja, esimerkkejä: http://www.syncfusion.com/ http://www.infragistics.com/ https://vaadin.com/directory#browse http://jqueryui.com/ Esimerkki komponenteista 1: Javascript ja komponentit HTML:ssä skriptin src:n kertominen tai riippuvuuksien hallintatyökalut (require.js jne.) Komponentti/kirjasto: julkinen rajapinta ja koodia Ohjelmistoarkkitehtuurit 2016 3
Komponenteista Esimerkki komponenteista (Windows-maailma): Ennen.NET ympäristöä, COM-komponentteja Id:t, komponenttien rekisteröinti (Windows-rekisteriin), omia tietotyyppejä, mahdollisuus käyttää.net yhteinen ajoympäristö, eri kielillä toteutetut komponentit käytettävissä ristiin helposti Ohjelmistoarkkitehtuurit 2016 4
5. Suunnittelumallit Suunnittelumallin käsite Suunnittelumallien hyötyjä Suunnittelumallien kuvaaminen Esimerkki: Rekursiokooste Antisuunnittelumallit Suunnittelumallit ja UML Mallikielet Suunnittelumallit eivät ole... Yhteenveto http://www.enteract.com/~bradapp/docs/patterns-intro.html http://www.hillside.net/patterns/ Ohjelmistoarkkitehtuurit 2016 5
Suunnittelumallin käsite: tausta Cristopher Alexander et al. A Pattern Language: Towns, Buildings, Construction, 1977 Cristopher Alexander The Timeless Way of Building, 1979 Maailma koostuu toistuvista tiettyjen mallien ilmentymistä Tarkoitukseen soveltuvuus jne 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 Ohjelmistoarkkitehtuurit 2016 6
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. Ohjelmistoarkkitehtuurit 2016 7
Tukikaari (Flying buttress) Ohjelmistoarkkitehtuurit 2016 8
Mikä on suunnittelumalli? Suunnittelumalli Yleinen ratkaisu usein esiintyvään ohjelmistojen arkkitehtuuri- tai suunnitteluongelmaan tietyssä yhteydessä. Ohjelmistoarkkitehtuurit 2016 9
Selitystä Yleinen ratkaisu... ei liity tiettyyn kieleen tai teknologiaan, kuvataan yleisellä tavalla... usein esiintyvään... täytyy olla käytännön validoima (esim. GoF: 3 esimerkkiä)... arkkitehtuuri- tai suunnitteluongelmaan... sovelletaan ohjelmistotekniikassa arkkitehtuurin ja yksityiskohtaisen suunnittelun tasolla... tietyssä yhteydessä. ongelma esiintyy yhteydessä, josta seuraa erilaisia vaatimuksia ja voimia Ohjelmistoarkkitehtuurit 2016 10
Suunnittelumallien hyötyjä Suunnittelumallit... tuovat piilossa olevaa suunnittelutietämystä kaikkien saataville; auttavat järjestelmän dokumentoinnissa; antavat uuden korkeamman tason toteutusvälineen; toimivat arkkitehtuurin rakennuspalikoina; antavat suunnittelijoille yhteisen sanaston. Ohjelmistoarkkitehtuurit 2016 11
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 Ohjelmistoarkkitehtuurit 2016 12
GoF:in kuvausformaatti "Gang of Four kirja, GoF: 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 Ohjelmistoarkkitehtuurit 2016 13
Esimerkki suunnittelumallista: Rekursiokooste (composite) Ongelma: Olioita käyttävä komponentti tee joku operaatio lehtiolioille Ohjelmistoarkkitehtuurit 2016 14
http://www.codeproject.com/articles/185797/composite-design-pattern
Rekursiokooste (Composite) suunnittelumalli Nimi: Rekursiokooste Konteksti: Hierarkkinen oliokokoelma, jonka (lehti)olioille halutaan tehdä jokin operaatio. Ongelma: Kuinka hallita hierarkkisesti järjestettyä oliokokoelmaa niin, että kokoelman käyttäjän ei tarvitse tuntea rakenteen organisointitapaa? Ratkaisu: Käyttäjä Item operation() * children Leaf operation() Composite operation() For all children c: c.operation() Ohjelmistoarkkitehtuurit 2016 16
Rekursiokooste (jatkuu) 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 (ei mahdollista rajoittaa lehtiluokkien tyyppiä tietyssä haarassa/vaiheessa) Ohjelmistoarkkitehtuurit 2016 17
Esimerkki soveltamisesta SourceManager <<interface>> Source delete() print() * children File delete() print() Folder delete() print() add(source) For all children c: c.delete(); Delete folder Yleisesti, vähän joka puolella, esim. Java Swing, Java JSF UI Ohjelmistoarkkitehtuurit 2016 18
Patterneista Perinteiset GOF-tyylin suunnittelumallit usein toteutusmallihenkisiä Kun vaihdetaan toiseen ohjelmointiparadigmaan, osa malleista menettää merkityksensä (ongelmaa ei ole tai sen ratkaisu on triviaali, esim. funktionaaliset kielet ja erilaiset luontipatternit tai delegointipatternit) Ohjelmistoarkkitehtuurit 2016 19
Kysyttävää? Ohjelmistoarkkitehtuurit 2016 20
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 Ohjelmistoarkkitehtuurit 2016 21
Esimerkki: Mallikieli koneenohjausjärjestelmille Ohjelmistoarkkitehtuurit 2016 22
sama nykyään Ohjelmistoarkkitehtuurit 2016 23
Esimerkki: Organisaatiopatternit Ohjelmistoarkkitehtuurit 2016 24
Pilveä http://cloudcomputingpatterns.org https://msdn.microsoft.com/en-us/library/dn568099.aspx Ohjelmistoarkkitehtuurit 2016 25
J2EE Ohjelmistoarkkitehtuurit 2016 26
Pattern language for writing patterns
patternkielen organisointitapoja Hierarkkinen rakenne: Malli A 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 Malli D pienempiä osia. Malli B Malli E Malli C Alexanderin mallikieli Ohjelmistoarkkitehtuurit 2016 29
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. Mallin C soveltaminen luo kontekstin Malleille A, D ja E. Malli B Malli D Malli C Ohjelmistoarkkitehtuurit 2016 30
Mallikielen organisointitapoja Yleistysrakenne: Malli A on abstrakti kuvaus ratkaisusta, joka voidaan tarkemmin toteuttaa tavalla B tai tavalla C. Malli A Malli B Malli C Ohjelmistoarkkitehtuurit 2016 31
Mallikielen organisointitapoja Implisiittinen rakenne: Malli A pre post Kullekin mallille annetaan esija jälkikonteksti: missä tilanteessa mallia voidaan soveltaa, ja mihin tilanteeseen malli jättää arkkitehtuurin. Jos mallin A jälkikonteksti vastaa mallin B esikontekstia, voi B:tä soveltaa A:n jälkeen = pre Malli B post Ohjelmistoarkkitehtuurit 2016 32
Mallikielen organisointitapoja Sovellusalueen mukainen rakenne, esimerkiksi domain-malliin perustuen Helpottaa kysymystä: mitä mallia voisi tietyssä tilanteessa soveltaa? Antaa viitteitä puuttuvista malleista Ohjelmistoarkkitehtuurit 2016 33
Antisuunnittelumallit (vastasuunnittelumallit) (antipatterns)
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. Ohjelmistoarkkitehtuurit 2016 35
Dokumentoituja antisuunnittelumalleja The Blob Vendor lock-in Golden Hammer Lava flow Spaghetti Code Copy Paste Programming Magic push button https://sourcemaking.com/antipatterns/software-development-antipatterns http://www.antipatterns.com/ https://en.wikibooks.org/wiki/introduction_to_software_engineering/architecture/anti-patterns http://en.wikipedia.org/wiki/anti-pattern Ohjelmistoarkkitehtuurit 2016 36
Mitä huonoja ratkaisutapoja olet tunnistanut oliojärjestelmissä? Ohjelmistoarkkitehtuurit 2016 37
Antisuunnittelumallien oireita Huono ylläpidettävyys Huono uudelleenkäytettävyys Huono laajennettavuus Vaikeasti ymmärrettävä Tehottomuus Kooditasolla code smell ja anti patternit liittyvät osin toisiinsa Duplikoitua koodia, pitkiä metodeja, liikaa parametreja, turha monimutkaisuus, sykliset riippuvuudet, Ohjelmistoarkkitehtuurit 2016 38
Antisuunnittelumallikieli/ Haisevan koodin kieli? http://mikamantyla.eu/badcodesmellstaxonomy.html Ohjelmistoarkkitehtuurit 2016 39
Suunnittelumallit ja UML: Kollaboraatiosymboli 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 Ohjelmistoarkkitehtuurit 2016 40
Esimerkki 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() Ohjelmistoarkkitehtuurit 2016 41
Suunnittelumallit ja UML: Stereotyypit SourceManager <<Composite_Item>> Source delete() print() * children <<Composite_Leaf>> File delete() print() <<Composite_Composite>> Folder delete() print() add(source) For all children c: c.delete(); Delete folder Ohjelmistoarkkitehtuurit 2016 42
Suunnittelumallit eivät ole Eivät ole vain Design Patterns kirjan toteutusmalleja, vaan paljon muutakin. Ei vain yksinkertaisia muutaman olion vuorovaikutusrakenteita yleinen lääke ohjelmiston laadun parantamiseen; ongelmattomia: arkkitehtuurin monimutkaistuminen, koodin kompleksisuuden kasvu mahdollinen ongelman yliratkaisu tehokkuushäviö: runsaasti dynaamista sidontaa ja kutsun siirtämistä olion identiteetti hämärtyy: olioskitsofrenia väärin käytettynä tekevät ohjelmasta vaikeammin ymmärrettävän tarvitsevat hyvän dokumentoinnin järjestelmässä Perinteiset (GOF) suunnittelumallit usein toteuttajan ja alijärjestelmän suunnittelijan työkaluja Anti-arkkitehtuuridokumentaatio: ylimalkainen kertomus järjestelmän toiminnasta ja iso lista suunnittelumalleja, joilla luvataan järjestelmän täyttävän kaikki mieleen tulevat laatuominaisuudet Ohjelmistoarkkitehtuurit 2016 43
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 Suunnittelumallien organisointi mallikieliin Antisuunnittelumallit auttavat tunnistamaan ongelmakohtia Ohjelmistoarkkitehtuurit 2016 44
Linkkejä Patterniesimerkkejä: http://sourcemaking.com/antipatterns patterns.cs.tut.fi http://www.hillside.net/patterns/ http://addyosmani.com/resources/essentialjsdesignpatterns/book/ http://balusc.blogspot.fi/2010/04/examples-of-gof-design-patterns.html Haisevaa koodia: http://c2.com/cgi/wiki?codesmell http://mikamantyla.eu/badcodesmellstaxonomy.html http://blog.codinghorror.com/code-smells/ Kirjallisuutta (näitä riittää vaikka kuinka) Hanmer, Robert: Pattern-Oriented Software Architecture for Dummies (2nd Edition) 2012 Designing Distributed Control Systems: A Pattern Language Approach, 2014 Veli-Pekka Eloranta, Johannes Koskinen, Marko Leppanen, Ville Reijonen Buschmann et al.: A System of Patterns - Pattern-Oriented Software Architecture. Wiley 1996. Douglass B.: Real-Time Design Patterns: Robust Scalable Architecture for Real-Time Systems. Addison-Wesley 2003. Gamma E. et al.: Design Patterns - Elements of Reusable Object-Oriented Software. Addison-Wesley 1995. Hohpe G., Woolf B.: Enterprise Integration Patterns. Addison-Wesley 2004. Allan Kelly: Business Patterns for Software Developers 2012 (ebrary/tut-kirjasto), kaikkea markkinoinnista jakeluun
Kysyttävää? Ohjelmistoarkkitehtuurit 2016 46