4. komponenttien vuorovaikutus - cs.tut.fiohar/luennot/luennot2010/ohar4 vuorovaikutus.pdfvoidaan...

Post on 01-Apr-2018

222 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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

top related