4. komponenttien vuorovaikutus - cs.tut.fiohar/luennot/luennot2010/ohar4 vuorovaikutus.pdfvoidaan...
TRANSCRIPT
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 1
• Roolirajapinnat
• Välittäjät
• Fasaadit
• Kutsun siirtäminen
• Edustajat
• Takaisinkutsut
• Tapahtumat
• Viestit
• Sovittimet
• Tehtaat
4. Komponenttien vuorovaikutus
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 2
A B
A B
IB
Toteutusriippuvuuksien poistaminen rajapinnoilla
A ei tunne
mitä
miten
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 3
Client1
Server
Services
Client2
Rooliperustaiset rajapinnat
Client1
Server
Role1
Client2 Role2
Client1 käyttää Server:iä
eri roolissa ja siksi eri palveluja
kuin Client2
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 4
Esimerkki
Button
VisualComponent
EventSource
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 5
Hienojakoiset roolirajapinnat
Asiakkaat Palvelun
tarjoajatRoolit
A
B
C
D
P
Q
X
Y
Z
P:n ”perinteinen” rajapinta
Q:n ”perinteinen” rajapinta
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 6
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ä
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 7
Esimerkki
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 8
Esimerkki
Ilmanlaadun
hallinta
Ikkunoiden
hallinta
Ilmastoinnin
hallinta
avaa
ikkuna
sulje
ilmastointi
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 9
Riippuvuuksien keskittäminen: Välittäjä (Mediator)
Etuja:
• vuorovaikutus omana
kokonaisuutena (välittäjä),
voidaan muuttaa tai räätälöidä
koskematta komponentteihin
• tekee komponentit riippumat-
tomiksi toisistaan
• yksinkertaistaa kommunikaatiota
(yksi-moneen, ei moni-moneen)
Ongelma: keskitetty kontrolli voi
kasvaa itsessään monimutkaiseksi
Keskitetään vuorovaikutuksen
kontrolli rajoittamalla komponenttien
vastuut ja ottamalla käyttöön uusi
komponentti, jonka vastuulla on
vuorovaikutuksen hallinta
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 10
Esimerkki
Dialog
Coordinator
ListBox
CoordinatorwidgetChange(Widget)
Widgetchanged()
TextField
Button
ButtonIenable()
TextFieldIsetText(str)
ListBoxIgetSelected(): str
Välittäjä
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 11
Tyypillinen vuorovaikutus
ListBox DialogCoordinator TextField Button
widgetChange
getSelected
setText
enable
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 12
Esimerkki
Ilmanlaadun
hallinta
Ikkunoiden
hallinta
Ilmastoinnin
hallinta
avaa
ikkunasulje
ilmastointi
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 13
Kutsun siirtäminen (delegointi)
op B
op()
op B
op()
Bimp
imp
…
imp.opimp();
…
opimp()
palvelun
varsinainen
suorittajaB saa palvelupyynnön:
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
Yleinen perusmekanismi
monessa standardiratkaisussa
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 14
Kutsun siirtäminen: esimerkki
Account
ManagerCustomer
Chargablediscount(int): int
CustomerSupportdiscount(int): int
KeyCustomer
Support
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka
Riippuvuuksien kuristaminen: Fasaadi (Facade)
15
alijärjestelmäalijärjestelmä
Fasaadi
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka
Fasaadi suunnittelumalli
16
• 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
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka
Esimerkki
17
StudentFacade
registerStudent
unregisterStudent
getStudentInfo
StudyRegister
StudentRegister
PaymentSystemregStudentForCourse
unregStudentForCourse
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 18
Car
Vehicle
parent
Commodity
printDescription-kutsu
printDescription:
{printName;
... }
”täydellinen" Car olio
Periytymisen toteutus kutsun siirtämisellä
self
parent
parent
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 19
”Täydellinen" Car olio
Car
Vehicle
parent
CommodityprintDescription-kutsu
printDescription:
{printName;
... }
Periytymisen toteutus kutsun siirtämisellä
self
parent
parent
Product
parent
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 20
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
EdustajaAsiakasVarsinainen
komponentti
op op
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 21
Sovelluksia
• hajautetut järjestelmät (esim. EJB)
• viivästetty lataaminen (esim. oliokannat)
• älykkäät osoittimet
• ...
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 22
Edustaja (Proxy) suunnittelumalli
Client
Proxy
Servicesrequest()
Server
request()
...
actual.request()
actual
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 23
Esimerkki: viivästetty lataaminen
if not loaded then
map = loadFromFile();
loaded = true
end;
map->getRoute()
varsinainen
getRoute
palveluNavigator
MapProxy
MapgetName()
getRoute(from,to)
getName
getRoute
CityMap
getName
getRoute
return mapName;
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 24
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.
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 25
Takaisinkutsu (Callback)
palvelun
kutsu
takaisinkutsu
kirjasto
sovellus
paluu
: Kirjasto : Sovellus
palvelun kutsu
takaisinkutsu
paluu
palvelun paluu
takaisin-
kutsu
sekvenssikaaviona:
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 26
Takaisinkutsurajapinta
Engine
Car
EngineUserwarn(str)
setup()
warn(str)
...
PowerSourcestart()
stop()
setUser(EngineUser)
log.output("Oil pressure low");
myeng.stop();
run()
…
if (oilpressure<limit) {
user.warn();
...
myeng = new Engine();
myeng.setUser(this);
myeng.start();
Yleiskäyttöinen
Sovelluskohtainen
Takaisinkutsurajapinta
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 27
Käytetään poikkeuksia?
Voidaanko poikkeuksilla saada periaatteessa aikaan
sama kuin takaisinkutsuilla?
A Ei koskaan
B Joskus
C Aina
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 28
Engine
Car
setup()
warn(str)
...
PowerSourcestart() throws Oilpressure
stop()
setUser(EngineUser)
log.output(str+": Oil pressure low");
myeng.stop();
run()…
if (oilpressure<limit) {
...
throw new Oilpressure();
}
...
setup(): ...
myeng = new Engine();
myeng.setUser(this);
try {
myeng.start();
} catch (Oilpressure op) {warn("...");}
Yleiskäyttöinen
Sovelluskohtainen
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 takaisin-
kutsurajapintaa)
Haitat: - kirjastoyksikkö ei voi jatkaa
tapahtuman käsittelyn jälkeen (tässä tosin
ei ilmeisesti tarvitsekaan)
Poikkeuksilla
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 29
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ä
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 30
Perinteinen kutsu vs. tapahtuma
Palvelun
kutsuja
Palvelun
tarjoaja
Tapahtuma
Tapahtumaan
reagoivat
Tapahtuman
synnyttäjä
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 31
Tapahtumat käyttöliittymissä
GUI
Sovelluslogiikka
Käyttäjän komennot Tilamuutokset
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 32
Synkroninen takaisinkutsuihin perustuva
tapahtumankäsittely
Tapahtuman
aiheuttaja
rekisteröinti
ilmoitus tapahtumasta
(takaisinkutsu)
Reagoivat
yksiköt
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 33
Tarkkailija (Observer) suunnittelumalli
SourceComp ObserverComp
Observerupdate(Event)
Sourceregister(Observer)
unregister(Observer)
obs src
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 34
Tapahtumien käsittely Javassa: Esimerkki
JMenuItem AppComp
ActionListeneractionPerformed(ActionEvent)
AbstractButtonaddActionListener(ActionListener)
obs src
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka
Viestipohjainen kommunikointi
35
Komponentti 1 Komponentti 2
receive(Message m)
• 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)
Viesti
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 36
Rajapinnat vs. viestit
Palvelun
pyytäjä
Rajapinta
Viesti
Palvelun
tarjoaja
toteuttaa
Palvelun
tarjoaja
lukee ja
toteuttaa
Rajapinta kertoo mitä tehdään ja millä tiedolla, viesti voi kertoa mitä tahansa (mitä tehdään,
kuka tekee, millä tiedolla).
Viestinvälitysarkkitehtuurit,
palveluväylät (ESB),
Smalltalk
Komponentit,
Asiakas-palvelin,
Web palvelut (SOA),
C++, Java
func A(X…)
ACTION = A
PAR1 = X
Viestin
välittäjä
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 37
Rajapintariippuvuuksien poistaminen sovittimilla
Sovitin
Komponentti 1 Komponentti 2
Rajapinnan A mukainen
palvelupyyntö
Sovitin: palvelun pyytäjän ja tarjoajan välillä oleva ohjelmayksikkö,
joka tekee palvelun pyytäjän riippumattomaksi palvelun tarjoajan
rajapinnasta.
Rajapinnan B mukainen
palvelupyyntö
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 38
Sovitin (Adapter) suunnittelumalli
Client
Adapter
AbstractServices
request()
Server
ConcreteServices
concRequest()
adaptee
request()
...
adaptee.concRequest()
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 39
Esimerkki: BeanBox (Sun)
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 40
Sovittimien käyttö riippumattomien komponenttien
tapahtumapohjaisessa kommunikoinnissa
Komponentti A Komponentti BSovitin
rekisteröinti
ilmoita
tapahtumasta
palvelu-
kutsu
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 41
BeanBox: Java toteutus
Kun ”mouse-click” tapahtuma tulee,
aktivoidaan ”stopJuggling” -operaatio
generoitu sovitin-luokka:
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;
}
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 42
Luontiriippuvuuksien vähentäminen tehtaalla
Platform
AppFactory
Factorycreate(): Product
Productservice
AppProduct
<<create>>
AppInit
FactoryRegistryregister(Factory)
<<create>>
(alustus)
(käyttö)
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 43
Yksinkertainen tehdas: Tehdasmetodi
(Factory Method) suunnittelumalli
factoryMethod
anOperation
…
product = factoryMethod();
...
factoryMethod return new AppProduct();
Creator
ConcCreator
AppProduct
create
Product
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 44
Esimerkki
createDocument()
newDocument()
openDocument()
doc = createDocument();
docs.add(doc);
doc.open();
createDocument() return new MyDocument;
DocManager
MyDocManager
create
use
Documentopen()
close()
MyDocument
open()
close()
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 45
Ongelma: Miten varmistaa yhdenmukaiset
oliot?
Alusta
TAIMUTTA EI:
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 46
Ratkaisu: yksi tehdasolio luo kaikki oliot
yhdenmukaisesti
Alusta
tehdasolio
luo
TwoDimFac
ThreeDimFac
ilmentymä
ilmentymä
tehdasluokka
factory class
käyttää
ShapeFac
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 47
ProductA2
operA
ProductB2
operB
Abstrakti tehdas suunnittelumalli
Alusta
Factory1
AbsFactorycreateProductA(): ProductA
createProductB(): ProductB
ProductA1
<<create>>
ProductB1
ProductA ProductB
operA operB
operA operB
Factory2
<<create>>
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 48
Abstrakti tehdas (Abstract Factory)
suunnittelumalli: Esimerkki
Sovellus-
alustaWinFactoryAbsFactory
createButton(): Button
createMenu(): Menu
WinButton
<<create>>
WinMenu
Button Menu
Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 49
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