11. Kehysarkkitehtuurit Johdanto Kehystyypit Kehykset ja arkkitehtuuri Kehykset ja suunnittelumallit Kehyspohjainen ohjelmistokehitys Esimerkkikehys Kehysten toteutuksesta Kehysten etuja ja ongelmia Yhteenvetoa 1
Kehykset ja suunnittelumallit Suunnittelumalleilla (GoF) voidaan lisätä järjestelmän joustavuutta sekä tavallisissa sovelluksissa (ylläpito, siirrettävyys) että kehyksissä (uudelleenkäytettävyys) Hyvin suunniteltu oliosovellus voidaan ymmärtää usein (implisiittisen) kehyksen erikoistuksena. 2
Suunnittelumallit kehyksen erikoistamisrajapintana Sovelluskohtainen koodi Kehys Suunnittelumallin ilmentymä 3
Tyypillisiä kehyksissä käytettyjä GoF- suunnittelumalleja Operaatiorunko (Template Method) Strategia (Strategy) Kuorruttaja (Decorator) Tehtaat (Abstract Factory, Factory Method) Tarkkailija (Observer)... 4
Operaatiorunko (Template Method) Ongelma: Metodin sovelluskohtainen staattinen variointi 5
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ö 6
Strategia (Strategy) Ongelma: Metodin dynaaminen sovelluskohtainen variointi (isäntäolion elinaikana) 7
Kehyksessä Kehys setcolor(backgr) drawer.draw() x = x + dx y = y + dy setcolor(color) drawer.draw() Creature setdrawer(drawer) move(dx, dy) Drawer Sovellus dd = new DeadDrawer(); c.setdrawer(dd); piirretään oma eliö elävänä AliveDrawer draw() DeadDrawer draw() 8
Kuorruttaja (Decorator) Ongelma: Miten antaa mahdollisuus liittää sovelluskohtaista toiminnallisuutta tiettyyn kehyksen komponentiin dynaamisesti? 9
Esimerkki 10
Kehyksessä creature.interaction(); Kehys Behavior interaction() Behavioral interaction() DefCreature interaction() append(behavioral) DefWorld 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); b2 = new MyBehavior2(); c.append(b2); 11
Abstrakti tehdas (Abstract Factory) Ongelma: Miten luoda yhdenmukaisesti tietyn sovelluskohtaisen luokkakokoelman olioita kehyksessä? 12
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() 13
Kehyksessä AbsFactory createbutton(): Button createmenu(): Menu Kehys GUI-kehys WinFactory Sovellus Button Menu Kehys <<create>> Service WinButton WinMenu 14
Tarkkailija (Observer) Ongelma: Miten antaa sovelluskohtaisille komponenteille mahdollisuus reagoida jonkin kehyksen komponentin tilan muutoksiin? 15
if leader and warning { obs*.notifyherdevent(); } Kehys Creature Kehyksessä DefCreature interaction() HerdObserver notifyherdevent() Sovellus MyCreature move() ; notifyherdevent() 16
if meteorhit { obs*.notifymeteor(); } Kehys MeteorSource register() Kehyksessä DefWorld simulate() register(meteorobserver) MeteorObserver notifymeteor() Creature Sovellus MyCreature notifymeteor() 17
Kehyspohjainen ohjelmistokehitys Sovellusalueen käsitemalli, piirremalli Yhteiset vaatimukset Kehyksen suunnittelu Suunnittelumallit Vaatimusmäärittely Muunneltavuusvaatimukset Kehysarkkitehtuuri Erikoistamisrajapinta Voidaan antaa erikoistamismalleina Alustakehitysprosessi Kehyksen toteutus Kehys Tuote Vaatimusmäärittely Tuotevaatimukset Tuoteen toteutus Erikoistus Tuotekehitysprosessi 18
Flexibility requirement: Creature variation Structure DefaultCreature move show getx gety interact die growold Erikoistamismalli NewCreature move show getx gety interact die growold Explanations DefaultCreature: Default implementation for creatures NewCreature: Application dependent creature type move: Single movement behavior show: Displays creature on screen interact: Interaction between two creatures die: dying of a creature growold: aging of a creature Constraints move: must call "show" die: must remove the creature from the world growold: must increase age Example class NewCreature extends DefaultCreature { int energy; public NewCreature(int x, int y, int e) { super(x, y); energy = e; } public void move() { xcoord = (xcoord+1)%myworld.getsize(); show(); } public void show() {...} } public void interact(abstractcreature c) { if (c!= this && c instanceof NewCreature) { if (((NewCreature)c).energy < energy) { c.die(); } } } 19
Esimerkkikehys riippuvuuksien suunta CoreRoot DefaultRoot EatingRoot Looginen dimensio CoreGui DefaultGui EatingGui CoreManager DefaultManager EatingManager CoreFactories DefaultFactories EatingFactories CoreView DefaultView EatingView CoreModel DefaultModel EatingModel Erikoistamis-dimensio 20
Kerrosanalyysi: looginen dimensio rivi riippuu Root Gui Manager Factories View Model sarakkeesta Root X X X Gui X Manager X X X Factories X X View X Model 21
Kerrosanalyysi: erikoistamis-dimensio rivi riippuu sarakkeesta Eating Default Core Eating X X Default X Core 22
Luokkakategoriat ja nimeämisk miskäytännöt Base Pakollisen toiminnallisuuden toteutus, oletetaan kaikille sovelluksille (final methods) Sijoitettu core-paketteihin yhdessä abstraktin kehyksen (rajapintojen) kanssa Default Valinnaisen ja vaihtoehtoisen toiminnallisuuden toteutus, oletetaan useille sovelluksille Sijoitettu default-paketteihin Eating Sovelluskohtainen (Eating-sovellus) toteutus Sijoitettu eating-paketteihin 23
Kehysten toteutuksesta Varo tuoterunkojen painovoimalakia: onko tämä core-kerroksen toiminnallisuus todella yhteistä kaikille? Oletustoteutusten tulisi antaa tyypillinen minimitoiminnallisuus, ei kaikille välttämätöntä toteutusta. Tee todennäköinen variaatio helpoksi toteuttaa, harvinaisempi voi olla vaikeampaa toteuttaa. Säikeistämistä voi käyttää useamman kehyksen yhdistämiseen. Jaa pitkät metodirungot suojattujen metodien kutsuiksi, joiden toteutus on varioitavissa (alkuperäinen metodi määrää asioiden suoritusjärjestyksen, mutta ei sisältöä). Käytä final metodeja ei-varioituvaan toiminnallisuuteen. Laita oletusarvojen asetukset erillisiin suojattuihin metodeihin (helposti muutettavissa). Älä alusta suoraan muuttujien määrittelyssä (ei voi ylimääritellä aliluokissa). 24
Kehysten etuja ja ongelmia Kehysten etuja tuotealustojen toteutustekniikkana: Paljon kokemusta (esim. GUI-kehykset) Soveltaa yleistä, tunnettua OO teknologiaa (vrt. DSL) Tukee avointa erikoistamista (vrt. DSL) Tukee hyvin kerroksittaisia/hierarkkisia tuotealustoja 25
Kehysten ongelmia Teknisesti vaativa tapa tehdä ohjelmistoja, prosessi usein hyvin iteratiivinen Kehysten yhdistäminen usein vaikeaa Kehyksistä tulee helposti suuria, mutkikkaita ja vaikeasti hallittavia ohjelmistoja (pienentää yrityksen rekkakerrointa) Sovellusten testaaminen voi olla vaikeaa ilman kehyksen koodia 26
Älä ryhdy tekemää ään n kehystä,, jos et ymmärrrä hyvin sovellusaluetta; et ole aikaisemmin tehnyt sovelluksia tälle sovellusalueelle; sinulla ei ole hyvää kokemusta oliomenetelmien, -kielten ja suunnittelumallien käytöstä; johto ei ole sitoutunut pitkään ja haastavaan projektiin. 27
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ä 28
Koe 5 tehtävää + jokeri, a 5p, yht. max 30p 1 tehtävä suoraan viikkoharjoituksista 1 tehtävä teoriakysymys (suoraan kalvoista) 3 tehtävää viikkoharjoitusten tyyppisiä soveltamisia jokeri: kysymys vierailuluentojen sisällöstä valmistautuminen: käy läpi luentokalvot ja tarkista ymmärrätkö sisällön jos et ymmärrä, tarkista luentovideoilta/kirjasta käy läpi viikkoharjoitukset + ratkaisut mene oluelle kavereitten kanssa 29