Ohjelmistoarkkitehtuurit kehysarkkitehtuurit. Kevät 2016

Samankaltaiset tiedostot
Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit. Kevät

Ohjelmistoarkkitehtuurit kehysarkkitehtuurit. Kevät 2014

12. Kehysarkkitehtuurit

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

11. Kehysarkkitehtuurit

8. Kehysarkkitehtuurit

11. Kehysarkkitehtuurit

Kehyspohjainen ohjelmistokehitys

Ohjelmistokehykset ohjelmistorunkoja uudelleenkäyttö olioperustaisista ohjelmistorunko

Ohjelmistokehykset (software frameworks)

Ohjelmistokehykset (software frameworks)

Ohjelmistoarkkitehtuurit, syksy

8. Framework architectures

Luento 8. Ohjelmistokehykset Tuoteperheet CSM14101 Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit. Kevät Johannes Koskinen.

Kehyksillä toteuttettujen tuotelinjojen rakenteellinen optimointi

Oliosuunnittelu. Oliosuunnittelu

Uudelleenkäytön jako kahteen

Avoimet ohjelmistokehykset

Muutamia peruskäsitteitä

Tuoterunko hajautetussa ympäristössä

Ohjelmistotekniikan menetelmät, suunnittelumalleja

5. Suunnittelumallit. TTY Ohjelmistotekniikka

10. Tuoterunkoarkkitehtuurit

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

TIE Ohjelmistojen suunnittelu

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

Ohjelmistoarkkitehtuurit kevät

7. Tuoterunkoarkkitehtuurit

TIE Ohjelmistojen suunnittelu

Muusta kuin vesisioista

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Ohjelmistoarkkitehtuurit harjoitustyö RobotWarGame RobotFW SimulationFW SimulationGUIFW SWT/Java Kuva 1: Esimerkki arkkitehtuurin kerroskuvasta

11/20: Konepelti auki


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

3. Komponentit ja rajapinnat

Ohjelmistoarkkitehtuurit Komponentit Kevät 2014

Ohjelmistojen mallintaminen. Luento 11, 7.12.

TIE Ohjelmistojen suunnittelu

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

Ohjelmistoarkkitehtuurit. Kevät 2014

Harjoitustehtävät ja ratkaisut viikolle 48

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Ohjelmistotuotanto. Luento

5. Suunnittelumallit. TTY Ohjelmistotekniikka

Ohjelmistoarkkitehtuurit kevät

T Henkilökohtainen harjoitus: FASTAXON

Komponentit ja rajapinnat

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Ohjelmistoarkkitehtuurit, syksy

Ohjelmistoarkkitehtuurit Komponentit Kevät 2016

Viestinvälitysarkkitehtuurit Lähtökohta:

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

TIE Ohjelmistojen suunnittelu

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

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

9. Muunneltavuuden hallinta

Suunnittelumallien käyttö ohjelmistosuunnittelussa

VisualStudio Pikaopas, osa 1: WEB sivujen suunnittelu

Rajapinta (interface)

OHJELMISTOKEHYSTEN ERIKOISTAMISTUTORIAALIT FRED- YMPÄRISTÖSSÄ

TIE Ohjelmistojen suunnittelu

13/20: Kierrätys kannattaa koodaamisessakin

Hirviö. Design Patterns

SEPA - Design Patterns

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Viestinvälitysarkkitehtuurit


Delegaatit ja tapahtumakäsittelijät

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

812341A Olio-ohjelmointi, I Johdanto

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistoarkkitehtuurit kevät

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

TIE Ohjelmistojen suunnittelu

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Ohjelmoinnin peruskurssien laaja oppimäärä

Digi-tv vastaanottimella toteutetut interaktiiviset sovellukset

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Ohjelmistoarkkitehtuurit. Kevät

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

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

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

Sunnittelumallit Harjoitustehtävät syksy 2015 / Simo Silander

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

Visual Studio T4 Tyhjästä hallittuun generointiin #tddev. Kalle Launiala.

Hirviö. Design Patterns

TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

Transkriptio:

Ohjelmistoarkkitehtuurit kehysarkkitehtuurit Kevät 2016 Samuel Lahtinen http://www.cs.tut.fi/~ohar/ 1

Yleistä Ajanvaraus välinäyttöön tarjolla TTY:llä, katso Slackistä lisätietoa Ensi viikon perjantai: esimateriaalia + viikkoharkahtavampi luento Vierailusettiä: Eloranta tulossa tod.näk 9.3.2016 Harkkatyön aikatauluun ja järjestelyihin pieniä muutoksia, tänään spämmiä Esimerkkejä harjoitustyön dokumentaatiosta Kruchten 4+1: mitä näihin voisi tulla? 2

Esimerkkejä viime vuoden dokkareista 3

Arkkitehtuurin dokumentoinnista Yksi mahdollinen tapa lähetä dokumentoimaan harjoitustyön arkkitehtuuria: C4 architecture model http://static.codingthearchitecture.com/c4.pdf https://leanpub.com/visualising-softwarearchitecture/read https://www.voxxed.com/blog/2014/10/simplesketches-for-diagramming-your-softwarearchitecture/ 4

https://www.voxxed.com/blog/2014/10/simple-sketchesfor-diagramming-your-software-architecture/ 5

https://www.voxxed.com/blog/2014/10/simple-sketchesfor-diagramming-your-software-architecture/ 6

https://www.voxxed.com/blog/2014/10/simple-sketchesfor-diagramming-your-software-architecture/ 7

12. Kehysarkkitehtuurit, software frameworks Johdanto Kehystyypit Kehysten osittaminen Kehykset ja suunnittelumallit Kehysten etuja ja ongelmia Yhteenvetoa 8

Mikä on (ohjelmisto)kehys? Perinteisesti: ohjelmistokehys on olioparadigman tapa toteuttaa tuotealusta. Kehys muodostuu kokoelmasta luokkia, jotka toteuttavat tuoteperheen yhteisen arkkitehtuurin ja toiminnallisuuden. Kehys erikoistetaan tuotteeksi. Myös ohjelman (osa)rakenteen ja sen toteuttamisen tarjoavia kehyksiä Nykyään yleistyneitä kehyksiä, tarjoavat osarungon sovellukselle 9

Kehys erikoistetaan toimivaksi tuotteeksi Kehys Sovelluskohtainen koodi kontrolli Erikoistamisrajapinta 10

Missä ohjelmistokehyksiä käytetään/mitä ohjelmistokehyksiä tunnet? 11

Mitä eroa on kehyksellä ja kirjastolla? 12

Sovelluskehys vs. perinteinen ohjelmakirjasto: Hollywoodperiaate Aliluokkia, komponentteja Sovelluskohtainen Sovellus Uudelleenkäytettävä Sovelluskehys Aliohjelmia, luokkia, moduuleita Hollywood-periaate: Älä soita meille, me soitetaan teille 13

Erikoistamistekniikat kehyksissä rajapinnan toteutus (~takaisinkutsu) periytyminen (~takaisinkutsu) olioiden/komponenttien luonti, alustus ja konfigurointi geneeristen luokkien (template) instantiointi refleksiivisyys 14

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 15

Muunneltavat kehykset A B 16

Koottavat kehykset A <<create>> B 17

Plugin-kehykset rajapintoja komponentteja 18

Kehysten osittaminen Käsitemallipohjainen lähestymistapa Komponenttipohjainen lähestymistapa Kerrostaminen: hierarkkiset kehykset 19

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) 20

Esimerkki: Simulointikehys 21

<<framework>> SimulationFW Muunneltava 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 energy interact(creature) SimulationApp main() <<create>> <<create>> EatingCreatureFactory createcreature(): Creature 22

<<framework>> SimulationFW Koottava 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() 23

<<framework>> SimulationFW <<interface>> Creature setmyworld(world) show() getx(): int gety(): int move() interact(creature) growold() die() * Plug-in kehys World getsize(): int add(creature) remove(creature) show() simulate(int,creaturefactory) 1 PluginLoader <<interface>> CreatureFactory createcreature(): Creature load() <<load>> <<plugin>> EatingApplication EatingCreature SimulationApp EatingCreatureFactory energy interact(creature) main() createcreature(): Creature <<create>> 24

Komponenttipohjainen lähestymistapa: Monoliittiset kehykset vs. frameletit Monoliittinen kehys Sovellus Kehys Framelet Framelet Komponentti Komponentti Erikoistus Erikoistus Erikoistus 25

Hierarkkinen kehys 26

Hierarkkinen kehys: yleinen simulointikehys Punamuurahaisten simulointisovellus Muurahaisten simulointikehys Hyönteisten simulointikehys Eläinpopulaatioiden simulointikehys Yleinen simulointikehys 27

Hierarkkinen kehys: esimerkkikehys EatingCraeture, EatingCreatureFactory, SimulationApp DefaultCreature, DefaultCreatureFactory World, Creature 28

Hierarkkinen kehys: liiketoimintakehys Varastonhallintasovellus Varastonhallintasovelluskehys Spring 29

Strategy Game Framework http://lurgee.net 30

Cont. 31

GUI-kehys-esimerkki: Qt Qt framework instantiointia QLabel QPushButton QMainWindow erikoistus MyLabel 32

Windows Ribbons: esimerkki frameworkista ja sen dokumentoinnista Windows ja Office 2007--- tyylin käyttölliittymät Miten dokumentoitu: Mikä se on, kannattaako käyttää: https://msdn.microsoft.com/enus/library/windows/desktop/dn742393%28v=vs.85%29.aspx Toteutusohjeistusta: https://msdn.microsoft.com/enus/library/windows/desktop/dd316924%28v=vs.85%29.aspx Esimerkkiä: http://www.codeproject.com/articles/119319/windows- Ribbon-Framework-in-Win-C-Application 33

Kehysesimerkki, Windows Ribbons 34

Command and Control rakenne https://msdn.microsoft.com/en-us/library/windows/desktop/dd742866%28v=vs.85%29.aspx 35

Kehys vai kirjasto? 36

Esimerkkejä kehyksistä Esimerkkikoodi: Knockout.js Knockout ja tutorial 2: http://jsfiddle.net/nfzycs4k/ Javascript-kehykset, vähemmän erikoistamista, enemmän omien instanssien luomista ja kehyksen tarjoamiin palveluihin luottamista http://en.wikipedia.org/wiki/comparison_of_javascript_frameworks Verkkokehykset (web app frameworks), Struts, Django, Ruby on rails, Vaadin Pelit, pelimoottorit, fysiikka, jne. GUI-kehykset: Qt, Eclipse 37

Javascript -kehyksistä Javascript-frameworkeistä: http://www.allenpike.com/2015/javascript-framework-fatigue/ http://teropa.info/blog/2015/03/02/change-and-its-detection-injavascript-frameworks.html http://www.developereconomics.com/feature-comparison-of-4-popularjs-mv-frameworks/ http://www.developereconomics.com/comparison-4-popular-javascriptmv-frameworks-part-2/ 38

Kysyttävää?

Kehykset ja suunnittelumallit Suunnittelumalleilla 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. 40

Suunnittelumallit kehyksen erikoistamisrajapintana Sovelluskohtainen koodi Kehys Suunnittelumallin ilmentymä 41

Suunnittelumallit ja kehykset Graphicaltem draw * children Kuuluu kehykseen Rectangle Circle FigGroup draw draw draw for all children c: c.draw; 42

Tyypillisiä kehyksissä käytettyjä GoF-suunnittelumalleja Operaatiorunko (Template Method) Strategia (Strategy) Kuorruttaja (Decorator) Tehtaat (Abstract Factory, Factory Method) Tarkkailija (Observer)... 43

Operaatiorunko (Template Method) Ongelma: Metodin sovelluskohtainen staattinen variointi 44

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ö 45

Strategia (Strategy) Ongelma: Metodin dynaaminen sovelluskohtainen variointi (isäntäolion olemassaolon aikana) 46

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() 47

Kuorruttaja (Decorator) Ongelma: Miten antaa mahdollisuus liittää sovelluskohtaista toiminnallisuutta tiettyyn kehyksen komponentiin dynaamisesti? 48

Esimerkki 49

basic interaction ; BasicBehavior Kehys SpecialBehavior interaction() next.interaction(); interaction() 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 50 50

Abstrakti tehdas (Abstract Factory) Ongelma: Miten luoda yhdenmukaisesti tietyn sovelluskohtaisen luokkakokoelman olioita kehyksessä? 51

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() 52

Tarkkailija (Observer) Ongelma: Miten antaa sovelluskohtaisille komponenteille mahdollisuus reagoida jonkin kehyksen komponentin tilan muutoksiin? 53

if meteorhit { for all obs: obs.notifymeteor(); } Kehyksessä Kehys MeteorSource DefWorld MeteorObserver notifymeteor() Creature register( ) simulate() register(meteorobserver) Sovellus MyCreature notifymeteor() 54

Kahden kehyksen yhdistäminen säikeillä GUI-kehys Simulointikehys MainWindow Controller Manager EventLoop säie säie 55

Kehyksien kehittämisestä Luettavuus, kehyksen koodi luettavaa, kehyksen käyttö ja luettavan koodin tuottaminen Koodin lukeminen vs. kirjoittaminen Käytön helppous, yksinkertaisuus Älä pakota käyttäjiä toistamaan samaa asiaa (ensin kalikuvaus, sitten sama koodissa, jne.) Mieti myös koodintäydennystä (ei getelementname, getelementtype, getelement ) Virheiden etsintä ajoaikana, joku ei toimi (oikein) vs. käännösvirhe (jos staattisesti tyypitetty) suosi käännösaikaisia tarkistuksia 56

Kehyksien kehittämisestä Piilomerkitykset ja abstraktioiden särkyminen Dokumentoi piilomerkitykset Pyri tekemään abstraktiot niin, etteivät ne vuoda osassa tilanteista = yhteneväisyys Laajennettavuus Yksinkertaisuus, dependency injection, helppo alkuun pääsy 57

Kehyksen ominaisuuksia (vielä) Käänteinen kontrolli, Inversion of control: kehys vastaa yleisestä ohjelman suorituksesta (ei kehystä käyttävän koodin tekijä/kehystä käyttävä koodi) Laajennettavuus, muokattavuus: muokataan luomalla uusia osia, erikoistamalla kehyksen peruspalveluita, parametrien avulla Kehyksellä oletustoiminnallisuutta: kehys tekee jotakin jo valmiiksi, ei pelkästään kokoelma tyhjiä rajapintoja Kehyksen omaa koodia ei muokata, kuten ei yleensä kirjastonkaan 58

Kehykset etuja? 59

Kehyksen ongelmat? 60

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 Kovat osaajat tekevät kehyksen, sisällöntuottamisen jne. taitajat tuotteen 61

Kehysten ongelmia Teknisesti vaativa tapa tehdä ohjelmistoja, prosessi usein hyvin iteratiivinen Kehyksistä tulee helposti suuria, mutkikkaita ja vaikeasti hallittavia ohjelmistoja Ajankäyttö, kustannukset, jos ollaan tekemässä vain yksittäistä sovellusta Sovellusten testaaminen voi olla vaikeaa ilman kehyksen koodia Sovelluksen tekeminen kehyksen päälle: opettelu, joustavuus?, riippuvuus 62

Yhteenvetoa Perinteinen kehys 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ä Kehys voi olla hoikahko suhteessa itse sovellukseen: toiminnallinen runko ja sisältö 63

Yhteenvetoa Suunnittelumallit ja kehykset, peruskäyttö pitäisi onnistua ilman suunnittelumalleihin perehtymistä Vältä turhia yksityiskohtia, tee käytöstä mahdollisimman yksinkertaista Kerro miten asiat tehdään käyttäjän näkökulmasta, älä miten ne on toteutettu kehyksen sisällä Javascript-kehykset ja vastaavat: Tarjoavat helpotusta sovelluksen toteuttamiseen Esimerkiksi valmis MVC-pohja, ei tarvitse lähteä toteuttamaan asiaa tyhjästä Käyttäjän koodi tekee varsinaisen sovellusosan, framework huolehtii yleiset asiat 64

Kysyttävää?