Johdanto Kehystyypit Kehysten arkkitehtuurilähestymistavat Kehykset ja suunnittelumallit Kehysten etuja ja ongelmia Yhteenvetoa

Samankaltaiset tiedostot
Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit. Kevät

12. Kehysarkkitehtuurit

11. Kehysarkkitehtuurit

Ohjelmistoarkkitehtuurit kehysarkkitehtuurit. Kevät 2014

8. Kehysarkkitehtuurit

11. Kehysarkkitehtuurit

Ohjelmistoarkkitehtuurit kehysarkkitehtuurit. Kevät 2016

Kehyspohjainen ohjelmistokehitys

8. Framework architectures

Ohjelmistokehykset ohjelmistorunkoja uudelleenkäyttö olioperustaisista ohjelmistorunko

Ohjelmistokehykset (software frameworks)

Ohjelmistoarkkitehtuurit, syksy

Ohjelmistokehykset (software frameworks)

Ohjelmistoarkkitehtuurit kevät Muunneltavuuden hallinta: variaatiopisteet. Ohjelmistot muuntuvat kahdessa dimensiossa

Ohjelmistoarkkitehtuurit. Kevät Johannes Koskinen.

Luento 8. Ohjelmistokehykset Tuoteperheet CSM14101 Ohjelmistoarkkitehtuurit

Kehyksillä toteuttettujen tuotelinjojen rakenteellinen optimointi

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

TIE Ohjelmistojen suunnittelu

Oliosuunnittelu. Oliosuunnittelu

Tuoterunko hajautetussa ympäristössä

7. Tuoterunkoarkkitehtuurit

10. Tuoterunkoarkkitehtuurit

Rajapinta (interface)

1. Olio-ohjelmointi 1.1

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

TIE Ohjelmistojen suunnittelu

3. Komponentit ja rajapinnat

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

5. Suunnittelumallit. TTY Ohjelmistotekniikka

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Avoimet ohjelmistokehykset

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Muusta kuin vesisioista

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Muutamia peruskäsitteitä

Ohjelmoinnin peruskurssien laaja oppimäärä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistoarkkitehtuurit, syksy

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

T Henkilökohtainen harjoitus: FASTAXON

9. Muunneltavuuden hallinta

10. Muunneltavuuden hallinta: variaatiopisteet

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit


11. Tuoterunkoarkkitehtuurit

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Harjoitustehtävät ja ratkaisut viikolle 48

5. Suunnittelumallit. TTY Ohjelmistotekniikka

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

2. Olio-ohjelmoinista lyhyesti 2.1

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Uudelleenkäytön jako kahteen

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Viestinvälitysarkkitehtuurit

Ohjelmistoarkkitehtuurit. Kevät 2014

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Olio-ohjelmointi Javalla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

4. Olio-ohjelmoinista lyhyesti 4.1

Tuoterunkoarkkitehtuurit. Ohjelmistoarkkitehtuurit kevät Uudelleenkäyttö. Johannes Koskinen.

9. Periytyminen Javassa 9.1

Ohjelmistoarkkitehtuurit. Kevät

Osio 4: Graafinen käyttöliittymä

Ohjelmistoarkkitehtuurit kevät

Komponentit ja rajapinnat

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Muunneltavuuden hallinta (Variability management):

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmistoarkkitehtuurit. Syksy 2007

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

9. Periytyminen Javassa 9.1

13/20: Kierrätys kannattaa koodaamisessakin

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Kertaus: yleistys-erikoistus ja perintä

Suunnittelumallien käyttö ohjelmistosuunnittelussa

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Ohjelmistojen mallintaminen, suunnittelumalleja

Ohjelmistoarkkitehtuurit. Syksy 2010

10. Muunneltavuuden hallinta: variaatiopisteet

815338A Ohjelmointikielten periaatteet

Mikä yhteyssuhde on?

11. Tuoterunkoarkkitehtuurit

Ohjelmistoarkkitehtuurit. Syksy 2008

Transkriptio:

13. Kehysarkkitehtuurit Johdanto Kehystyypit Kehysten arkkitehtuurilähestymistavat Kehykset ja suunnittelumallit Kehysten etuja ja ongelmia Yhteenvetoa Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Johdanto Mikä on (ohjelmisto)kehys? Ohjelmistokehys on standardi olioparadigman tapa toteuttaa tuotealusta. Kehys muodostuu kokoelmasta luokkia, jotka toteuttavat tuoteperheen yhteisen arkkitehtuurin ja toiminnallisuuden. Kehys erikoistetaan tuotteeksi. Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 2

Kehys erikoistetaan toimivaksi tuotteeksi Kehys Sovelluskohtainen koodi kontrolli Erikoistamisrajapinta Ohjelmistoarkkitehtuurit Syksy 2009 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 2009 TTY Ohjelmistotekniikka 4

Erikoistamistekniikat kehyksissä rajapinnan toteutus (~takaisinkutsu) periytyminen (~takaisinkutsu) olioiden/komponenttien luonti, alustus ja konfigurointi geneeristen luokkien (template) instantiointi refleksiivisyys Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 5

Erikoistamisen tulos Kehystyypit 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 (ja parametroinnilla) Plugin-kehys: erikoistaminen tehdään lähinnä rajapintojen toteutuksella Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 6

Muunneltavat kehykset A B Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 7

Koottavat kehykset A B <<create>> Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 8

Plugin-kehykset rajapintoja komponentteja Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 9

Kehysten arkkitehtuurilähestymistavat Kehyksen dekompositio: käsitemallipohjainen lähestymistapa Kehyksen dekompositio: komponenttipohjainen lähestymistapa Kehyksen kerrostaminen: hierarkkiset kehykset Ohjelmistoarkkitehtuurit Syksy 2009 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 2009 TTY Ohjelmistotekniikka 11

Esimerkki: Simulointikehys Ohjelmistoarkkitehtuurit Syksy 2009 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 2009 TTY Ohjelmistotekniikka 13

<<framework>> SimulationFW Koottava (black-box) 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 2009 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 2009 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 2009 TTY Ohjelmistotekniikka 16

Hierarkkinen kehys Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 17

Hierarkkinen kehys: yleinen simulointikehys Punamuurahaisten simulointisovellus Muurahaisten simulointikehys Hyönteisten simulointikehys Eläinpopulaatioiden simulointikehys Yleinen simulointikehys Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 18

Hierarkkinen kehys: esimerkkikehys EatingCraeture, EatingCreatureFactory, SimulationApp DefaultCreature, DefaultCreatureFactory World, Creature Huomaa ero pystysuunnassa verrattuna luokkakaavioon Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 19

Hierarkkinen kehys: liiketoimintakehys Varastonhallintasovellus Varastonhallintasovelluskehys Spring Ohjelmistoarkkitehtuurit Syksy 2009 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 2009 TTY Ohjelmistotekniikka 21

Suunnittelumallit kehyksen erikoistamisrajapintana Sovelluskohtainen koodi Kehys Suunnittelumallin ilmentymä Ohjelmistoarkkitehtuurit Syksy 2009 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 2009 TTY Ohjelmistotekniikka 23

Variaatiopisteen kuvaus erikoistamismallina Flexibility requirement: Creature variation Structure DefaultCreature move show getx gety interact die growold 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" NewCreature: constructor must call super 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(); } } Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 24 } }

Tyypillisiä kehyksissä käytettyjä GoF- suunnittelumalleja Operaatiorunko (Template Method) Strategia (Strategy) Kuorruttaja (Decorator) Tehtaat (Abstract Factory, Factory Method) Tarkkailija (Observer)... Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 25

Operaatiorunko (Template Method) Ongelma: Metodin sovelluskohtainen staattinen variointi Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 26

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 2009 TTY Ohjelmistotekniikka 27

Strategia (Strategy) Ongelma: Metodin dynaaminen sovelluskohtainen variointi (isäntäolion olemassaolon aikana) Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 28

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 2009 TTY Ohjelmistotekniikka 29

Kuorruttaja (Decorator) Ongelma: Miten antaa mahdollisuus liittää sovelluskohtaista toiminnallisuutta tiettyyn kehyksen komponentiin dynaamisesti? Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 30

Esimerkki Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 31

basic interaction ; BasicBehavior Kehyksessä Kehys interaction() next.interaction(); interaction() Behavior Behavioral 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-olion DefCreature-olioon Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 32 32

Abstrakti tehdas (Abstract Factory) Ongelma: Miten luoda yhdenmukaisesti tietyn sovelluskohtaisen luokkakokoelman olioita kehyksessä? Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 33

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 2009 TTY Ohjelmistotekniikka 34

Tarkkailija (Observer) Ongelma: Miten antaa sovelluskohtaisille komponenteille mahdollisuus reagoida jonkin kehyksen komponentin tilan muutoksiin? Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 35

if meteorhit { for all obs: obs.notifymeteor(); } Kehys MeteorSource register( ) Kehyksessä DefWorld simulate() register(meteorobserver) MeteorObserver notifymeteor() Creature Sovellus MyCreature notifymeteor() Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 36

Kahden kehyksen yhdistäminen säikeillä GUI-kehys Simulointikehys MainWindow Controller Manager EventLoop säie säie Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 37

Kehysten toteutuksesta (Java) Varo tuoterunkojen painovoimalakia: onko tämä kehyksen toiminnallisuus todella yhteistä? Oletustoteutusten tulisi antaa tyypillinen minimitoiminnallisuus, ei kaikille välttämätöntä toteutusta. Tee todennäköinen variaatio helpoksi toteuttaa sovelluksessa, 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). Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 38

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 2009 TTY Ohjelmistotekniikka 39

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 2009 TTY Ohjelmistotekniikka 40

Älä ryhdy tekemään laajaa kehystä, jos ryhmässä ei ole hyvää ymmärrystä sovellusalueesta; ryhmällä ei ole kokemusta sovelluksien tekemisestä tällä sovellusalueella; ryhmällä ei ole hyvää kokemusta oliomenetelmien, - kielten ja suunnittelumallien käytöstä; tai johto ei ole sitoutunut pitkään ja haastavaan projektiin. Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 41

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 2009 TTY Ohjelmistotekniikka 42

Kurssiyhteenveto Arkkitehtuurien kuvaus Perusmekanismit Standardiratkaisut Tuoterunkoarkkitehtuurit Arkkitehtuurien arviointi Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 43

Tentti ti 1.12. klo 9-12 (!) 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 2009 TTY Ohjelmistotekniikka 44