Ohjelmistotuotanto. Luento 9 23.4.2012



Samankaltaiset tiedostot
Ohjelmistotuotanto. Luento

Ohjelmistotuotanto. Luento

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

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

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Muusta kuin vesisioista

Ohjelmistotuotanto. Luento

Suunnittelumalleja, MVC. Juha Järvensivu 2008

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

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

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

T Henkilökohtainen harjoitus: FASTAXON

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

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

Muutamia peruskäsitteitä

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Arkkitehtuuri. Ylätason sovellusarkkitehtuuri

TIE Ohjelmistojen suunnittelu

Ohjelmistojen mallintaminen. Luento 12,


Hirviö. Design Patterns

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Suunnittelumallien käyttö ohjelmistosuunnittelussa

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Viestinvälitysarkkitehtuurit

Osio 4: Graafinen käyttöliittymä

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

SEPA - Design Patterns

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

Ohjelmistojen mallintaminen. Luento 6, 5.12.

Web-palvelu voidaan ajatella jaettavaksi kahteen erilliseen kokonaisuuteen: itse palvelun toiminnallisuuden toteuttava osa ja osa, joka mahdollistaa k

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Viestinvälitysarkkitehtuurit Lähtökohta:

Hirviö. Design Patterns

12. Kehysarkkitehtuurit

Kehyspohjainen ohjelmistokehitys

Ohjelmistotekniikan menetelmät, arkkitehtuuria ja rajapintoja

Palveluperustaiset arkkitehtuurityylit

Tietorakenteet, laskuharjoitus 7,

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Ohjelmistoarkkitehtuurit kevät

Rajapinta (interface)

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

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

JUnit ja EasyMock (TilaustenKäsittely)

Tarjolla tänää: Ohjelmiston toteutuksesta. Kuinka tulla hyväksi ohjelmoijaksi? CRC-kortit. Testilähtöinen kehittäminen JOT2007. Uudelleenrakentaminen

FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen

Test-Driven Development

FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Kertaus: yleistys-erikoistus ja perintä

Ohjelmistokehykset (software frameworks)

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmistojen mallintaminen. Luento 10, 3.12.

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

Ohjelmistotuotanto. Luento

Jypelin käyttöohjeet» Ruutukentän luominen

19/20: Ikkuna olio-ohjelmoinnin maailmaan

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

Toiminnot eli käyttäytyminen. Tieto eli rakenteelliset ominaisuudet

ELM GROUP 04. Teemu Laakso Henrik Talarmo

4. Luokan testaus ja käyttö olion kautta 4.1

2. Olio-ohjelmoinista lyhyesti 2.1

11/20: Konepelti auki

Ohjelmistoarkkitehtuurit Kevät 2014 Arkkitehtuurityylit vol 2

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

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

TIE Ohjelmistojen suunnittelu

Osio 4: Graafinen käyttöliittymä

Ohjelmistojen mallintaminen. Luento 5,

Hieman lisää malleista ja niiden hyödyntämisestä

Ohjelmistoarkkitehtuurit

Kehyksillä toteuttettujen tuotelinjojen rakenteellinen optimointi

Olio-ohjelmointi Javalla

AutoCAD-natiiviobjektin toteutus

Ohjelmistoarkkitehtuuri

S11-09 Control System for an. Autonomous Household Robot Platform

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmistoarkkitehtuurit, syksy

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Perusarkkitehtuurin ja vuorovaikutuksen mallintamisen perusteita.

HELIA 1 (14) Outi Virkki Käyttöliittymät ja ohjlmiston suunnittelu

Ohjelmistojen mallintaminen, oliosuunnittelua ja suunnittelumalleja

Testivetoinen ohjelmistokehitys

T Ohjelmistojen määrittely- ja suunnittelumenetelmät Harjoitustyöraportti TNT - Tarkistetaan Ne Tentit Arkkitehtuuri- ja suunnittelumalli

Ylläpitodokumentti NJC2. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Graafinen käyttöliittymä, osa 1

SEPA päiväkirja. Aihe: Suunnittelumallit Tekijät: Tuukka Laakso ja Antti Kettunen Ryhmä: Neptune T Ohjelmistoprojekti I

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

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

KERROSARKKITEHTUURIN SUUNNITTELUMALLIT. Kuisma Lehtonen Joensuun yliopisto Tietojenkäsittelytiede Pro gradu -tutkielma

TIE Ohjelmistojen suunnittelu

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

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

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

Transkriptio:

Ohjelmistotuotanto Luento 9 23.4.2012

Lisää suunnittelumalleja

Olion rikastaminen dekoraattorilla Joskus eteen tulee tarve lisätä olioon jotain ekstraominaisuuksia, pitäen kuitenkin olio sellaisena että sitä käyttäviin ohjelmanosiin ei tarvitse tehdä muutoksia Dekoraattori (decorator) -suunnittelumalli tuo avun http://sourcemaking.com/design_patterns/decorator Dekoraattorissa muodostetaan rikastettu olio, jolla on täysin sama rajapinta kuin oliolla johon lisäominaisuuksia halutaan Dekoraattoriolio yleensä delegoi varsinaisen tehtävän, eli olion vanhan vastuun suorittamisen alkuperäiselle oliolle Katsotaan ensin hieman yksinkertaisempaa tapausta ks https://wiki.helsinki.fi/display/ohtu2012/luento9 Dekoroitu Random Esimerkissä tehdään dekoroitu Random-olio, jonka avulla on mahdollista testata satunnaislukuja käyttävää ohjelmaa Dekoroitu Random ottaa talteen kaikki arvotut luvut Testissä käytetään dekoroitua versiota normaalin Randomin sijaan Testi pääsee kysymään dekoroidulta randomilta arvotut numerot

Dekoroitu pino, pinotehdas ja rakentaja Tarkastellaan https://wiki.helsinki.fi/display/ohtu2012/luento9 esimerkkejä Dekoroitu Pino ja Pinotehdas Saamme dekoraattorin avulla hienosti tehtyä monen eri ominaisuuskombinaation omaavia pinoja Dekoroitujen pinojen luominen on monimutkaista, mutta Factoryn avulla saamme peitettyä monimutkaisuuden pinon käyttäjältä Factorystä muodostuu kuitenkin ongelma... Rakentaja (engl builder) -suunnittelumalli kuitenkin ratkaisee ongelman! Rakentajassa on kiinnitetty erityinen huomio metodien nimemiseen: Pinorakentaja rakenna = new Pinorakentaja(); Pino pino = rakenna.kryptattu().prepaid(10).pino(); On haettu mahdollisimman luonnollista kieltä muistuttavaa luettavuutta Muodostettiin DSL (domain specific language) pinojen luomiseen http://martinfowler.com/bliki/fluentinterface.html http://www.infoq.com/articles/internal-dsls-java

Komposiitti ja proxy Sivun https://wiki.helsinki.fi/display/ohtu2012/luento9 esimerkit Komposiitti ja Proxy demonstroivat jälleen kahta suunnittelumallia Komposiitti on tapa järjestää puu/rekursiomaisesti rakentuvia samankaltaisesti ulospäin käyttäytyviä olioita http://sourcemaking.com/design_patterns/composite Komposiitti kapseloi yhden rajapinnan taakse joko yksittäisen olion (kuten esimerkissä erotinelementin) tai mielivaltaisen monimutkaisen elementeistä koostuvan puumaisen rakenteen Käyttäjän eli esimerkissämme dokumentin kannalta yksittäisen elementin sisäisellä rakenteella ei ole merkitystä, elementti osaa tulostaa itsensä ja se riittää dokumentille Joskus käytettävä olio voi olla luonteeltaan sellainen, että olion itsensä käyttö on raskasta ja usein riittää että olioa edustaa joku muu siihen asti kunnes olioa itseään todellakin tarvitaan Tälläisissä tilanteissa proxy-suunnittelumalli tuo ratkaisun http://sourcemaking.com/design_patterns/proxy Esimerkissämme web-elementti toteutetettiin proxyn avulla

Luokan rajapinnan muuttaminen adapterilla Äsken käsiteltyjen suunnittelumallien, dekoraattorin, komposiitin ja proxyn yhteinen puoli on, että saman ulkokuoren eli rajapinnan takana voi olla yhä monimutkaisempaa toiminnallisuutta joka on kuitenkin täysin kapseloitu käyttäjältä. Tarkastellan nyt tilannetta, jossa käytettävissä on luokka joka oleellisesti ottaen tarjoaa halutun toiminnallisuuden, mutta sen rajapinta on hieman vääränlainen esim. metodien nimien tai parametrien osalta Perintä ei siis sovi ratkaisumenetelmäksi Alkuperäistä luokkaa ei kuitekaan haluta tai voida muuttaa sillä muutos rikkoisi luokan muut käyttäjät Adapteri-suunnittelumalli sopii tälläisiin tilanteisiin http://sourcemaking.com/design_patterns/adapter Tutkitaan https://wiki.helsinki.fi/display/ohtu2012/luento9 esimerkkiä adapteri Pino adaptoidaan sopimaan rajapinnaltaan paremmin uuteen käyttötilanteeseen

Paluu suuriin linjoihin Arkkitehtuurin yhteydessä mainitsimme kerrosarkkitehtuurin josta esimerkkinä oli Kumpula biershopin arkkitehtuuri Kerroksittaisuudessa periaate on sama kuin useiden suunnittelumallien ja hyvän oliosuunnittelussa yleensäkin kapseloidaan monimutkaisuutta ja detaljeja rajapintojen taakse Tarkoituksena ylläpidettävyyden parantaminen ja kompleksisuuden hallinnan helpottaminen Kerroksen N käyttäjää on turha vaivata N:n sisäisellä rakenteella Eikä sitä edes kannata paljastaa koska näin muodostuisi eksplisiittinen riippuvuus käyttäjän ja N:n välille Pyrkimys siihen että kerrokset ovat mahdollisimman korkean koheesion omaavia, eli yhteen asiaan keskittyvä Käyttöliittymä Tietokantayhteydet Liiketoimintalogiikka Kerrokset taas ovat keskenään mahdollisimman löyhästi kytkettyjä

Domain Driven Design Viimeaikaisena voimakkaasti nousevana trendinä on käyttää sovelluksen koodin tasolla nimentää joka vastaa liiketoiminta-alueen eli bisnesdomainin terminologiaa Yleisnimike tälle tyylille on Domain Driven Design, DDD ks esim. http://www.infoq.com/articles/ddd-evolving-architecture Ohjelmiston arkkitehtuurissa on DDD:tä sovellettaessa (ja muutenkin kerrosarkkitehtuuria sovellettaessa) on kerros joka kuvaa domainin, eli sisältää liiketoimintaoliot Esim. Kumpula Biershopin domain-oliot: Tuote Varasto Ostos Ostoskori Asiakas Ostostapahtuma

Domain Driven Design Domain-oliot tai osa niistä yleensä mäpätään tietokantaan Mäppäyksessä käytetään usen DAO-suunnittelumallia, johon tutustuimme ohimennen laskareissa 3 DAO on oleellisesti sama asia jota kutsutaan data mapperiksi: http://martinfowler.com/eaacatalog/datamapper.html DAO:n lisäksi on muitakin mappaystapoja, kuten Ruby on Railsin käyttämä Active Record http://martinfowler.com/eaacatalog/activerecord.html Domain-oliot tietokantaan mäppäävät komponentit muodostavat oman kerroksen kerrosarkkitehtuurina Joissain suunnittelutyyleissä Domain-olioiden ja sovelluksen käyttöliittymän välissä on vielä erillinen palveluiden kerros http://martinfowler.com/eaacatalog/servicelayer.html Palvelut koordinoivat domain-olioille suoritettavaa toiminnallisuutta, esim. ostoksen laitto ostoskoriin tai ostosten maksaminen Ideana on eristää palveluiden avulla kaikki sovelluslogiikka käyttöliittymältä

Palvelukerros Kumpula Biershopissa Palvelukerroksessa jokaisen käyttöliittymätason toiminnallisuuden toteutus omana command-suunnittelumallin mukaisena oliona Parin sivun päästä havainnollistavana esimerkkinä LisäysKoriin-olion luonti ja kutsu LisäysKoriin-olio suorittaa kaiken interaktion domain-olioiden kanssa Käyttöliittymä käyttää domain-olioita ainoastaan web-sivulla näytettävän datan renderöintiin Komento-oliot muodostavat oikestaan fasaadi-suunnitelumallin mukaisen eristävän kerroksen käyttöliittymän ja alempien kerrosten välille Tarjoaa hyvin rajatun rajapinnan jonka kautta kerrosta käytetään, eristää kerroksen toiminnallisuuden täysin http://sourcemaking.com/design_patterns/facade Sovelluslogiikan testaaminen ilman käyttöliittymää onnistuu helposti yksikkötesteillä testaamalla command-olioiden ja domain-olioiden interaktiota

Model View Controller el MVC -malli MVC-mallilla tarkoitetaan periaatetta jonka avulla malli (model) eli liiketoimintalogiikan sisältävät olion (esim. domain-oliot) eristetään käyttöliittymän näytöt (view) generoivasta koodista Kumpula Biershopissa on oikeastaan sovellettu WebMVC:tä, eli MVC:n www-sovelluksiin sopivaa varianttia Ideana on laittaa näytön/näytöt generoivan koodin ja sovelluslogiikasta huolehtivien olioiden väliin kontrolleri (controller) Kontrolleri huolehtii esim. nappien klikkaamisen tai web-sovelluksissa osoitteisiin navigoinnin tai lomakkeiden lähettämisen edellyttävän toiminnallisuuden suorittamisesta kutsumalla sopivia modelin olioita Näytöt generoivat käyttäjälle näytettävän käyttöliittymän käyttäen joko suoraan malleissa olevaa dataa tai saamalla datan kontrollerin välityksellä (kuten WebMVC:ssä tapahtuu) ks. https://wiki.helsinki.fi/display/ohtu2012/luento9 MVC Model ei tunne kontrollereja eikä näyttöjä ja samaan modelissa olevaan dataan voikin olla useita näyttöjä

Riippuvuuksien eliminointi Kerrosarkkitehtuurissa ja MVC-mallin mukaisissa sovelluksissa törmätään usein tilanteeseen, jossa sovelluslogiikan on kerrottava käyttöliittymälle jonkin sovellusolion tilan muutoksesta, jotta käyttöliittymä näyttäisi koko ajan ajantasaista tietoa Tästä muodostuu ikävä riippuvuus sovelluslogiikasta käyttöliittymään Kuvitellaan, että sovelluslogiikka ilmoittaa muuttuneesta tilasta kutsumalla jonkin käyttöliittymän luokan toteuttamaa metodia update() Parametrina voidaan esim. kertoa muuttunut tieto Riippuvuus saadaan eliminoitua observer-suunnittelumallilla Ks https://wiki.helsinki.fi/display/ohtu2012/luento9 Observer

Riippuvuuksien eliminointi observer-suunnittelumallilla Määritellään rajapinta, joka sisältää käyttöliittymäluokan päivitysmetodin update(), jota sovellusluokka kutsuu Alla rajapinnalle on annettu nimeksi Observer Käyttöliittymäluokka toteuttaa rajapinnan, eli käytännössä toteuttaa update()-metodin haluamallaan tavalla Sovellusluokalle riittää nyt tuntea ainoastaan rajapinta, jonka metodia update() se tarvittaessa kutsuu Nyt kaikki menee siististi, sovelluslogiikasta ei enää ole riippuvuutta käyttöliittymään ja silti sovelluslogiikka voi kutsua käyttöliittymän metodia Sovellusluokka tuntee siis vain rajapinnan, joka on määritelty sovelluslogiikkapakkauksessa

Kyseessä on observer- eli tarkkailijasuunnittelumalli http://sourcemaking.com/design_patterns/observer Jos käyttöliittymäolio haluaa tarkkailla jonkun sovellusolion tilaa, se toteuttaa Observer-rajapinnan ja rekisteröi rajapintansa tarkkailtavalle sovellusoliolle Sovellusoliolla metodi addobserver() Näin sovellusolio tuntee kaikki sitä tarkkailevat rajapinnat Kun joku muuttaa sovellusolion tilaa, kutsuu se sovellusolion metodia notifyobservers(), joka taas kutsuu kaikkien tarkkailijoiden update()- metodeja, joiden parametrina voidaan tarvittaessa välittää muutostieto

Observer-suunnittelumalli class Sovellusluokka{ Interface Observer{ ArrayList<Observer> tarkkailijat; void update(); void addobserver(observer o){ } tarkkailijat.add(o); } } void notifyobservers(){ for ( Observer o : tarkkailijat) o.update(); } /* muu koodi */ GUILuokka implements Observe { } void update(){ /* päivitetään näyttöä */ } /* muu koodi*/