Ohjelmistoarkkitehtuurit Kevät 2014

Samankaltaiset tiedostot

Ohjelmistoarkkitehtuurit kevät

4. Komponenttien vuorovaikutus

4. Komponenttien vuorovaikutus

Roolirajapinnat Välittäjät Fasaadit Kutsun siirtäminen Edustajat Takaisinkutsut Tapahtumat Viestit Sovittimet Tehtaat

Ohjelmistoarkkitehtuurit Johannes Koskinen.

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit

5. Suunnittelumallit. TTY Ohjelmistotekniikka

5. Suunnittelumallit. TTY Ohjelmistotekniikka

Ohjelmistoarkkitehtuurit

4 Managing component interactions

Ohjelmistoarkkitehtuurit Kevät 2016 Suunnittelumallit

5. Design patterns. TTY Ohjelmistotekniikka

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

12. Kehysarkkitehtuurit

Viestinvälitysarkkitehtuurit

Viestinvälitysarkkitehtuurit Lähtökohta:

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

TIE Ohjelmistojen suunnittelu

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Oliosuunnittelu. Oliosuunnittelu

Ohjelmistoarkkitehtuurit

Sisällys. Ratkaisumallien historia. Ratkaisumalli. Ratkaisumalli [2] Esimerkki: Composite [2] Esimerkki: Composite. Jaakko Vuolasto 25.1.

TIE Ohjelmistojen suunnittelu

Tarjolla tänään: Sanastoa Koneenohjausjärjestelmien suunnittelumallit. Pattern Architecture Style. GoF. Design pattern

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

Kehyspohjainen ohjelmistokehitys

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

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

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

Suunnittelumalleja, MVC. Juha Järvensivu 2008

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistoarkkitehtuurit Kevät 2014 Arkkitehtuurityylit vol 2

Ohjelmistoarkkitehtuurit. Kevät

T Henkilökohtainen harjoitus: FASTAXON

Ohjelmistoarkkitehtuurit. Kevät

6. Arkkitehtuurityylit

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

TIE Ohjelmistojen suunnittelu

3. Komponentit ja rajapinnat

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VI Johdanto suunnittelumalleihin

7 Viestipohjaisten yritysjärjestelmien suunnittelumallit

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Ohjelmistojen mallintaminen, suunnittelumalleja

6. Arkkitehtuurityylit

Hirviö. Design Patterns

Osio 4: Graafinen käyttöliittymä

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit. Syksy 2008

Web Services tietokantaohjelmoinnin perusteet

Ohjelmistojen mallintaminen, sekvenssikaaviot

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

Ohjelmistoarkkitehtuurit. Syksy 2010

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistoarkkitehtuurit Kevät käytäntöjä

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Integrointi. Ohjelmistotekniikka kevät 2003

Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit Johannes Koskinen. Osittavat arkkitehtuurityylit

Ohjelmistoarkkitehtuurit

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Ohjelmistoarkkitehtuurit kevät

Suunnittelumallit (design patterns)

Hirviö. Design Patterns

Ohjelmistoarkkitehtuurit. Kevät

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmistoarkkitehtuurit. Syksy 2007

HOJ J2EE & EJB & SOAP &...

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

UML- mallinnus: Tilakaavio

Veto-visualisointityökalu

Graafisen käyttöliittymän ohjelmointi

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

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

Ohjelmistoarkkitehtuurit kevät

Komponentit ja rajapinnat

Java-API, rajapinnat, poikkeukset, UML,...

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

Ohjelmistotuotanto, s

Ohjelmistotekniikan menetelmät, arkkitehtuuria ja rajapintoja

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Tapahtumat. Johdanto Ikkunointi Ikkunatapahtumat Päätapahtumasilmukka Tapahtumien käsittely Olioiden välinen kommunikointi.

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

HSMT J2EE & EJB & SOAP &...

UML -mallinnus TILAKAAVIO

Ohjelmistojen mallintaminen, mallintaminen ja UML

Kertaus: yleistys-erikoistus ja perintä

15. Ohjelmoinnin tekniikkaa 15.1

VisualStudio Pikaopas, osa 1: WEB sivujen suunnittelu

Ohjelmistoarkkitehtuurit Kevät käytäntöjä

Java ja grafiikka. Ville Sundberg

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

Ohjelmistoarkkitehtuurit Kevät 2014 Samuel Lahtinen (Johannes Koskinen) http://www.cs.tut.fi/~ohar/ 22.1.2014 1

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/ 22.1.2014 2

Suunnittelumallin käsite: tausta 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 22.1.2014 3

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. 22.1.2014 4

Tukikaari (Flying buttress) 22.1.2014 5

Mikä on suunnittelumalli? Suunnittelumalli Yleinen ratkaisu usein esiintyvään ohjelmistojen arkkitehtuuri- tai suunnitteluongelmaan tietyssä yhteydessä. 22.1.2014 6

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 22.1.2014 7

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. 22.1.2014 8

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 22.1.2014 9

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 22.1.2014 10

Esimerkki suunnittelumallista: Rekursiokooste Ongelma: Olioita käyttävä komponentti tee joku operaatio lehtiolioille 22.1.2014 11

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() 22.1.2014 12

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) 22.1.2014 13

Esimerkki soveltamisesta SourceManager <<interface>> Source delete() print() * children File delete() print() Folder delete() print() add(source) For all children c: c.delete(); Delete folder 22.1.2014 14

Kysyttävää? 22.1.2014 15

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. 22.1.2014 16

Dokumentoituja antisuunnittelumalleja The Blob Lava flow Golden Hammer Spaghetti Code Cut-and-Paste Programming http://www.antipatterns.com/ http://en.wikipedia.org/wiki/anti-pattern 22.1.2014 17

Antisuunnittelumallien oireita Huono ylläpidettävyys Huono uudelleenkäytettävyys Huono laajennettavuus Vaikeasti ymmärrettävä Tehottomuus 22.1.2014 18

Mitä huonoja ratkaisutapoja olet tunnistanut oliojärjestelmissä? 22.1.2014 19

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 22.1.2014 20

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() 22.1.2014 21

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 22.1.2014 22

Suunnittelumallit eivät ole Eivät ole vain GOF-patternit, vaan paljon muutakin. Ei vain yksinkertaisia muutaman olion vuorovaikutusrakenteita yleinen lääke ohjelmiston laadun parantamiseen; ongelmattomia: arkkitehtuurin monimutkaistuminen mahdollinen ongelman yliratkaisu tehokkuushäviö: runsaasti dynaamista sidontaa ja kutsun siirtämistä olion identiteetti hämärtyy: olioskitsofrenia 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 22.1.2014 23

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 Antisuunnittelumallit auttavat tunnistamaan ongelmakohtia 22.1.2014 24

Kysyttävää? 22.1.2014 25

Komponenttien vuorovaikutus Roolirajapinnat Välittäjät Fasaadit Kutsun siirtäminen Edustajat Takaisinkutsut Tapahtumat Viestit Sovittimet Tehtaat 26

Toteutusriippuvuuksien poistaminen rajapinnoilla A B A IB mitä A ei tunne B miten 27

Rooliperustaiset rajapinnat Client1 Services Server Client1 käyttää Server:iä eri roolissa ja siksi eri palveluja kuin Client2 Client2 Client1 Role1 Server Client2 Role2 28

Esimerkki VisualComponent Button EventSource 29

Hienojakoiset roolirajapinnat Asiakkaat X Y Z Roolit A B C D Palvelun tarjoajat P:n perinteinen rajapinta P Q Q:n perinteinen rajapinta 30

Komponenttien vuorovaikutuksen hallinta Joukko keskenään kommunikoivia komponentteja Ongelmia: komponenttien väliset riippuvuudet mutkikkaita ja vaikeita hallita jos jokin yhteistoiminta halutaan muuttaa, joudutaan jokaista osallistujaa muuttamaan komponentteja ei voi käyttää toisessa yhteydessä 31

Esimerkki ListBox TextField Button 32

Esimerkki Ilmanlaadun hallinta avaa ikkuna Ikkunoiden hallinta sulje ilmastointi Ilmastoinnin hallinta 33

Riippuvuuksien keskittäminen: Välittäjä (Mediator) Keskitetään vuorovaikutuksen kontrolli rajoittamalla komponenttien vastuut ja ottamalla käyttöön uusi komponentti, jonka vastuulla on vuorovaikutuksen hallinta Etuja: vuorovaikutus omana kokonaisuutena (välittäjä), voidaan muuttaa tai räätälöidä koskematta komponentteihin tekee komponentit riippumattomiksi toisistaan yksinkertaistaa kommunikaatiota (yksi-moneen, ei moni-moneen) Ongelma: keskitetty kontrolli voi kasvaa itsessään monimutkaiseksi 34

Esimerkki Coordinator widgetchange(widget) ListBox ListBoxI getselected(): str Dialog Coordinator Välittäjä TextField TextFieldI settext(str) Widget changed() Button ButtonI enable() 35

Tyypillinen vuorovaikutus ListBox DialogCoordinator TextField Button widgetchange getselected settext enable 36

Esimerkki Ilmanlaadun hallinta avaa ikkuna sulje ilmastointi Ikkunoiden hallinta Ilmastoinnin hallinta 37

Kysyttävää? 38

Kutsun siirtäminen (delegointi) Yleinen perusmekanismi monessa standardiratkaisussa B saa palvelupyynnön: palvelun varsinainen suorittaja Bimp opimp() imp op op() B op op() B Voi olla erilaisia syitä: - halutaan tehdä oheistoimintaa, joka ei näy palvelun pyytäjälle - halutaan pystyä helposti vaihtamaan toteutus dynaamisesti - halutaan muuttaa kutsumuotoa - halutaan piilottaa varsinainen suorittaja imp.opimp(); 39

Kutsun siirtäminen: esimerkki Chargable discount(int): int CustomerSupport discount(int): int Account Manager Customer KeyCustomer Support 40

Riippuvuuksien kuristaminen: Fasadi (Facade) Fasaadi alijärjestelmä alijärjestelmä 41

Fasadi (kulissi/julkisivu) suunnittelumalli Käytetään antamaan yksinkertainen, useimmille käyttäjille riittävä oletusliittymä monimutkaiseen alijärjestelmään Fasadi ei kuitenkaan täysin piilota alijärjestelmän komponentteja suoralta käytöltä Voidaan käyttää esimerkiksi kerrosarkkitehtuurissa antamaan kullekin kerrokselle yksinkertainen sisääntulokohta (ja rajapinta) Vrt. Välittäjä: yksisuuntainen palvelu, tyypillisesti fasaadi vain siirtää kutsun oikealle komponentille (tai mahdollisesti useille komponenteille) Fasadin käyttöä voidaan edelleen kaventaa roolirajapinnoilla 42

Esimerkki StudyRegister registerforsemester getstudentinfo StudentFacade StudentRegister regstudentforcourse unregstudentforcourse PaymentSystem 43

Komponenttiriippuvuuksien poistaminen edustajalla (Proxy) Edustaja: komponentti, joka edustaa toista komponenttia jossain yhteydessä ilman, että komponentin asiakkaat tietävät tätä. Tyypillisesti edustaja tekee palvelupyynnön yhteydessä jotain oheistoimintaa. Asiakas op op Palvelun Edustaja tarjoaja 44

Sovelluksia hajautetut järjestelmät (esim. EJB) viivästetty lataaminen (esim. oliokannat) älykkäät osoittimet... 45

Edustaja (Proxy) suunnittelumalli Client Services request()... actual.request() Proxy request() actual Server 46

Esimerkki: viivästetty lataaminen Navigator Map getname() getroute(from,to) varsinainen getroute palvelu return mapname; MapProxy CityMap if not loaded then map = loadfromfile(); loaded = true end; map->getroute() getname getroute getname getroute 47

Kysyttävää? 48

Riippuvuuksien poistaminen takaisinkutsuilla Takaisinkutsu Palvelun tarjoajalta sen pyytäjälle kesken palvelun tuleva kutsu. Tekniikka, jonka avulla palvelun pyytäjä voi saada kontrollin kesken palvelun suorituksen. Tavallisesti palvelu kuuluu johonkin yleiskäyttöiseen kirjastoon, joka ei saa tulla riippuvaksi kirjastoa käyttävistä sovelluksista. Takaisinkutsu mahdollistaa sovelluskohtaisen räätälöinnin yleiskäyttöisille palveluille ilman, että ne tulevat riippuviksi sovelluksista. 49

Takaisinkutsu (Callback) kirjasto sekvenssikaaviona: : Kirjasto : Sovellus palvelun kutsu palvelun kutsu paluu takaisinkutsu takaisinkutsu paluu palvelun paluu sovellus takaisinkutsu 50

Takaisinkutsurajapinta EngineUser warn(str) Takaisinkutsurajapinta run() Engine Yleiskäyttöinen if (oilpressure<limit) { user.warn();... myeng = new Engine(); myeng.setuser(this); myeng.start(); PowerSource start() stop() setuser(engineuser) Car setup() warn(str)... Sovelluskohtainen log.output("oil pressure low"); myeng.stop(); 51

Käytetään poikkeuksia? Voidaanko poikkeuksilla saada periaatteessa aikaan sama kuin takaisinkutsuilla? A Ei koskaan B Joskus C Aina 52

Poikkeuksilla Engine run() if (oilpressure<limit) {... throw new Oilpressure(); }... PowerSource start() throws Oilpressure stop() setuser(engineuser) setup():... myeng = new Engine(); myeng.setuser(this); try { myeng.start(); } catch (Oilpressure op) {warn("...");} Erot: Edut: Haitat: - ei takaisinkutsurajapintaa - käyttävän yksikön (Car) tulee varautua poikkeukseen - yksinkertaisempi - kirjastoyksikön ei tarvitse tietää mitään käyttävän yksikön operaatioista (edes takaisinkutsurajapintaa) - kirjastoyksikkö ei voi jatkaa tapahtuman käsittelyn jälkeen (tässä tosin ei ilmeisesti tarvitsekaan) -ohjelman suorituksen seuraus, poikkeusten mahdollinen väärinkäyttö normaalitilanteissakin(goto) Yleiskäyttöinen Car setup() warn(str)... Sovelluskohtainen log.output(str+": Oil pressure low"); myeng.stop(); 53

Kysyttävää? 54

Riippuvuuksien vähentäminen tapahtumien avulla Tapahtuma on ohjelman ajoaikainen tietoalkio, jonka synnyttää jokin komponentti, jonka syntymiseen reagoi yksi tai useampi komponentti ja joka häviää sen jälkeen kun ei ole olemassa enää komponenttia, jonka tulisi reagoida sen syntymiseen. Tapahtuman synnyttäjä ei tunne tapahtuman syntymään reagoivia yksiköitä 55

Perinteinen kutsu vs. tapahtuma Palvelun kutsuja Tapahtuman synnyttäjä Palvelun tarjoaja Tapahtuma Tapahtumaan reagoivat 56

Tapahtumat käyttöliittymissä GUI Käyttäjän komennot Tilamuutokset Sovelluslogiikka 57

Synkroninen takaisinkutsuihin perustuva tapahtumankäsittely rekisteröinti Synkroninen = tapahtuman aiheuttaja odottaa tapahtuman käsittelyä ennen kuin jatkaa. Reagoivat yksiköt Tapahtuman aiheuttaja ilmoitus tapahtumasta (takaisinkutsu) 58

Tarkkailija (Observer) suunnittelumalli Observer update(event) SourceComp obs src ObserverComp Source register(observer) unregister(observer) 59

Tapahtumien käsittely Javassa: Esimerkki ActionListener actionperformed(actionevent) JMenuItem obs src AppComp AbstractButton addactionlistener(actionlistener) 60

Viestipohjainen kommunikointi receive(message m) Viesti Komponentti 1 Komponentti 2 Komponentit toteuttavat geneerisen viestin vastaanottorajapinnan (ja käyttävät sitä suoraan tai viestinvälittäjän kautta) Komponentit kommunikoivat keskenään viestejä lähettämällä Viestien välittämisestä huolehtii usein erityinen komponentti (message dispatcher) 61

Rajapinnat vs. viestit Komponentit, Asiakas-palvelin, Web palvelut (SOA), C++, Java func A(X ) Rajapinta toteuttaa Palvelun tarjoaja Palvelun pyytäjä Viestinvälitysarkkitehtuurit, palveluväylät (ESB), Smalltalk Viesti ACTION = A PAR1 = X Viestin välittäjä lukee ja toteuttaa Palvelun tarjoaja Rajapinta kertoo mitä tehdään ja millä tiedolla, viesti voi kertoa mitä tahansa (mitä tehdään, kuka tekee, millä tiedolla). 62

Rajapintariippuvuuksien poistaminen sovittimilla Rajapinnan A mukainen palvelupyyntö Sovitin Rajapinnan B mukainen Komponentti 1 palvelupyyntö Komponentti 2 Sovitin: palvelun pyytäjän ja tarjoajan välillä oleva ohjelmayksikkö, joka tekee palvelun pyytäjän riippumattomaksi palvelun tarjoajan rajapinnasta. 63

Sovitin (Adapter) suunnittelumalli Client AbstractServices request() ConcreteServices concrequest()... adaptee.concrequest() Adapter request() adaptee Server 64

Sovitin ja tapahtumat Sovittimien käyttö riippumattomien komponenttien tapahtumapohjaisessa kommunikoinnissa rekisteröinti ilmoita tapahtumasta palvelukutsu Komponentti A Sovitin Komponentti B Ohjelmistoarkkitehtuurit 2012-2013 65

Luontiriippuvuuksien vähentäminen tehtaalla Ongelma: Miten ohjelmistoalusta tai yleiskäyttöiset komponentit voivat luoda sovelluskohtaisia olioita/komponenttiilmentymiä tulematta riippuvaisiksi sovelluskohtaisista luokista/komponenteista? Ohjelmistoarkkitehtuurit 2012-2013 66

Luontiriippuvuuksien vähentäminen tehtaalla FactoryRegistry register(factory) AppInit Factory create(): Product AppFactory <<create>> (alustus) Platform <<create>> (käyttö) Product service AppProduct Ohjelmistoarkkitehtuurit 2012-2013 67

Yksinkertainen tehdas: Tehdasmetodi (Factory Method) suunnittelumalli Product Creator factorymethod anoperation product = factorymethod();... AppProduct create ConcCreator factorymethod return new AppProduct(); Ohjelmistoarkkitehtuurit 2012-2013 68

Esimerkki Document open() close() use DocManager createdocument() newdocument() opendocument() doc = createdocument(); docs.add(doc); doc.open(); MyDocument open() close() create MyDocManager createdocument() return new MyDocument; Ohjelmistoarkkitehtuurit 2012-2013 69

Ongelma: Miten varmistaa yhdenmukaiset oliot? Alusta TAI MUTTA EI: Ohjelmistoarkkitehtuurit 2012-2013 70

Ratkaisu: yksi tehdasolio luo kaikki oliot yhdenmukaisesti ShapeFac tehdasluokka TwoDimFac ilmentymä tehdasolio käyttää Alusta luo ilmentymä ThreeDimFac factory class Ohjelmistoarkkitehtuurit 2012-2013 71

Abstrakti tehdas suunnittelumalli AbsFactory createproducta(): ProductA createproductb(): ProductB ProductA2 opera ProductA opera ProductA1 opera Alusta ProductB operb ProductB2 ProductB1 operb operb Factory1 <<create>> Factory2 <<create>> Ohjelmistoarkkitehtuurit 2012-2013 72

Abstrakti tehdas (Abstract Factory) suunnittelumalli: Esimerkki Sovellusalusta AbsFactory createbutton(): Button createmenu(): Menu WinFactory Button Menu <<create>> WinButton WinMenu Ohjelmistoarkkitehtuurit 2012-2013 73

Yhteenvetoa Roolirajapinnoilla täsmällisemmin tyypitetty arkkitehtuuri Välittäjän käyttö keskitettyyn vuorovaikutukseen Kutsun siirtäminen perusmekanismi monessa ratkaisussa Fasaadi keskittää alijärjestelmän käytön Edustajalla voidaan liittää palveluun oheistoimintaa Takaisinkutsulla kontrolli palautetaan väliaikaisesti kutsujalle Tarkkailija yleinen ratkaisu tapahtumapohjaiseen vuorovaikutukseen Viestipohjainen kommunikointi löyhentää sidoksia Tapahtumapohjaisuus (ja viestipohjaisuus): väärin käytettynä tekee ohjelman rakenteesta ja suorituksen seuraamisesta haastavaa vastuualueet sekaisin, päivittäminen vaatii meedion kykyjä kun asiat pilkottu sekaviksi pikkupätkiksi sinne tänne Ohjelmistoarkkitehtuurit 2012-2013 74

Kysyttävää? Ohjelmistoarkkitehtuurit 2012-2013 75

Periytymisen toteutus kutsun siirtämisellä täydellinen" Car olio printdescription-kutsu self Car parent Vehicle parent Commodity parent printdescription: {printname;... } 76

Periytymisen toteutus kutsun siirtämisellä Täydellinen" Car olio printdescription-kutsu self Car parent Vehicle parent Product parent Commodity parent printdescription: {printname;... } 77