Ohjelmistoarkkitehtuurit Johannes Koskinen.

Samankaltaiset tiedostot
4. Komponenttien vuorovaikutus

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

4. Komponenttien vuorovaikutus

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit

4 Managing component interactions

Ohjelmistoarkkitehtuurit Kevät 2014

Viestinvälitysarkkitehtuurit Lähtökohta:

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Viestinvälitysarkkitehtuurit

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit

Kehyspohjainen ohjelmistokehitys

12. Kehysarkkitehtuurit

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

3. Komponentit ja rajapinnat

6. Arkkitehtuurityylit

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit Kevät 2014 Arkkitehtuurityylit vol 2

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit Johannes Koskinen. Osittavat arkkitehtuurityylit

Ohjelmistoarkkitehtuurit kevät

Komponentit ja rajapinnat

6. Arkkitehtuurityylit

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

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Graafisen käyttöliittymän ohjelmointi

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

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

Palveluperustaiset arkkitehtuurityylit

11. Kehysarkkitehtuurit

Ohjelmistojen mallintaminen, suunnittelumalleja

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

Osio 4: Graafinen käyttöliittymä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistoarkkitehtuurit. Kevät

7 Viestipohjaisten yritysjärjestelmien suunnittelumallit

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Suunnittelumalleja, MVC. Juha Järvensivu 2008

TIE Ohjelmistojen suunnittelu

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

Ohjelmistoarkkitehtuurit. Kevät

Rajapinta (interface)

T Henkilökohtainen harjoitus: FASTAXON

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

Ohjelmistoarkkitehtuurit Komponentit Kevät 2014

Ohjelmistojen mallintaminen, sekvenssikaaviot

Oliosuunnittelu. Oliosuunnittelu

Ohjelmistotekniikan menetelmät, arkkitehtuuria ja rajapintoja

HOJ J2EE & EJB & SOAP &...

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

JAVA-OHJELMOINTI 3 op A274615

Osio 4: Graafinen käyttöliittymä

Web Services tietokantaohjelmoinnin perusteet

Arkkitehtuurityylejä ja suunnittelutaktiikoita

Ohjelmistoarkkitehtuurit

Harjoitustehtävät viikolle 42

Tapahtumapohjainen ohjelmointi

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sovellusarkkitehtuurit

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

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

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Graafinen käyttöliittymä, osa 1

Ohjelmistoarkkitehtuurit Komponentit Kevät 2016

Ohjelmistoarkkitehtuurit, syksy

3. Komponentit ja rajapinnat

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Integrointi. Ohjelmistotekniikka kevät 2003

HSMT J2EE & EJB & SOAP &...

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Web-palvelu voidaan ajatella jaettavaksi kahteen erilliseen kokonaisuuteen: itse palvelun toiminnallisuuden toteuttava osa ja osa, joka mahdollistaa k

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Agentit ja semanttinen web. Pekka Halonen

Olio-ohjelmointi Javalla

Helia Ohjelmointitaito Tuomas Kaipainen Mermit Business Applications Oy Mermit Business Applications

Olio-ohjelmointi Käyttöliittymä

Ohjelmistoarkkitehtuurit Kevät 2016 Arkkitehtuurityylit vol 2

Graafisen käyttöliittymän ohjelmointi Syksy 2013

14. Poikkeukset 14.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Microsoft Visual Studio 2005

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Tässä kertauksena SOA ja palvelu.

815338A Ohjelmointikielten periaatteet

TIE Ohjelmistojen suunnittelu

14. Poikkeukset 14.1

Ohjelmistotuotanto. Luento

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Transkriptio:

Ohjelmistoarkkitehtuurit Kevät 2012-2013 Johannes Koskinen http://www.cs.tut.fi/~ohar/ 1 4. Komponenttien vuorovaikutus Roolirajapinnat Välittäjät Fasaadit Kutsun siirtäminen Edustajat Takaisinkutsut Tapahtumat Viestit Sovittimet Tehtaat 2 1

Toteutusriippuvuuksien poistaminen rajapinnoilla A B A ei tunne A IB B miten mitä 3 Rooliperustaiset rajapinnat Client1 Services Server Client1 käyttää Server:iä eri roolissa ja siksi eri palveluja kuin Client2 Client2 Client1 Role1 Server Client2 Role2 4 2

Esimerkki VisualComponent Button EventSource 5 Hienojakoiset roolirajapinnat Asiakkaat X Y Z Roolit A B C D Palvelun tarjoajat P:n perinteinen rajapinta P Q Q:n perinteinen rajapinta 6 3

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ä 7 Esimerkki ListBox TextField Button 8 4

Esimerkki Ilmanlaadun hallinta avaa ikkuna Ikkunoiden hallinta sulje ilmastointi Ilmastoinnin hallinta 9 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 10 5

Esimerkki Coordinator widgetchange(widget) ListBox ListBoxI getselected(): str Dialog Coordinator Välittäjä TextField TextFieldI settext(str) Widget changed() Button ButtonI enable() 11 Tyypillinen vuorovaikutus ListBox DialogCoordinator TextField Button widgetchange getselected settext enable 12 6

Esimerkki Ilmanlaadun hallinta avaa ikkuna sulje ilmastointi Ikkunoiden hallinta Ilmastoinnin hallinta 13 Kysyttävää? 14 7

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(); 15 Kutsun siirtäminen: esimerkki Chargable discount(int): int CustomerSupport discount(int): int Account Manager Customer KeyCustomer Support 16 8

Riippuvuuksien kuristaminen: Fasaadi (Facade) Fasaadi alijärjestelmä alijärjestelmä 17 Fasaadi suunnittelumalli Käytetään antamaan yksinkertainen, useimmille käyttäjille riittävä oletusliittymä monimutkaiseen alijärjestelmään Fasaadi 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) Fasaadin käyttöä voidaan edelleen kaventaa roolirajapinnoilla 18 9

Esimerkki registerstudent unregisterstudent getstudentinfo StudyRegister StudentFacade StudentRegister regstudentforcourse unregstudentforcourse PaymentSystem 19 Periytymisen toteutus kutsun siirtämisellä täydellinen" Car olio printdescription-kutsu Car parent Vehicle parent Commodity parent printdescription: {printname;... } self 20 10

Periytymisen toteutus kutsun siirtämisellä Täydellinen" Car olio printdescription-kutsu Car parent Vehicle parent Commodity parent printdescription: {printname;... } self Product parent 21 Komponenttiriippuvuuksien poistaminen edustajalla 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 22 11

Sovelluksia hajautetut järjestelmät (esim. EJB) viivästetty lataaminen (esim. oliokannat) älykkäät osoittimet... 23 Edustaja (Proxy) suunnittelumalli Client Services request()... actual.request() Proxy request() actual Server 24 12

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

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. 27 Takaisinkutsu (Callback) kirjasto sekvenssikaaviona: : Kirjasto : Sovellus palvelun kutsu palvelun kutsu paluu takaisinkutsu takaisinkutsu paluu palvelun paluu sovellus takaisinkutsu 28 14

Takaisinkutsurajapinta EngineUser warn(str) Takaisinkutsurajapinta Engine Yleiskäyttöinen run() 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(); 29 Käytetään poikkeuksia? Voidaanko poikkeuksilla saada periaatteessa aikaan sama kuin takaisinkutsuilla? A Ei koskaan B Joskus C Aina 30 15

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: - ei takaisinkutsurajapintaa - käyttävän yksikön (Car) tulee varautua poikkeukseen Edut: - yksinkertaisempi - kirjastoyksikön ei tarvitse tietää mitään käyttävän yksikön operaatioista (edes takaisinkutsurajapintaa) Haitat: - kirjastoyksikkö ei voi jatkaa tapahtuman käsittelyn jälkeen (tässä tosin ei ilmeisesti tarvitsekaan) Yleiskäyttöinen Car setup() warn(str)... Sovelluskohtainen log.output(str+": Oil pressure low"); myeng.stop(); 31 Kysyttävää? 32 16

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ä 33 Perinteinen kutsu vs. tapahtuma Palvelun kutsuja Palvelun tarjoaja Tapahtuma Tapahtuman synnyttäjä Tapahtumaan reagoivat 34 17

Tapahtumat käyttöliittymissä GUI Käyttäjän komennot Tilamuutokset Sovelluslogiikka 35 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) 36 18

Tarkkailija (Observer) suunnittelumalli Observer update(event) SourceComp obs src ObserverComp Source register(observer) unregister(observer) 37 Tapahtumien käsittely Javassa: Esimerkki ActionListener actionperformed(actionevent) JMenuItem obs src AppComp AbstractButton addactionlistener(actionlistener) 38 19

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) 39 Rajapinnat vs. viestit Komponentit, Asiakas-palvelin, Web palvelut (SOA), C++, Java kutsuu func A(X ) Rajapinta toteuttaa Palvelun tarjoaja Palvelun pyytäjä Viestinvälitysarkkitehtuurit, palveluväylät (ESB), Smalltalk kirjoittaa 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). 40 20

Rajapintariippuvuuksien poistaminen sovittimilla Rajapinnan A mukainen palvelupyyntö Sovitin Rajapinnan B mukainen palvelupyyntö Komponentti 1 Komponentti 2 Sovitin: palvelun pyytäjän ja tarjoajan välillä oleva ohjelmayksikkö, joka tekee palvelun pyytäjän riippumattomaksi palvelun tarjoajan rajapinnasta. 41 Sovitin (Adapter) suunnittelumalli Client AbstractServices request() ConcreteServices concrequest()... adaptee.concrequest() Adapter request() adaptee Server 42 21

Esimerkki: BeanBox (Sun) 43 Sovitin ja tapahtumat Sovittimien käyttö riippumattomien komponenttien tapahtumapohjaisessa kommunikoinnissa rekisteröinti ilmoita tapahtumasta palvelukutsu Komponentti A Sovitin Komponentti B 44 22

BeanBox: Java toteutus generoitu sovitin-luokka: Kun mouse-click tapahtuma tulee, aktivoidaan stopjuggling -operaatio public class Hookup_1734b2d565! implements java.awt.event.actionlistener,!!java.io.serializable {!! public void settarget(!!!sunw.demo.juggler.juggler t) {! target = t;! }!! public void actionperformed(!!!java.awt.event.actionevent arg0) {! target.stopjuggling();! }!! private!!sunw.demo.juggler.juggler target;! } 45 Kysyttävää? 46 23

Luontiriippuvuuksien vähentäminen tehtaalla Ongelma: Miten ohjelmistoalusta tai yleiskäyttöiset komponentit voivat luoda sovelluskohtaisia olioita/komponenttiilmentymiä tulematta riippuvaisiksi sovelluskohtaisista luokista/komponenteista? 47 Luontiriippuvuuksien vähentäminen tehtaalla FactoryRegistry register(factory) AppInit Factory create(): Product AppFactory <<create>> (alustus) Platform <<create>> (käyttö) Product service AppProduct 48 24

Yksinkertainen tehdas: Tehdasmetodi (Factory Method) suunnittelumalli Product Creator factorymethod anoperation product = factorymethod();... AppProduct create ConcCreator factorymethod return new AppProduct(); 49 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; 50 25

Ongelma: Miten varmistaa yhdenmukaiset oliot? Alusta TAI MUTTA EI: 51 Ratkaisu: yksi tehdasolio luo kaikki oliot yhdenmukaisesti ShapeFac tehdasluokka TwoDimFac ilmentymä tehdasolio käyttää Alusta luo ilmentymä ThreeDimFac factory class 52 26

Abstrakti tehdas suunnittelumalli AbsFactory createproducta(): ProductA createproductb(): ProductB ProductA opera ProductA2 opera ProductA1 opera Alusta ProductB operb ProductB2 ProductB1 operb operb Factory1 <<create>> Factory2 <<create>> 53 Abstrakti tehdas (Abstract Factory) suunnittelumalli: Esimerkki Sovellusalusta AbsFactory createbutton(): Button createmenu(): Menu WinFactory Button Menu <<create>> WinButton WinMenu 54 27

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 Sovittimilla voidaan muuntaa rajapintoja Tehtailla voidaan luoda ilmentymiä, vaikka niiden tyyppiä ei tunneta 55 Kysyttävää? 56 28