Ohjelmiston suunnittelu



Samankaltaiset tiedostot
Ohjelmistotuotanto, s

Ohjelmistotuotanto, s2001 2/10/2003

Ohjelmistojen mallintaminen Ohjelmistoarkkitehtuuri Harri Laine 1

Suunnitteluvaihe prosessissa

Ohjelmistojen suunnittelu

OSAII: Käytännön rutiinit. Ohjelmiston suunnittelu

Ohjelmistojen mallintaminen Tietovuokaaviot Harri Laine 1

Tietojärjestelmän osat

Copyright by Haikala. Ohjelmistotuotannon osa-alueet

Kontrollipolkujen määrä

Testaus käsite. Sekalaista testausasiaa. Testauksen käsitteestä. Kattavuusmitat. Jos ajatellaan, että testaus = V&V, voidaan erottaa:

Lähestymistavat - toiminnallinen

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

Ohjelmiston toteutussuunnitelma

Ohjelmistotuotanto, s

Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi

Tietokanta (database)

13/20: Kierrätys kannattaa koodaamisessakin

Ohjelmistotuotanto vs. muut insinööritieteet. (Usein näennäinen) luotettavuus ja edullisuus

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

Uudelleenkäytön jako kahteen

Ohjelmoinnin perusteet Y Python

Työn ositusmalleista. Luennon tavoitteista. Motivointia. Walker Royce, Software Project Management, A Unified Framework

Ohjelmistojen mallinnus, s2008 HY/TKTL, 28/10/2008. Harri Laine 1. Ohjelmisto

Ohjelmistojen mallinnus (OMa) - Johdatus ohjelmistotuotantoon Harri Laine 1

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

HELIA 1 (8) Outi Virkki Tietokantasuunnittelu

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Järjestelmäarkkitehtuuri (TK081702) Hajautettu tietokanta. Hajautuksen hyötyjä

Yhteenveto. Menettelytavat

Ohjelmistoarkkitehtuurit

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

2. Ohjelmistotuotantoprosessi

JHS 179 ICT-palvelujen kehittäminen: Kokonaisarkkitehtuurin kehittäminen Liite 2 Arkkitehtuurikehyksen kuvaus

ohjelman arkkitehtuurista.

Ohjelmistotuotanto s

Algoritmit 1. Luento 3 Ti Timo Männikkö

Viestinvälitysarkkitehtuurit Lähtökohta:

Viestinvälitysarkkitehtuurit

Projektityö

6. Arkkitehtuurityylit

1 Johdanto. TTY Ohjelmistotekniikka. Ohjelmistoarkkitehtuurit Syksy 2008

Laadunvarmistustekniikat

Dynaaminen analyysi I

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

Laaja-alainen, opiskelijalähtöinen ja projektiperusteinen opetussuunnitelma, case Monitori

Prosessimalli. 2. Ohjelmistotuotantoprosessi. Prosessimallin vaihejako. Prosessimallien perustehtävät. Ohjelmiston suunnittelu. Vaatimusmäärittely

Toimilohkojen turvallisuus tulevaisuudessa

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto

HELIA 1 (19) Outi Virkki Käyttöliittymät ja ohjelman suunnittelu

Ohjelmistotuotanto, prosessit Syksy Ohjelmistotuotantoprosessi. Prosessimalli. Prosessimallien perustehtävät. Prosessimallin vaihejako

HUSA (Human Understandable System Analysis) Versio 1.1

6. Arkkitehtuurityylit

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

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

Ohjelmistoarkkitehtuurit kevät

1.3 Katsaus ohjelmistotuotannon kehittymiseen

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Simulointi. Tapahtumapohjainen

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

TOIMINNALLINEN MÄÄRITTELY MS

Ohjelmiston testaus ja laatu. Testausmenetelmiä

ITK130 Ohjelmistojen luonne

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

Ohjelmistoarkkitehtuurit

6. Suunnittelu. Suunnittelun tulos

Ohjelmistoarkkitehtuurit Johannes Koskinen. Osittavat arkkitehtuurityylit

Tietokantojen suunnittelu, relaatiokantojen perusteita

Ylläpito. Ylläpito. Ylläpidon lajeja Ohjelmistotuotanto, syksy 1998 Ylläpito

AU Automaatiotekniikka. Toimilohko FB

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

Mitä on periytyminen?

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

812341A Olio-ohjelmointi, I Johdanto

Helsingin yliopisto/tktl Tietokantojen perusteet, s 2006 Tiedon mallinnus ja tietokannat. Harri Laine 1. Tietokanta.

Ohjelmistotuotanto, suunnittelu Syksy Suunnittelu. Suunnittelun tulos. Suunnitteluprosessin työvaiheet. Suunnitteluprosessi.

Mallinnus. 5. Järjestelmämallit. Abstraktiot. Mallinnuksen etuja. Arkkitehtuurimalli. Yhteysmallit. Ohjelmistotuotanto, järjestelmämallit Kevät 2005

JULKISTEN PALVELUJEN ELINKAARI; HYVÄ PALVELU EILEN, TÄNÄÄN, HUOMENNA MIHIN PALVELUT OVAT MENOSSA? Lauri Helenius, Solita Oy

Ohjelmistojen mallintaminen Ohjelmiston suunnittelu Model driven development Harri Laine 1

5. Järjestelmämallit. Mallinnus

Ohjelmistojen mallintaminen, mallintaminen ja UML

Suunnittelun tulos. 6. Suunnittelu. Suunnitteluprosessin työvaiheet. Suunnitteluprosessi. 6.1 Arkkitehtuurisuunnittelu.

Pertti Pennanen DOKUMENTTI 1 (5) EDUPOLI ICTPro

TIETOKANNAN SUUNNITTELU

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Digi-tv vastaanottimella toteutetut interaktiiviset sovellukset

Tietokannan hallintajärjestelmän (DBMS) palvelut ja rakenne

Ohjelmistoarkkitehtuurit, syksy

Tietorakenteet ja algoritmit - syksy

Luku 8 Rakennusvaihe. Detailed Design. Programming. Moduulisuunnittelu. Ohjelmointi

Oliosuunnittelu. Oliosuunnittelu

Ohjelmistojen mallintaminen kertausta Harri Laine 1

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Transkriptio:

Ohjelmiston suunnittelu Sunnittelu: asiakaslähtöisten vaatimusten muuntaminen teknisiä mahdollisuuksia tehokkaasti hyödyntäväksi ratkaisuksi luova prosessi Pääkohteet: ohjelmiston yleisrakenne ja toimintaperiaatteet tietorakenteet algoritmit, toiminnot käyttöliittymä Ohjelmiston suunnittelu - vaiheet Suunnittelun tuloksena on malli tai muu esitys järjestelmästä, joka aiotaan tehdä. Kaksi hallinnollista kokonaisuutta: yleis- ja yksityiskohtainen suunnittelu yleissuunnittelu (product design / system design / preliminary design) järjestelmän kokonaisrakenne yhteiset tietorakenteet jako alijärjestelmiin -> moduuleihin osajärjestelmien ja moduulien välinen kommunikointi Harri Laine 1

Ohjelmiston suunnittelu - vaiheet yksityiskohtainen suunnittelu (detailed design / program design / module design) kunkin moduulin sisäinen rakenne algoritmit kunkin moduulin sisäiset tietorakenteet Suunnitteludokumentti syntyy usein vastaavasti kahdessa vaiheessa: yleissuunnitelma moduulisuunnitelmat Ohjelmiston suunnittelu - vaiheet yleissuunnittelu yksityiskohtainen Tietorakenteet Rakenteet Toiminta Liittymät Harri Laine 2

Ohjelmiston suunnitteluprosessi lähtökohtana vaatimusdokumentti, joka kertoo mitä ominaisuuksia järjestelmällä on oltava miltä järjestelmä näyttää käyttäjän kannalta järjestelmän saamat syötteet järjestelmän tuottamat tulosteet ei-toiminnalliset vaatimukset päämääränä suunnitteludokumentti, joka kertoo miten halutut toiminnot toteutetaan missä muodossa tietoja säilytetään missä muodossa tietoja välitetään miten tietoa muunnetaan Ohjelmiston suunnitteluprosessi suunnitteluvaiheen tulee tuottaa toteutusvaiheelle ohjeet, joiden perusteella järjestelmä on helppo toteuttaa ylläpitää validoida ymmärtää suunnittelu on luova, iteratiivinen prosessi: ei ainoata oikeata suunnitelmaa ei ainoata parasta suunnitelmaa on kuitenkin parempia ja huonompia suunnitelmia Harri Laine 3

Ohjelmiston suunnittelu - osatehtäviä arkkitehtuurin suunnittelu jako komponentteihin, yhteydet komponenttien välillä liittymien suunnittelu (myös käyttöliittymä) komponenttisuunnittelu komponentit jaetaan pienempiin komponentteihin tietorakenteen suunnittelu algoritmisuunnittelu Ohjelmiston arkkitehtuurin suunnittelu M.Shaw, D.Garlan: Software Architecture - Perspectives on an emerging discipline, Prentice-Hall, 1996. Ohjelmisto muodostuu komponenteista, tehtävänä on löytää käyttökelpoiset mieluusti yleiskäyttöiset komponentit ja niiden vuorovaikutus osasysteemit erillisiä toimintokokonaisuuksia voivat olla yhteydessä toisiinsa prosessit sijoittelu laitteille ajoitus yhtenäinen toimintojakso moduulit Harri Laine 4

Ohjelmiston arkkitehtuurin suunnittelu Jakamisella saavutetaan: toiminnallinen itsenäisyys helpompi tehdä, testata ja ylläpitää työnjako ohjelmistoprojektissa järjestelmän toiminnassa käsiteltävyys sopiva tarkkuustaso sopiva laajuus Ohjelmiston arkkitehtuurin suunnittelu Jaon seurauksena kuvattavaa: kutsurakenne, muu yhteistyö käännösyksikkörakenne liittymät Jakamisessa ei ole yksikäsitteistä "parasta" ratkaisua Jako perustuu johonkin näkökulmaan, jonka mukaan tietyt palvelut ja tiedot kuuluvat samaan kokonaisuuteen. Harri Laine 5

Ohjelmiston arkkitehtuurin suunnittelu jakoperustana voi olla: käyttäjä, toiminto / tehtävä, laitteisto, toimipiste, toiminnan kohde jne. jako on yleensä monitasoinen, näkökulma voi vaihdella tasoittain ja olla eri osajärjestelmissä erilainen Arkkitehtuurimalleja Komponenttien välinen vuorovaikutus muodostaa arkkitehtuurin perustan. putket ja suodattimet -malli tietovuolähestymistapa suodattimet toisistaan riippumattomia tiedonmuokkaajia suodattimen osattava tulkita saapuvaa tietovirtaa (jaettu käsitys rakenteesta) suodattimen ei tarvitse tietää keneltä tieto tulee tai minne se menee rinnakkaisuutta tai peräkkäisyyttä esim. unix-putket Harri Laine 6

Arkkitehtuurimalleja oliot ja palvelut malli olio tarjoaa palveluja palvelun pyytäjän tunnettava tarjoaja ja palvelurajapinta (kutsu- tai viestirakenne) tarjoajien ei tarvitse tuntea pyytäjiä (asiakkaita) tieto kätketty olion sisään Arkkitehtuurimalleja tapahtumapohjainen, epäsuoran käsittelyn malli palveluja ei kutsuta suoraan komponentti voi tuottaa tapahtumia (event), joihin toiset komponentit reagoivat tapahtumaan voi reagoida yksi tai useampi komponentti reagoija voi rekisteröityä vastaanottamaan tapahtumia tai tapahtumat hoidetaan yleislähetyksenä ja sille herkistynyt reagoi tapahtuman aiheuttajan ei tarvitse tietää reagoijia, ei välttämättä edes reagoiko joku esim. windows -tapahtumat, tietokantatriggerit Harri Laine 7

Arkkitehtuurimalleja kerrosarkkitehtuuri kukin kerros tarjoaa palveluja seuraavaksi ylemmän tason kerrokselle palvelujen abstraktiotaso kasvaa kerros kerrokselta esim. tietoliikenneprotokollat tason 3 palvelut tason 2 palvelut tason 1 palvelut Arkkitehtuurimalleja jaettuun tietovaraston arkkitehtuuri jaettu tietovarasto erilliset tietovarastoa hyödyntävät komponentit kontorolli ohjelmakomponenteissa (perinteinen tietokanta, työkalu, vaihe) aktiivinen tietovarasto (blackboard) - tietovaraston tila ohjaa ohjelmakomponentteja Harri Laine 8

Arkkitehtuurimalleja tulkkiarkkitehtuuri virtuaalikone ohjauskieli, jota tulkitaan tila ja tilan esitys rinnakkaiset prosessit prosessien välinen kommunikointi pää-/aliohjelma pääohjelmassa kontrollisilmukka aliohjelmissa erikoispalvelut Arkkitehtuurimalleja tilakonearkkitehtuuri tapahtumiin reagoiva tila-automaatti sovellusaluekohtaiset arkkitehtuurimallit - kehykset Kommunikoinnin toteutustapa on arkkitehtuuritason ratkaisu: aliohjelmakutsu viestinvälitys yhteiset tiedostot tai muistialueet Harri Laine 9

Suunnittelu - ositus Suunnittelun ositusperiaatteet kerrostus (layering) pilkkominen (partitioning) Kerrostuksen perustana abstraktiotasot: toiminta-abstraktiot abstrakti kone -ajattelu ylemmän kerroksen palvelut tuotetaan alemman kerroksen palveluiden avulla (vrt. tietoliikenne OSI-malli) kerrokset perustuvat eri käsiteistöihin siirrettävyys saadaan aikaan kirjoittamalla jonkin kerroksen koodi uudelleen Suunnittelu - ositus suljetussa kerrosarkkitehtuurissa vain edellisen tason palvelut ovat käytettävissä parempi ylläpidettävyys avoimessa kerrosarkkitehtuurissa kaikkien alempien tasojen palvelut ovat käytettävissä huonompi ylläpidettävyys parempi joustavuus esimerkki kerrostuksesta: käyttöliittymäkerros looginen toiminta - kerros Harri Laine 10

Suunnittelu - ositus tieto-abstraktiot tietokantojen peruskäsitteitä näkymät - looginen taso - fyysinen taso abstraktit tietotyypit - oliot Pilkkominen = toiminnallinen osiinjako ilmenee puhtaimmillaan top-down suunnittelussa Asteittain tarkentuva suunnittelu 1. Selvitä ongelman olennaiset osat. vaatimusanalyysi älä lykkää epäselvien kohtien tutkimista 2. Hahmota ainakin yksi mahdollinen ratkaisu. mielellään useita ratkaisuja simuloi keskeiset tilanteet valitse yksinkertaisin ratkaisu, ellei ole erityisiä syitä valita toisin 3. Kuvaa järjestelmä hierarkkisesti tarkentaen. ylhäältä alaspäin kuvausmenetelmä sovelluksen mukaan Harri Laine 11

Asteittain tarkentuva suunnittelu 4. Muodosta vastaava rakennekaavio. 5. Kuvaa kunkin tarkennustason oliot. sekä toiminnot että tiedot Tiukka top down -suunnittelu ei aina ole järkevää: aiemman tietämyksen soveltaminen keskittyminen erityisen ongelmallisiin kohtiin Asteittain voi tarkentaa sekä toimintaa että tietoa Esimerkki / toiminta juopottele mene viinakauppaan osta kossu mene porttikongiin juo sammu korkkaa ota 1. ryyppy irvistele loput laula särje pullo Harri Laine 12

Esimerkki / tieto sakkolappu nimi osoite henkilötunnus raha katuosoite postiosoite eurot sentit jako/tarkennushierarkia valokopiokone alustus kopiointi erikoistilanteet virheet... ilmoitukset paperi loppu tukos... Harri Laine 13

ohjelmarakenteita spagettikoodi ohjelma tietorak. ohjelmarakenteita spagettikoodi optimointikikkoja ei datan ja koodinrakennetta primitiiviset ohjelmointikielet Harri Laine 14

ohjelmarakenteita strukturoitu ohjelmarakenteita strukturoitu asteittain tarkennettu tieto ja toiminta rakenteinen ohjelmointi rakenteiset ohjelmointikielet Harri Laine 15

ohjelmarakenteita oliokeskeinen ohjelmarakenteita oliokeskeinen modulaarisuus abstraktit tietotyypit datan ja koodin pakkamminen tiedon piilottaminen, rajapinnat olio-ohjelmointikielet raviolikoodi? Harri Laine 16

eri kriteerejä ominaisuuksia joihin on syytä kiinnittää huomiota: modulaarisuus kiinteys (cohesion) kytkentä (coupling) tiedon kätkeminen (information hiding) ylläpidettävyys (maintainability) Modulaarisuus Ohjelmisto on jaettu erillisiin nimettyihin (usein erikseen käännettäviin) osiin - moduuleihin tietorakenteita yleensä yksityisiä, käyttö operaatioiden kautta voi tarjota myös jaetun tietorakenteen operaatioita julkisia tai yksityisiä liittymä julkiset operaatiot, joita muut moduulit voivat kutsua Harri Laine 17

Modulaarisuus moduulin koko Effort(p+q) > Effort(p) + Effort(q) Moduulien määrän kasvaessa liittymien toteutuskustannukset kasvavat, joten jatkuva pilkkominen pienemmiksi moduuleiksi ei poista kaikkia kustannuksia. Suositeltu moduulikoko noin 30 riviä. kerralla hahmotettavissa Kiinteys (cohesion) (toiminnallinen) moduuli on kiinteä, jos sen kaikki osat palvelevat yhtä ainoaa osatehtävää, ts. moduuli toteuttaa yhden selkeän tehtäväkokonaisuuden moduuli ei ole kiinteä,jos se sisältää heikosti toisiinsa liittyviä osia kiinteys parantaa moduulin ylläpidettävyyttä ja lisää mahdollisuuksia uuskäyttöön Harri Laine 18

kiinteyden asteet huonosta hyvään: moduulissa satunnaisesti yhdistettyjä osia moduuliin koottu loogisesti samantyyppisiä tehtäviä (esim. tulostukset) moduuliin koottu samaan aikaan tarvittavia osia moduuliin on koottu kontrollin etenemisjärjestyksessä peräkkäisiä osia moduulin koottu yhteisiä tietorakenteita käyttäviä oliot operaatioita moduulin osat muokkaavat toistensa tuloksia toisen tuote on toisen syöte toimintakokonaisuuteen perustuva yhdistäminen jokainen osa tarpeen moduulin vastuulla olevan toimintakokonaisuuden kannalta Kytkentä (coupling) kuvaa vuorovaikutuksia eri moduulien välillä löyhästi kytkettyjä moduuleja on helpompi ylläpitää, koska muutokset eivät vaikuta muihin moduuleihin kiinteästi kytketyillä voimakkaita riippuvuuksia Harri Laine 19

Kytkentä heikosta vahvaan: ei vuorovaikutusta moduulien välillä käsiteltävän tiedon välittäminen yksittäisinä parametreina käsiteltävän tiedon välittäminen rakenteisina parametreina ohjaustiedon välittäminen parametreina yhteiskäyttöiset ulkoiset laitteet yhteiskäyttöinen tietorakenne sisäisten rakenteiden hyväksikäyttö Tiedon kätkeminen (information hiding) moduulia ajatellaan mustana laatikkona vain liittymät näkyvät ulospäin: syötteet tulosteet moduulin sisältämien toimintojen määrittely ulos eivät näy: moduulin sisäiset tietorakenteet toimintojen toteutustapa toteutus, testaus ja ylläpito paikallista suojaus tehostuu Harri Laine 20

Muita jaossa vaikuttavia asioita jakoa ei kannata jatkaa jos liittymän koodi tulee pidemmäksi kuin toiminnan koodi (paitsi yleiskäyttöisten osalta) yhteiskäyttöisten osien eristäminen moduuleiksi lyhentää koodia ja helpottaa ylläpitoa työ ja päätöksenteko kannattaa erottaa eri moduuleihin, muutokset kohdistuvat yleensä vain jompaan kumpaan tässä yhteydessä on kuitenkin pyrittävä välttämään toimivaltarikkomuksia = tilanteita, joissa päätöksen vaikutusalue menee moduulin valvonta-alueen (=alaiset kutsurakenteessa) ulkopuolelle. kannattaa etsiä yleiskäyttöisiä moduuleita Muita jaossa vaikuttavia asioita liittymien pitäisi olla mahdollisimman yksinkertaisia, ei rakenteista tietoa moduulirakenteeseen syvyyttä leveyden kustannuksella moduulin toiminnan tulee olla ennustettavissa - ts sisäinen tila ei saisi vaikuttaa (Black box) moduuleilla pitäisi olla vain yksi sisäänmeno- ja yksi ulostulokohta Harri Laine 21

Moduulihierarkia - Käsitteitä leveys (width): samalla hierarkiatasolla olevien moduuleiden maksimimäärä syvyys (depth): maksi mi pi t uus r ei t i l l e j uur i moduul i st a l eht i moduul i i n si sään haar aut umi nen (f an-i n): moduul i a kut suvi en moduul i en l ukumäär ä ul oshaar aut umi nen (f an-out ): kut sut t avi en moduul ei den l ukumäär ä x f an_o ut (x)=4 l eveys 7 y syvyys 5 f an_i n(y)=3 Harri Laine 22

Moduul i hi er ar ki an suunni t t el u Rel aat i o A uses B on voi massa, mi käl i moduul i l l e A määr i t el t y t eht äv ä vaat i i moduul i n B käy t t ämi st ä. Rel aat i on uses t uot t ama r i i ppuvuusver kko on kehät ön => a ver kko muodost aa moduul t aso 2 i en (puumai sen) hi er ar ki an b d t aso 1 Tavoitteena on kehätön verkko Esim: a uses b, c b uses c, a uses c, s uses t aso c 0 j okai nen t aso koost uu moduul i en osaj oukost a, j oka voi daan toteuttaa, suorittaa ja testata t er aso i kseen 0 t aso inkrementaalisesti: 1 t aso 2 t est ausj är j est ys Harri Laine 23

Kehäkytkennöistä pitäisi päästä eroon esi m j akamal l a kehäl l i sest i r i i ppuvat m osaan A1 A B B1 kehäk yt kent ä A2 B2 Harri Laine 24