12. Kehysarkkitehtuurit Johdanto Kehystyypit Kehysten osittaminen Kehykset ja suunnittelumallit Kehysten etuja ja ongelmia Yhteenvetoa Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 1
Johdanto Mikä on (ohjelmisto)kehys? Ohjelmistokehys on olioparadigman tapa toteuttaa tuotealusta. Kehys muodostuu kokoelmasta luokkia, jotka toteuttavat tuoteperheen yhteisen arkkitehtuurin ja toiminnallisuuden. Kehys erikoistetaan tuotteeksi. Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 2
Kehys erikoistetaan toimivaksi tuotteeksi Kehys Sovelluskohtainen koodi kontrolli Erikoistamisrajapinta Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 3
Sovelluskehys vs. perinteinen ohjelmakirjasto: Hollywood-periaate Aliluokkia, komponentteja Sovelluskohtainen Sovellus Uudelleenkäytettävä Sovelluskehys Aliohjelmia, luokkia, moduuleita Hollywood-periaate: Älä soita meille, me soitetaan teille Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 4
Erikoistamistekniikat kehyksissä rajapinnan toteutus (~takaisinkutsu) periytyminen (~takaisinkutsu) olioiden/komponenttien luonti, alustus ja konfigurointi geneeristen luokkien (template) instantiointi refleksiivisyys Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 5
Kehystyypit Erikoistamisen tulos Sovelluskehys: erikoistamisen tulos on sovellus Komponenttikehys (framelet): erikoistamisen tulos on komponentti Hierarkkinen kehys: erikoistamisen tulos on uusi kehys Erikoistamismekanismi Muunneltava kehys: erikoistaminen tehdään lähinnä periytymisellä (ja metodin ylimäärittelyllä) Koottava kehys: erikoistaminen tehdään lähinnä instantioinnilla (+ parametroinnilla) ja alustuskonfiguroinnilla Plugin-kehys: erikoistaminen tehdään lähinnä rajapintojen toteutuksella Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 6
Muunneltavat kehykset A B Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 7
Koottavat kehykset A B <<create>> Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 8
Plugin-kehykset rajapintoja komponentteja Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 9
Kehysten osittaminen Käsitemallipohjainen lähestymistapa Komponenttipohjainen lähestymistapa Kerrostaminen: hierarkkiset kehykset Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 10
Käsitemallipohjainen lähestymistapa OO-arkkitehtuurityyli : 1. Tee sovellusalueen käsitemalli 2. Hae ja lisää käsitemalliin yleistykset (kantaluokat) 3. Muunna käsitemalli luokkamalliksi, lisää oletustoteutukset, rajapinnat 4. Tunnista variaatiopisteet luokkamallista 5. Suunnittele variaatiopisteiden toteutus (esim. suunnittelumalleja soveltamalla) Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 11
Esimerkki: Simulointikehys Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 12
<<framework>> SimulationFW Muunneltava (white-box) kehys <<interface>> Creature setmyworld(world) show() getx(): int gety(): int move() interact(creature) growold() die() * World getsize(): int add(creature) remove(creature) show() simulate(int, CreatureFactory) <<interface>> CreatureFactory 1 createcreature(): Creature DefaultCreature <<create>> DefaultCreatureFactory xcoord ycoord age setmyworld(world)... die() <<create>> createcreature(): Creature EatingCreature SimulationApp EatingCreatureFactory energy <<create>> main() interact(creature) createcreature(): Creature <<create>> Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 13
<<framework>> SimulationFW Koottava (black-box) kehys <<interface>> Creature setmyworld(world) show() getx(): int gety(): int move() interact(creature) growold() die() * World getsize(): int add(creature) remove(creature) show() simulate(int,creaturefactory) <<create>> <<interface>> CreatureFactory 1 createcreature(): Creature DefaultCreatureFactory DefaultCreature xcoord ycoord age setmyworld(world)... die() EatingCreature energy interact(creature) <<create>> <<create>> createcreature(): Creature EatingCreatureFactory createcreature(): Creature SimulationApp <<create>> main() Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 14
<<framework>> SimulationFW <<interface>> Creature setmyworld(world) show() getx(): int gety(): int move() interact(creature) growold() die() * World getsize(): int add(creature) remove(creature) show() simulate(int,creaturefactory) Plug-in kehys 1 PluginLoader <<interface>> CreatureFactory createcreature(): Creature load() <<load>> <<plugin>> EatingApplication EatingCreature SimulationApp EatingCreatureFactory energy main() interact(creature) Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 15 <<create>> createcreature(): Creature
Komponenttipohjainen lähestymistapa: Monoliittiset kehykset vs. frameletit Monoliittinen kehys Sovellus Kehys Framelet Framelet Komponentti Komponentti Erikoistus Erikoistus Erikoistus Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 16
Hierarkkinen kehys Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 17
Hierarkkinen kehys: yleinen simulointikehys Punamuurahaisten simulointisovellus Muurahaisten simulointikehys Hyönteisten simulointikehys Eläinpopulaatioiden simulointikehys Yleinen simulointikehys Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 18
Hierarkkinen kehys: esimerkkikehys EatingCraeture, EatingCreatureFactory, SimulationApp DefaultCreature, DefaultCreatureFactory World, Creature Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 19
Hierarkkinen kehys: liiketoimintakehys Varastonhallintasovellus Varastonhallintasovelluskehys Spring Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 20
Kehykset ja suunnittelumallit Suunnittelumalleilla (GoF) voidaan lisätä järjestelmän joustavuutta sekä tavallisissa sovelluksissa (ylläpidettävyys, siirrettävyys) että kehyksissä (uudelleenkäytettävyys) Hyvin suunniteltu oliosovellus voidaan ymmärtää usein (implisiittisen) kehyksen erikoistuksena. Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 21
Suunnittelumallit kehyksen erikoistamisrajapintana Sovelluskohtainen koodi Kehys Suunnittelumallin ilmentymä Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 22
Suunnittelumallit ja kehykset Graphicaltem draw * children Kuuluu kehykseen Rectangle Circle FigGroup draw draw draw for all children c: c.draw; Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 23
Tyypillisiä kehyksissä käytettyjä GoFsuunnittelumalleja Operaatiorunko (Template Method) Strategia (Strategy) Kuorruttaja (Decorator) Tehtaat (Abstract Factory, Factory Method) Tarkkailija (Observer)... Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 24
Operaatiorunko (Template Method) Ongelma: Metodin sovelluskohtainen staattinen variointi Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 25
Kehyksessä Kehys Creature draw() move(dx, dy) setcolor(backgr) draw() x = x + dx y = y + dy setcolor(color) draw() Sovellus MyCreature draw() piirretään oma eliö Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 26
Strategia (Strategy) Ongelma: Metodin dynaaminen sovelluskohtainen variointi (isäntäolion olemassaolon aikana) Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 27
Kehyksessä Kehys setcolor(backgr) drawer.draw() x = x + dx y = y + dy setcolor(color) drawer.draw() Creature setdrawer(drawer) move(dx, dy) Drawer draw Sovellus dd = new DeadDrawer(); c.setdrawer(dd); piirretään oma eliö elävänä AliveDrawer draw() DeadDrawer draw() Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 28
Kuorruttaja (Decorator) Ongelma: Miten antaa mahdollisuus liittää sovelluskohtaista toiminnallisuutta tiettyyn kehyksen komponentiin dynaamisesti? Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 29
Esimerkki Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 30
basic interaction ; BasicBehavior Kehyksessä Kehys interaction() next.interaction(); interaction() SpecialBehavior Behavior interaction() next behav DefCreature interaction() append(behavior) DefWorld Creature Sovellus Behavior::interaction(); if energy < min { host.die(); } Behavior::interaction(); makesound(); MyBehavior2 MyBehavior1 interaction() interaction() Main: c = new DefCreature(); b1 = new MyBehavior1(); c.append(b1); d = new DefCreature(); b2 = new MyBehavior2(); d.append(b2); DefCreature::interaction: behav.interaction(); Kehys liittää automaattisesti BasicBehavior:in DefCreature-olioon Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 31 31
Abstrakti tehdas (Abstract Factory) Ongelma: Miten luoda yhdenmukaisesti tietyn sovelluskohtaisen luokkakokoelman olioita kehyksessä? Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 32
Kehyksessä Kehys Obstacle Creature World simulate() ElemFactory makecreature(): Creature makeobstacle(): Obstacle Sovellus MyObstacle MyCreature MyFactory Main: f = new MyFactory() world = new World(f); world.simulate(); return new MyCreature(); return new MyObstacle(); makecreature() makeobstacle() Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 33
Tarkkailija (Observer) Ongelma: Miten antaa sovelluskohtaisille komponenteille mahdollisuus reagoida jonkin kehyksen komponentin tilan muutoksiin? Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 34
if meteorhit { for all obs: obs.notifymeteor(); } Kehyksessä Kehys MeteorSource DefWorld MeteorObserver notifymeteor() Creature register( ) simulate() register(meteorobserver) Sovellus MyCreature notifymeteor() Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 35
Kahden kehyksen yhdistäminen säikeillä GUI-kehys Simulointikehys MainWindow Controller Manager EventLoop säie säie Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 36
Kehysten etuja Kehysten etuja tuotealustojen toteutustekniikkana: Paljon kokemusta (esim. GUI-kehykset) Soveltaa yleistä, tunnettua OO teknologiaa (vrt. DSL) Tukee avoimia variaatiopisteitä (vrt. DSL) Tukee hyvin kerroksittaisia/hierarkkisia tuotealustoja Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 37
Kehysten ongelmia Teknisesti vaativa tapa tehdä ohjelmistoja, prosessi usein hyvin iteratiivinen Kehyksistä tulee helposti suuria, mutkikkaita ja vaikeasti hallittavia ohjelmistoja (pienentää yrityksen rekkakerrointa) Sovellusten testaaminen voi olla vaikeaa ilman kehyksen koodia Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 38
Yhteenvetoa Kehys on OO tapa toteuttaa tuotealusta Kehysarkkitehtuureja käytetään paljon yrityksissä, kokemukset valtaosalta positiivisia Kehyksen tekeminen on huomattavasti vaativampaa kuin yksittäisen sovelluksen Vältä suurien muunneltavien (white-box) kehysten tekemistä Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 39
Kurssiyhteenveto Arkkitehtuurien kuvaus Perusmekanismit Standardiratkaisut Tuoterunkoarkkitehtuurit Arkkitehtuurien arviointi Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 40
Tentti ti 7.12. klo 9-12 Sali S1 (TTY) Tehtävät: 1. Jokin HT sellaisenaan (6p) 2. HT- kaavan mukainen soveltamistehtävä (6p) 3. Teoriatehtävä (kalvot) (6p) 4. Lyhyt essee jostakin keskeisestä kurssin aihepiiristä (6p) 5. Arkkitehtuurisuunnittelutehtävä (6p) 6. Jokeritehtävä vierailuluennoista (4p) Ohjelmistoarkkitehtuurit Syksy 2010 TTY Ohjelmistotekniikka 41