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 1
Flexibility requirement: Creature variation Structure DefaultCreature move show get gety interact die growold Erikoistamismalli NewCreature move show get 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(); } } } 2
Kehykset ja suunnittelumallit AbsFactory createbutton(): Button createmenu(): Menu Kehys GUI-kehys WinFactory Sovellus Button Menu Kehys <<create>> Service WinButton WinMenu 3
Kehys vs. sovellus Hyvin suunniteltu oliosovellus on usein (implisiittisen) kehyksen erikoistus. Uudelleenkäytettävyys ylläpidettävyys - siirrettävyys 4
Tyypillisiä kehyksissä käytettyjä GoF- suunnittelumalleja Operaatiorunko (Template Method) Strategia (Strategy) Vastuuketju (Chain of Responsibility) Kuorruttaja (Decorator) Tehtaat (Abstract Factory, Factory Method) Tarkkailija (Observer)... 5
Operaatiorunko (Template Method) Ongelma: Metodin sovelluskohtainen staattinen variointi 6
Strategia (Strategy) Ongelma: Metodin dynaaminen sovelluskohtainen variointi (isäntäolion elinaikana) 7
Vastuuketju (Chain of Responsibility) Ongelma: Miten voi antaa monille sovelluskohtaisille olioille/komponenteille mahdollisuuden käsitellä kehykseltä tuleva palvelukutsu? 8
Esimerkki Kehys Client handle Sovellus h1 = new Handler1; join h1 to Client; h2 = new Handler2; join h2 to Client+h1; Handler3 Handler2 Handler1 9
Esimerkki 10
Kuorruttaja (Decorator) Ongelma: Miten antaa mahdollisuus liittää sovelluskohtaista toiminnallisuutta tiettyyn kehyksen komponentiin dynaamisesti? 11
Esimerkki Kehys Registering Default Sovellus d1 = new Decorator1; join d1 to Default; register d1; d2 = new Decorator2; join d2 to d1; register d2; Decorator Decorator1 Decorator1 12
Esimerkki 13
Abstrakti tehdas (Abstract Factory) Ongelma: Miten luoda yhdenmukaisesti tietyn sovelluskohtaisen luokkakokoelman olioita kehyksessä? 14
Tarkkailija (Observer) Ongelma: Miten antaa sovelluskohtaisille komponenteille mahdollisuus reagoida jonkin kehyksen komponentin tilan muutoksiin? 15
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 16
Kerrosanalyysi: looginen dimensio rivi riippuu Root Gui Manager Factories View Model sarakkeesta Root Gui Manager Factories View Model 17
Kerrosanalyysi: erikoistamis-dimensio rivi riippuu sarakkeesta Eating Default Core Eating Default Core 18
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 19
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 protected metodeihin (helposti muutettavissa). Älä alusta suoraan muuttujien määrittelyssä (ei voi ylimääritellä aliluokissa). 20
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 21
Sovellusalue: videopelit Perinteinen Taloudellinen näkökulman kulma 1. peli 2. peli 3. peli työtuntia 0 100 200 300 400 500 600 700 800 900 Kehykseen perustuva Kehyksen rakentaminen + koulutus 1. peli 2. peli 3. peli Suorituskyky: aika +70% tila +200% 22
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 23
Ä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. 24
Yhteenvetoa Kehys on 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ä 25