Ohjelmistoarkkitehtuurit Luento 8 Ohjelmistokehykset Tuoteperheet 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 1
OHJELMISTOKEHYKSET 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 2
Ohjelmistokehykset (software frameworks) Osittain abstraktiksi jätettyjä ohjelmistorunkoja, joita eri tavoin täydentämällä saadaan rakennettua kokonaisia uusia sovelluksia tai sovelluksen osia Tavoitteena laajamittainen ja systemaattinen ohjelmistojen (sekä koodin että yleisrakenteen eli arkkitehtuurin) uudelleenkäyttö Olioperustaisissa kehyksissä ohjelmistorunko = kokoelma luokkia, komponentteja ja rajapintoja Ohjelmistokehykset sisältävät ohjelmakoodia, joten ne ovat sidoksissa ohjelmointikieleen Kehys on usein osa laajempaa ohjelmistoalustaa (platform) ja kehykseen voi kuulua omia työkaluja ja apuvälineitä 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 3
Ohjelmistokehykset 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 4
Ohjelmistokehykset Kehykset eroavat (luokka-, funktio-) kirjastoista (library) 1 Inversion-of-control: kehyksen sisäänrakennettu koodi ja sen logiikka ohjaa sovelluksen suoritusta (kontrollinkulkua), ei sovelluskohtainen koodi kuten luokkakirjastoja käytettäessä Oletustoiminnallisuus: kehys tarjoaa käyttökelpoista oletustoiminnallisuutta, ei pelkästään tynkätoteutuksia (no-ops, stubs) Laajennettavuus: kehyksen käyttäjä voi valikoiden syrjäyttää, erikoistaa tai lisätä kehyksen tarjoamaa toiminnallisuutta oman sovelluksena tarpeisiin kehyksen tekijän etukäteen määräämillä tavoilla Kehyksen muuttumaton koodi: kehyksen koodia ei ole (yleensä) tarkoitettu käyttäjän muutettavaksi - paitsi laajentamalla sitä tietyillä tavoilla erikseen määrätyissä kohdissa (kts. edelllinen kohta) [1] http://en.wikipedia.org/wiki/software_framework 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 5
Ohjelmistokehykset Ohjelmoijan näkökulmasta usein: Kehys = API Teknisesti ajatellen kehys yleensä sisältää ja tarjoaa useita API:ja (rajapintoja) eri tarkoituksiin Rajanveto ei aina käytännössä ole kovin selvä, käytännössä monia kehyksiä kutsutaan yksinkertaisesti API:ksi Ensimmäinen laajalti käytetty ohjelmistokehys: Smalltalk- 80-ympäristön Model-View-Controller Alkuperäisen Model-View-Controller-kehyksen arkkitehtuurin pohjalta määritelty MVC-arkkitehtuurityyli Erityisesti käyttöliittymätoteutukseen on kehitetty useita kehyksiä työasemasovelluksiin, web-sovelluksiin, useille eri ohjelmointikielille, kaupallisia ei kaupallisia 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 6
Ohjelmistokehykset Kehys voi olla kokonaisvaltainen koko sovellusta hallitseva tai osittaisongelmaan tarkoitettu tukikehys esim. käyttöliittymäkehykset rajautuvat käyttöliittymän toteutukseen, Java Enterpise Edition tarjoaa puitteet ja tuen kokonaisten yritysjärjestelmien toteuttamiseen (JavaEE on oikeastaan alusta eli platform, joka tarjoaa useita kehyksiä eri tarkoituksiin) Ns. sovelluskehykset on tarkoitettu tietyntyyppisten sovellusten toteuttamiseen Androidissa Java-sovelluksen rakenteen määrää ohjelmistokehys, joka on osa laajempaa käyttöjärjestelmään sisään rakennettua sovellusarkkitehtuuria Ohjelmistokehys ei ole valmis ohjelmistototeutus, vaan toteutus saadaan aikaan kehystä täydentämällä tai mukauttamalla 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 7
Ohjelmistokehykset - termejä Ohjelmistokehyksen erikoistaminen (framework specialization, framework adaptation) = ohjelmiston (osan) toteuttaminen täydentämällä kehyksen tarjoamaa ohjelmarunkoa Abstraktien luokkien erikoistaminen, Toiminnallisuuden koostaminen kehyksen konkreettisista luokista Sovelluskehys (application framework) = kehys, josta voidaan erikoistaa kokonainen sovellus Komponenttikehys (framelet) = minikehys, jonka erikoistamisen tuloksena syntyy yksittäinen komponentti 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 8
Ohjelmistokehykset - termejä Laajennoskohta, variaatiopiste (hot spot, variation point) = kehyksen aukkokohta, jota täydentämällä voidaan sovelluksen puolella varioida ja/tai ottaa käyttöön tietty kehyksen toiminnallisuus/ominaisuus Erikoistamisrajapinta (specialization interface) = laajennoskohtien ja niihin liittyvien vaatimusten kokoelma Kehyksen erikoistamisrajapinta on tyypillisesti paljon monimutkaisempi kuin yksittäisen komponentin rajapinta Erikoistamisrajapinnan laajennoskohtien välillä on riippuvuuksia, joiden ymmärtäminen on edellytys kehyksen oikealle käytölle 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 9
Ohjelmistokehykset - toteutus Erikoistamiseen voidaan käyttää esim. rajapintojen toteutusta (vrt. Dependency Inversion) periytymistä ja syrjäyttämistä (jos kieli tarjoaa) Kehyksen määrittelemien olioiden luontia ja kompositiota (yhteen kytkeminen ja konfigurointi, vrt. Dependency Injection) geneerisiä rakenteita myöhäistä sidontaa ja sitä tukevia rakenteita Sovelluskehyksissä päälogiikasta vastaa kehys ja sovelluskohtaiset erityistoimet toteutetaan täydennyksinä 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 10
Ohjelmistokehykset - toteutus Sovelluskohtainen koodi täydennys täydennys täydennys Kontrolli- ja datavuo kutsu kutsu kutsu Staattinen riippuvuus (tässä periytyminen) Sovelluskehys Kutsuissa käytössä ns. käänteinen kutsurakenne = kehys kutsuu dynaamista sidontaa hyväksikäyttäen sovelluskohtaisia täydentäviä moduuleja (Hollywood-periaate: don t call us we call you) 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 11
Ohjelmistokehykset - toteutus Kehyksissä sovelletaan tyypillisesti suunnittelupatterneja (design patterns) joustavuuden ja laajennettavuuden ynnä muiden hyvien asioiden saavuttamiseksi Joidenkin mallien soveltaminen on välttämätöntä kehyksen erikoistamismahdollisuuksien kannalta Kehyksen koodi sisältää tyypillisesti useiden suunnittelumallien ilmentymiä Alkuperäiset suunnittelumallit on löydetty analysoimalla olemassa olevia kehyksiä (esimerkiksi Smalltalk, HotDraw) Suunnittelumallit sopivat usein kehysten dokumentointiin [Johnson, 1992] Suunnittelupatterneissa on tyypillisesti helposti nähtävissä luontevasti kehykseen kuuluva osa (esim. abstraktit luokat) ja tuotekohtainen osa (esim. vaihtuvat konkreettiset luokat) 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 12
Ohjelmistokehysten haasteita Tekninen vaativuus ja monimutkaisuus Arkkitehdin tunnettava hyvin sovellusalue ja joustavuuteen liittyvät oliotekniikat (esim. suunnittelumallit) Abstraktius voi tehdä kehyksestä erikoistajille hankalasti ymmärrettävän Kehysten yhdistely voi olla ongelma Mitä tehdään, jos halutaan käyttää useampaa kehystä, joista kukin määrittelee pääkontrollisilmukan? 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 13
Ohjelmistokehysten haasteita Monoliittisuus Kehys saattaa kasvaa suureksi ja hallitsemattomaksi Laadullinen varianssi Variaatiopisteet liittyvät useimmiten toiminnallisuuden muokkaamiseen Laatuominaisuuksia variointi sen sijaan yleensä hankalaa (esim. tietoturvan lisääminen, suorituskyvyn optimointi, ) Dokumentointi Olennaista on erikoistamisrajapinnan kuvaus Tälle ei kuitenkaan vakiintunutta kuvaustapaa 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 14
Ohjelmistokehysten haasteita Toteutuksen ongelmia Joustavien ratkaisujen toteuttaminen edellyttää asiantuntemusta (esim. suunnittelumallit auttavat) Joustavuus Ylläpito vaativaa monimutkaisuus, abstraktit käsitteet Testaus? (vrt. tuoterunkojen testaus) Käytön ongelmia Miten kehysten käyttö pitäisi dokumentoida? Keittokirjat (cookbooks) Suunnittelumallipohjainen dokumentointi Riittääkö tavanomainen dokumentaatio erikoistamisrajapinnan kuvaukseen? Työkalutuki sovellusten rakentamiseen JavaEE Spring Framework Spring Boot 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 15
TUOTEPERHEET JA NIIDEN ARKKITEHTUURIT 19.10.2017 CSM14101 Ohjelmistoarkkitehtuurit 16
Tuoteperheet Määritelmiä: Tuoteperhe (product family, product line): toiminnaltaan ja rakenteeltaan samankaltaisten, tietylle sovellusalueelle toteutettujen ohjelmistotuotteiden muodostama joukko Tuoterunko (tai tuotealusta, product platform): ohjelmisto, joka toteuttaa tuoteperheen tuotteille yhteisen rakenteen ja toiminnallisuuden Tuoterunkoarkkitehtuuri (product-line architecture, PLA): tuoterungon ja siihen liittyvän tuoteperheen arkkitehtuuri Tuoterunkoarkkitehtuuriin katsotaan joskus kuuluvan mukaan myös ohjelmistot ja työkalut, joita käytetään apuna tuotteiden tekemisessä tuoterungosta 19.10.2017 17
Tuoterunkoarkkitehtuuri Tuoterunkoarkkitehtuurin toteutuksen komponentteja voidaan hyödyntää kaikissa eri tuotteissa, mikä Parantaa laatua Koodi testattu useassa aiemmassa konfiguraatiossa Nopeuttaa ohjelmistokehitystä Valmiita komponentteja tarjolla Helpottaa projektin hallintaa Samankaltaiset tuotteet -> samankaltaiset projektit -> sama prosessi Standardoi tuotteita Runko antaa puitteet Tehostaa toimintaa, sillä perusarkkitehtuuri on suunniteltu ja toteutettu jo tuoterungossa 19.10.2017 18
Eri tapoja toteuttaa ohjelmistotuote Yleiskäyttöiseen ohjelmointikieleen, DOL:ään (eli sovellusaluekohtaiseen kieleen) ja tuoterunkoon/ohjelmistoalustaan perustuva ohjelmistokehitys Tuoterunko: 19.10.2017 19
Sovellusaluesuuntautunut ohjelmistotuotanto Tuoterungon suunnittelu Luodaan tuoterungon perusta olemassa olevan toteutuksen komponenteista Rakennetaan tuoterunko inkrementaalisesti: ensin vähän ominaisuuksia myöhemmin kattava tuoterunko Jos tuoteperheen tuotteet ovat kaikki uusia, voidaan rakentaa suoraan kattava tuoterunko Edellytyksenä kuitenkin sovellusalueen ja sen vaatimusten perusteellinen tuntemus (onko mahdollista ennen ensimmäisenkään tuotteen toteuttamista?) Otetaan ensimmäinen (uudentyyppinen) tuote tuoterungon perustaksi lisätään muunneltavuutta tarpeen mukaan Ohjelmistokehykset ovat yksi tapa toteuttaa tuoterunkoja 19.10.2017 20
Muunneltavuus Keskeinen ongelma tuoterungossa: muunneltavuuden hallinta Tuoterungon toteuttavassa ohjelmistoalustassa on tyypillisesti mukana pakollisia, valinnaisia ja vaihtoehtoisia komponentteja Tuotteessa on mukana myös tuotekohtaisia uusia komponentteja 19.10.2017 21
Muunneltavuus valinnainen valinnainen pakollinen vaihtoehtoinen vaihtoehtoinen, valittava Vaihtoehtoinen, joku näistä mahdollisesti tuotekohtainen eli voidaan korvata uudella uusi yhden tuotteen komponentti 19.10.2017 22
Tuoterunkopohjainen ohjelmistokehitys 19.10.2017 23
Tuoterunkopohjainen ohjelmistokehitys Tuoterunkopohjainen ohjelmistokehitys jakautuu kahteen eri osaan: alustakehitysprosessiin (domain engineering) tuotekehitysprosessiin (application engineering) Näitä edeltää esitutkimusvaihe Arvioidaan tuoteperheen kannattavuutta (vaikuttavana tekijänä erityisesti oletettava tuoteperheen tuotteiden lukumäärä), vrt. aiemmin esitetty laskennallinen malli Kannattaako rakentaa tuoteperhe vai toteuttaa perheeseen tulevat tuotteet erillisesti Vaatimusmäärittely (domain analysis) sovellusalueen käsitemalli (domain model), muunneltavuusvaatimukset, yhteiset vaatimukset Käsitemalli: kommunikointi, sanasto, ymmärtäminen Muunneltavuusvaatimukset: mitkä ominaisuudet voivat vaihdella, missä rajoissa, milloin muunnelma kiinnitetään (staattisesti koodausaikana, linkkausaikana, alustusaikana, tuotteen käytön aikana) 19.10.2017 24
Tuoterunkopohjainen ohjelmistokehitys Tuoterunkoarkkitehtuurin suunnittelu (PLA design) Pohjana esimerkiksi esitutkimusvaiheessa kartoitetut arkkitehtuurityylit tai perinteisen oliosuunnittelun mukaan sovellusalueen käsitemalli. Iteratiivinen prosessi, jossa muunneltavuus keskeisessä asemassa Noudatetaan esimerkiksi aiemmin esitettyä arkkitehtuuripainotteista prosessia, jossa laatuvaatimuksia (tässä muunneltavuus) tarkastellaan yksi kerrallaan ja tarvittaessa muokataan arkkitehtuuria. HUOM! on varmistettava, ettei jo tehtyjä muunneltavuutta edistäviä ratkaisuja tuhota muiden vaatimusten mukaisten muutosten yhteydessä. Huom! Muunneltavuus eri tuotteiden välillä ei välttämättä tarkoita ulkoiselta toiminnaltaan toisistaan poikkeavia tuotteita (muunnettavuus esim. siirrettävyyden takia) 19.10.2017 25
Tuoterunkopohjainen ohjelmistokehitys Konkreettisen toteutusympäristön suunnittelu (application engineering environment) Toteutusvälineistö (pelkkä tuoterunkoarkkitehtuurin kuvaus ja sen toteuttava alusta eivät yleensä riitä) Yksinkertaisin ratkaisu: tarjotaan hyvin määritelty API, joka piilottaa tuoterunkoarkkitehtuurin ja ohjelmistoalustan toteutuksen tuotteiden kehittäjiltä Usein tarpeen paljastaa osa tuoterunkoarkkitehtuurista kehittäjille (vrt. esim. white-box-tyyppinen uudelleenkäyttö sovelluskehyksissä) Ongelma: miten tuotteen vaatimukset mäpätään tuoterunkoarkkitehtuurin tarjoamiin ominaisuuksiin? dokumentointi, työkalutuki 19.10.2017 26
Tuoterunkopohjainen ohjelmistokehitys Tuotekehitysprosessi Normaaliin tapaan ensin tuotteen vaatimusten kerääminen ja vaatimusanalyysi (haastattelut, etc.) välitetään asiakkaille tieto tuoterungon mahdollisuuksista Varsinaisen kehitystyön laatu riippuu hyvin paljon tuoterungon laadusta. 19.10.2017 27
Tuoterunkoarkkitehtuurin kerrosmalli tuotetuote Sovellusalusta Arkkitehtuurialusta Arkkitehtuurialusta Resurssialusta 19.10.2017 28
Tuoterunkoarkkitehtuurin kerrosmalli Resurssialusta Yleisiä resursseihin (kommunikaatio, tietojen säilytys, prosessien hallinta, grafiikka) liittyviä peruspalveluja Arkkitehtuurialusta Yleisiä arkkitehtuurityyliin liittyviä palveluja Sovellusalusta Runko, sovelluskehys, patternit Sovellusalueen erityispiirteet, varianssipisteet Tuotekerros Tuotekohtaiset piirteet Vrt. Bob Martinin Clean Architecture 19.10.2017 29
Tuoterunkojen haasteita Tyypillisimmät ongelmat eivät ole teknisiä: Suuri henkilöstön vaihtuvuus välttämättä motivoiva tuoterunkolähestymistapa ei ole Tuoterungon kehittäjillä liian kriittinen merkitys organisaatiossa Johto, markkinointi vs. tuoterungon kehittäminen Pitkän tähtäimen kehitystyöhön voi olla vaikeaa saada rahoitusta Tuoterungon tasapäistävä vaikutus: toisaalta liian monimutkainen toisaalta liian yksinkertainen 19.10.2017 30
Tuoterunkojen haasteita Tuoterunkojen testaus on usein hankalaa Eivät itsenäisesti testattavissa (?) Usein jokainen toteutettava sovellus testataan erikseen Tuoterungon testaamiseen voidaan käyttää referenssisovelluksia, jotka käyttävät tuoterungon piirteitä kattavasti Testattavuuden helpottamiseksi saatetaan joutua rajoittamaan variaatiomahdollisuuksia Tuotteiden hallinta voi myös monimutkaistua: muutos alustaan kaikki eri tuotteet testattava (regressio) Ylipäänsä erilaisien riippuvuuksien dokumentointi tärkeämpää kuin täysin itsenäisissä sovelluksissa Jos tuotteet perustuvat alustan eri versioihin, halutaanko muutos kaikkiin alustaversioihin ja tuotteisiin vai ei? Bugikorjaus (kaikkiin?) vs. uusi ominaisuus (vain uusiin tuotteisiin?) 19.10.2017 31