40
Ohjelmistotekniikka: Ohjelmistotekniikka: Ohjelmiston Ohjelmiston mallintaminen, osa II mallintaminen, osa II Kevät 2002 Päivi Ovaska LTKK/Tite .

Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Embed Size (px)

DESCRIPTION

Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II. Kevät 2002 Päivi Ovaska LTKK/Tite. Ohjelmointi(ohjelmisto) paradigmoja. proseduraalinen (Pascal, C) ohjelmassa määritellään toiminta - mitä tapahtuu - suoritus etenee sen mukaan tiedot määritellään "erillään" toiminnasta - PowerPoint PPT Presentation

Citation preview

Page 1: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Ohjelmistotekniikka:Ohjelmistotekniikka:Ohjelmiston mallintaminen, Ohjelmiston mallintaminen,

osa IIosa II

Kevät 2002Päivi OvaskaLTKK/Tite

.

Page 2: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Ohjelmointi(ohjelmisto) Ohjelmointi(ohjelmisto) paradigmojaparadigmoja

proseduraalinen (Pascal, C) – ohjelmassa määritellään toiminta - mitä tapahtuu - suoritus etenee sen

mukaan – tiedot määritellään "erillään" toiminnasta

funktionaalinen (Lisp) – ohjelma koostuu kokoelmasta funktioita – Funktiot kutsuvat toisiaan (usein sisäkkäin)

logiikka (Prolog) – ohjelmassa määritellään loogisia relaatioita – jos eläimellä on evät, niin eläin on kala – jos eläin on hauki, niin eläimellä on evät – Onko hauki kala? -> Kyllä!

olioperustainen (Smalltalk, C++, Java) – tiedot ja toiminta liitetään yhteen luokaksi

Kullekin paradigmalle parhaitensopivat mallinnusmenetelmät

Page 3: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Kuinka hahmotamme Kuinka hahmotamme maailmaa oliopohjaisesti?maailmaa oliopohjaisesti?

haluan lähettää kukkia ystävälleni naapurikaupunkiin menen kukkakauppaan pyydän toimittamaan kukat -> pyyntö välitetään naapurikaupungin kukkakauppaan siellä lähetti toimittaa kukat sama oliokäsitteillä:

– lähetän viestin kukkakauppias oliolle – hän hyväksyy ja osaa käsitellä viestin – tehtävä jää hänen vastuulleen – kukkakauppias toteuttaa viestin toimenpiteen (metodin) avulla – toteutus piilotettu minulta

– hän lähettää viestin toiselle kukkakauppiaalle jne.

Page 4: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Olio-pohjainen ajatteluOlio-pohjainen ajattelu olio-pohjainen ohjelmisto muodostuu joukosta keskenään kommunikoivia olioita toiminta syntyy toisille olioille lähetetyistä viesteistä viestin vastaanottanut olio toteuttaa sitä vastaavan toimenpiteen - metodin lähettäjä ei tunne viestin toteutusta (tiedon piilottaminen) "ohjelmoijan ei tarvitse itse tehdä kaikkea - hän voi hyödyntää valmiita komponentteja" vastaanotetun viestin tulkinta vaihtelee, se riippuu vastaanottajasta ja hänen tilastaan toiminta kuvataan vastuina "älä mieti mitä itse osaat tehdä, vaan mitä muut voivat tarjota sinulle" jokainen olio kuuluu johonkin luokkaan luokka määrittelee metodit eli viestin jotka olio osaa käsitellä luokan kaikki oliot käyttävät samoja metodeja luokka määrittelee olion ominaisuudet eli attribuutit - olion tiedot luokat muodostavat luokkahierarkian aliluokka perii yliluokan attribuutit ja metodit aliluokka voi peittää perimiään attribuutteja ja metodeja vaikka oliot vastaanottavat saman viestin ne voivat toimia eri tavoin - tätä kutsutaan

monimuotoisuudeksi

Page 5: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

SA -menetelmäSA -menetelmä

Structured Analysis Menetelmästä useita eri versioita Yleisin käytetty proseduraalinen menetelmä SD (Structured Desing) suunnitteluun (erittäin

vähän käytössä) SA/RT reaaliaikajärjestelmien mallintamiseen

Page 6: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Mallinnusvuo Mallinnusvuo SA/RT-mallinnus

Toteutusmalli

Ympäristömalli

Käyttäytymismalli

Ydinmalli- järjestelmän tavoitteet- liittymäkaavio- tapahtumalista

- tietovuokaaviot, minispeksit- käsitekaaviot- tilakaaviot- tietohakemisto

- toteutuksen rajaaminen- käyttöliittymä- kaavioiden muokkaaminen toteutuskelpoisiksi- ei-toiminnaliset ominaisuudet- toteutukseen liittyvät virhetilanteet

Page 7: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Menetelmän komponentitMenetelmän komponentitLiittymäkaavio

Tapahtumalista 1. tapahtuma 1 2. tapahtuma 2 ...

ER-kaaviot

Hierarkiset tietovuokaaviot

Tilakaaviot

Tietohakemisto tieto_a = tieto_b + tieto_c tieto_x = ...

Minispesifikaatiot if a<b then ....

Page 8: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietovuokaaviossa (DFD) Tietovuokaaviossa (DFD) käytetyt symbolitkäytetyt symbolit

yhtyvättietovirrat

päivitys

luku

kirjoitus

ohjausvirta

jatkuva tietovirta

tietovirta

ohjaus- transfor- maatio

tietovarastoterminaattori

transfor- maatio

tietovarasto

tietovarasto

jakaantuvatietovirta

dialogi

Page 9: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietovuokaavioiden hierarkiaTietovuokaavioiden hierarkia

Ylimmällä tasolla järjetelmän toiminta kuvataan ns. liittymäkaaviolla (context diagram, yhteyskaavio, ympäristökaavio)– terminaattorit ja koko järjestelmä yhtenä transformaationa

Järjestelmätransformaatio kuvataan tarkemmin tason 1 tietovuokaaviolla, sen transformaatiot edelleen tason 2 tietovuokaaviolla, jne.

Pilkkominen alkaavioihin lopetetaan, kun transformaation on niin yksinkertainen, että sen toiminta voidaan kuvata minispesifikaatiolla (pseudokoodi, strukturoitu kulkukaavio, työnkulkukaavio)

Page 10: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

3

Esimerkki

ajanjakso

läm pötilatläm pötila

trigger

rekisteröi läm pötila

ohjaa rekisteröin-

tiä

läm pötila- h istoria

anna läm potilat

läm pötila- anturi

rekisteröinti- tietokone

Page 11: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Hierarkia, liittymäkaavioHierarkia, liittymäkaavio

maksusuoritus

karhu

lasku

toimitustilaus

asiakas

kirjatilaus- järjes- telmä

Page 12: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Hierarkian toinen tasoHierarkian toinen taso

maksusuoritus

karhu

laskutoimitustilaus

tilauksen vastaanotto

1*

toimituksen koonti

2*

toimitettavat tilaukset

asiakas

laskutus

3

laskutus- tiedot

Alimman tasontransformaatiot merkitään tähdellä

Page 13: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Hierarkian kolmatta tasoaHierarkian kolmatta tasoamaksusuoritus

lasku

laskun lähetys

3.2*

laskutus- tiedot

tarkastus

3.1*

karhutar- kastus

3.3*

tarkastettulasku

karhu

Page 14: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Hierarkian alin taso kuvataan Hierarkian alin taso kuvataan minispekseilläminispekseillä

Minispeksi 1: Tilauksen vastaanotto - Tilauksen vastaanotto tapahtuu puhelimitse tai faksilla.- Asiakkaan tiedot tarkastetaan asiakastietokannasta, tarvittaessa asiakastiedot syötetään.- Samalla tarkastetaan asiakkaan laskutustilanne. Jos asiakkaalla on hoitamattomia karhuja, ei tilausta oteta vastaan.

Page 15: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Järjestelmän tavoitteet Järjestelmän tavoitteet

KURREK-järjestelmä sisältää kuvaukset opintojaksoista, opettajista ja opintosuorituksista. Järjestelmä tuottaa kurssien osallistujalistoja, tenttien tuloslistoja ja opintosuoritusrekisteriotteita. Opettajat kirjaavat järjestelmän avulla opintosuoritukset rekisteriin. Opiskelijat pystyvät ilmoittautumaan kursseille ja tutkimaan omia suoritustietojaan.

Page 16: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Liittymäkaavio KURREK-Liittymäkaavio KURREK-järjestelmästäjärjestelmästä

tentti-ilmoittau- tuminen

ov_yhteenveto

opinto-jakso-tiedot

opiskelija-tiedot

kurssi-ilmoit-tautuminen

tulos-lista

osallistuja-lista

suoritus-kysely

suori-tukset

suoritus-kysely

KURREK

opiskelija opettaja

ylläpitäjä

opetta-jatiedot

laitoksen johtaja

Page 17: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

TapahtumalistaTapahtumalista1) Ylläpitäjä päivittää opiskelijan tietoja (lisäys, poisto muutos).2) Ylläpitäjä päivittää opintojakson tietoja.3) Ylläpitäjä päivittää opettajan tietoja.4) Opiskelija ilmoittautuu kurssille.5) Opiskelija ilmoittautuu tenttiin.6) Opiskelija osallistuu tenttiin.7) Opettaja pyytää kurssin osallistujalistan.8) Opettaja pyytää tentin osallistujalistan.9) Opettaja kirjaa opintosuorituksen.10) Opiskelija pyytää opintorekisteriotteen.11) Laitoksen johtaja saa opintoviikkoyhteenvedon.

Page 18: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Organisaation toimintaa Organisaation toimintaa kuvaava tietovuokaaviokuvaava tietovuokaavio

maksusuoritus

karhu

laskutoimitustilaus

tilauksen vastaanotto

1*

toimituksen koonti

2*

toimitettavat tilaukset

asiakas

laskutus

3

laskutus- tiedot

Page 19: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Lämpötilahistoriaa keräävän Lämpötilahistoriaa keräävän reaaliaikajärjestelmän reaaliaikajärjestelmän

tietovuokaaviotietovuokaavio

ajanjakso

lämpötilatlämpötila

trigger

rekisteröi lämpötila

ohjaa rekisteröin-

tiä

lämpötila- historia

anna lämpotilat

lämpötila- anturi

rekisteröinti- tietokone

Page 20: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Esimerkki tietovirtamatriisistaEsimerkki tietovirtamatriisista

opiskelija

luennoija

opintotoi- misto

assistentti

viikkoharjoi- tukset, harj.työ

harjoitustulok- set

kokonaisuori- tukset

ilmoittautumi- set (kurssi,

tentti)tenttipaperi

harjoitustyö, viikkoharjoituk

set, ohjeet

aikataulu, kurssimateri-

aali

aikataulu, kurssimateri-

aali

osallistujalistat (kurssi, tentti)

tuloslistat

Page 21: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietovuokaavio Kurrek-Tietovuokaavio Kurrek-järjestelmästäjärjestelmästä

suoritus- kirjaus

opettaja

opettajat

opiske- lijat

opinto- jaksot

kurssit

suorituk- set

tentit

suoritus-dialogi

Page 22: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Kahvikeitin harjoituksiinKahvikeitin harjoituksiin

aluslevy

boileri

venttiili

start valmis-valo

start-nappula

lämmitin & paineanturi

Page 23: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Ylimmän tason Ylimmän tason tietovirtakaaviotietovirtakaavio

Vaara-alue

Liukuhihna

Maalisäiliö

Operaattori

Käsi

siirrä hihnaa

5

vaara

siirretty

käynnistä

maaliloppu

ohjaus

asema

tilanne

komento

ohjaus = [ seis | siirrä | käsikäyttö |automaatti]] status = [seis | seis&siirtää | käsikäytössä | maalaa | maalaa&siirtää]

ohjaa robottia

1

Käyttöliit- tymä

2

maalaa manuaali-

sesti

3

maalaa automaat-

tisesti

4

maalausreitti

ohjaus

trigger

e/d

e/d

status

valmis

Page 24: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Kahvinkeittiminen Kahvinkeittiminen tapahtumalistatapahtumalista

Start-nappulan painallusvesi loppuukannu poiskannu takaisin (tyhja kannu tai ei-tyhjä

kannu)

Page 25: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Veden mahdolliset tilat Veden mahdolliset tilat tilakaavionatilakaaviona

jäässä nesteenä höyrynä

Page 26: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Lamppua ohjaava tilakoneLamppua ohjaava tilakone

jouten

50W 100W

150W

/ sammuta virta 50W langasta

sammuta virta 100W langasta

veto narusta / sammuta virta 50W langasta

kytke virta 100W lankaan

veto narusta / kytke virta 50W lankaan

veto narusta / sammuta virta 50W langasta

sammuta virta 100W langasta

veto narusta / kytke virta 50W lankaan

Page 27: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tilakoneiden Tilakoneiden käyttömahdollisuuksiakäyttömahdollisuuksia

Toiminnon kuvaaminen esim. algoritmin määrittely

Laitteiden ja prosessien toimnnan kuvaus (digitaalikello, matkapuhelin, pankkiautomaatti)

Järjestelmän elinkaaren mallintamiseenKäyttöliittymien specifioinnissa

Page 28: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tilasiirtymämatriisi: Tilasiirtymämatriisi: merkkijonon muuttaminen merkkijonon muuttaminen

reaaliluvuksireaaliluvuksimerkki on d merkki on "." loppu

merkki ei ole d eikä "."

alkutila

loppu

des.osa

piste

kok.osa

kok.osa----------------------------

s = merkki

loppu----------------------------

status = FAIL

loppu----------------------------

status = FAIL

loppu----------------------------

status = FAIL

kok.osa----------------------------

s = 10*s+merkki

loppu----------------------------

status = FAIL

loppu----------------------------

arvo = sstatus = OK

piste----------------------------

des.osa----------------------------

s = s+merkki/10k=2

loppu----------------------------

status = FAIL

loppu----------------------------

status = FAIL

loppu----------------------------

status = FAIL

des.osa----------------------------s = s + merkki/10**k,

k=k+1

loppu----------------------------

status = FAIL

loppu----------------------------

arvo = sstatus = OK

loppu----------------------------

status = FAIL

alkutila

kok.osa

piste

loppu

merkki on d

muuten

s = merkki

status = FAIL

kok.osa

loppu

ehto toiminnot seur. tila

merkki on d

merkki on "."

loppu

muuten

s = 10*s + merkki

arvo = s, status = OK

status = FAIL

kok.osa

piste

loppu

loppu

merkki on d

muuten

s = s + merkki/10, k= 2

status = FAIL

des.osa

loppu

des.osa

merkki on d

loppu

muuten

s = s + merkki/10**k, k=k+1

arvo = s, status = OK

status = FAIL

des.osa

loppu

loppu

Page 29: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Kirjan elinkaari tilakaavionaKirjan elinkaari tilakaaviona

tilattu hyllyssä lainassa

poistettu kadoksissa korjattavana

lisäyspalautus

lainaus

poisto

Page 30: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Poistuminen editorista Harelin Poistuminen editorista Harelin tilakaaviollatilakaaviolla

Editoi

Exit [tyhjä tai talletettu]

Exit [muutettu ja nimetty]

Save OK do: kysy talletusta

Save OK do: kysy talletusta

File name do: kysy nimeä

Yes

Cancel

Exit [muutettu ja nimetön]

OK

OK [uusi tiedosto]

No

Overwrite OK do: kysy

päällekirjoitusta

Talletus do: talleta puskuri

Cancel

NoCancel

Yes

No

OK [tiedosto olemassa]

Page 31: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tiedon rakenteen ja Tiedon rakenteen ja esitystavan kuvaaminenesitystavan kuvaaminen

Page 32: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietohakemistonotaation Tietohakemistonotaation merkintätavat merkintätavat

merkki merkitys

+ ja() optionaalinen (voi puuttua){} toisto (0-N kertaa)n{}m toisto n-m kertaa[] vaihtoehtoja| vaihtoehtojen erotin@ avainkenttä* kommentti

Page 33: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietohakemisto esimerkkejäTietohakemisto esimerkkejähenkilötiedot = nimi + @henkilötunnus + aviosääty + lapsetnimi = 1{etunimi}3 + sukunimiaviosääty = [naimaton | naimisissa | eronnut | leski]

osoite = (toimitusosoite) + (laskutusosoite)osoite = [toimitusosoite | laskutusosoite |

toimitusosoite + laskutusosoite]osoite = toimitusosoite + (laskutusosoite)

luottoraja = *asiakkaalle myönnettävän luoton enimmäismäärä markkoina*

luottoraja_ilmoitus = *vastaus luottorajan muutosyritykseen*["Tuntematon asiakas" | "Virheellinen luottoraja" | "Uudeksi luottorajaksi on muutettu xxx markkaa"]

Page 34: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Tietohakemisto esimerkkejä Tietohakemisto esimerkkejä suoritustietokanta= * Relaatiokanta, joka kuvaa opiskelijat, kurssit ja suoritukset.

Se koostuu tauluista opiskelijat, suoritukset ja opintojaksot.*opiskelijat = {@op_nro + nimi + osoite + ...}suoritukset = {@suor_nro + op_nro + oj_nro+ pvm +

ov_määrä + arvosana + opettaja}opintojaksot ={@oj_nro+oj_nimi+kuvaus}

op_nro nimi os …… … … …

777 Ahto S. … …222 Teemu T. … …

suor_nro op_nro oj_nro pvm ov_määrä arvosana opettaja… … … … … … …

234 777 81210 20.3.1995 2 3 ijh456 222 81210 22.3.1996 2 5 ijh645 777 81130 24.3.1996 4 3 tensu… … … … … … …

oj_nro oj_nimi kuvaus… … …

81210 otupk …81130 otm …

Page 35: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Muita tiedon rakenteen ja Muita tiedon rakenteen ja esitystavan määrittelytapojaesitystavan määrittelytapoja

Merkkauskielet– HTML– SGML– XML (ja siihen liittyvät standardit: DTD, XML

Schema)

ASN.1: tietoliikenteen sanomarakenteet…

Page 36: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

XML:n dokumenttityypin XML:n dokumenttityypin rakenteen määrittely: DTD rakenteen määrittely: DTD

(Document Type Definition).(Document Type Definition).Tiedon rakenteen kuvaaminen.

<!DOCTYPE postitilaus [   <!ELEMENT postitilaus (vastaanottaja, tavara*)   <!ELEMENT vastaanottaja (nimi, osoite)>   <!ELEMENT tavara (nimeke, määrä, hinta)>   <!ELEMENT nimi (#PCDATA)>   <!ELEMENT osoite (#PCDATA)>   <!ELEMENT nimeke (#PCDATA)>   <!ELEMENT määrä (#PCDATA)>   <!ELEMENT hinta (#PCDATA)>]>

Page 37: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

XML-dokumenttiXML-dokumentti<?xml version="1.0"?>

<postitilaus><vastaanottaja>

<nimi>Ahto Simakuutio</nimi><osoite>Hermiankatu 99, 33720 Tampere</osoite>

</vastaanottaja><tavarat>

<tavara><nimeke>Muistipiiri 256MX</nimeke><maara>2</maara><hinta>100</hinta>

</tavara><tavara>

<nimeke>Nokia 9210</nimeke><maara>1</maara><hinta>6250</hinta>

</tavara></tavarat>

</postitilaus>

Page 38: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

… … ja vastaava XML Schemaja vastaava XML Schema<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">

<xsd:element name="postitilaus" type="tilaus"/>

<xsd:complexType name="tilaus"><xsd:element name="vastaanottaja" type="osoitetiedot"/><xsd:element name="tavarat" type="tavaroidentiedot"/></xsd:complexType> <xsd:complexType name="osoitetiedot"><xsd:element name="nimi" type="xsd:string"/><xsd:element name=“osoite" type="xsd:string"/></xsd:complexType>

<xsd:complexType name="tavaroidentiedot"><xsd:element name="tavara" type="tavaratiedot" maxOccurs=“*"/></xsd:complexType> <xsd:complexType name="tavaratiedot"><xsd:element name=“nimeke" type="xsd:string"/><xsd:element name="maara" type="xsd:positiveInteger"/><xsd:element name="hinta" type="xsd:decimal"/></xsd:complexType>

 </xsd:schema>

Page 39: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

UML (OMT++) vs. SAUML (OMT++) vs. SA

Liittymäkaavio vs. käyttötapauskaavio. Tapahtumalista vs. käyttötapaus vs. operaatio. Tietovuokaavio vs. tapahtumasekvenssikaavioiden

ja luokkakaavioiden käyttö. UML (OMT++) oliopohjaiseen mallintamiseen SA proseduraaliseen mallintamiseen sekä

reaaliaikajärjestelmien mallintamiseen

Page 40: Ohjelmistotekniikka: Ohjelmiston mallintaminen, osa II

Millä piirrät?Millä piirrät? Jos et osaa paperilla ja kynällä ei välineestä ole apua. CASE-välineet (Rational Rose, Prosa, Rhapsody…)

– Hinta verraten korkea (10-50kmk).– Perustuvat tietokantaan, johon talletetaan kaikki malliin liittyvät tiedot, kaaviot ovat

vain “näkymiä” tietokantaan.– “Ymmärtävät” kaavioiden semantiikkaa ainakin jossain määrin.– Reverse Engineering+Forward Engineering = Round Trip Engineering.– Tukevat dokumentointia (esim. Soda+Rose).– Demot ja pienet ohjelmaesimerkit antavat usein liian ruusuisen kuvan.– Raskaan sarjan käyttökokemuksia ei ole julkaistu (?).– Oppimiskynnys korkeahko.

Piirto-ohjelmat (Visio, ABCFlowcharter)– Hinta muutama KMK.– Ainakin Visiossa melko hyvä UML-tuki, lähestyy CASE-välineen ominaisuuksia.– Hyvä valinta, jos ei tarvitse CASE-välineen tietokannan tuomia lisäetuja.

Julkisohjelmiakin löytyy verkosta.