Rakenteellinen ohjelmointi¶
Osaamistavoitteet: Tähän lisämateriaaliin on syytä tutustua ennen kurssin harjoitustyön aloittamista, mutta jo tässä vaiheessa asia on hyvä tiedostaa. Materiaali esittää lyhyesti yhden tavan miten ongelman / tehtävän (jota varten esim. tietokoneohjelma alunalkaen laaditaan) ratkaisua voidaan lähestyä systemaattisemmin (hajoita ja hallitse) kuin lähtemällä suoraan koodaamaan Stetson-Harrison menetelmällä.
Rakenteellisella ja modulaarisella ohjelmoinnilla tarkoitetaan tietokoneohjelman suunnittelu- ja ohjelmointimenetelmää, jossa ratkaistava ongelma (tai laadittava ohjelma) jaetaan pieniin, lyhyisiin ja yksinkertaisiin tehtäväkokonaisuuksiin, jotka toteutetaan aliohjelmina, eli C-kielessä funktioina. Ideana on purkaa tehtävät/ongelmat niin pieniin palasiin, että lopulta päästään ohjelmointikielen yksittäisen lauseen tasolle.
Tällä lähestymistavalla ohjelmistojen tekemisessä saavutetaan mm. seuraavia hyötyjä:
- Ohjelmien kehittäminen on helpompaa, kun monimutkaisten ja/tai laajojen ongelmien käsittely helpottuu kirjastoina, funktioina, koodilohkoina, jne.
- Virheiden jäljittäminen helpottuu, kun niiden havainnointi on helpompaa lyhyistä ohjelmanpätkistä (yksi kerrallaan).
- Koodin uudelleenkäytettävyys paranee. Mahdollisuuksien mukaan funktiot tulisi laatia siten, että niitä voi käyttää myöhemmin uudelleen toisessa yhteydessä. Vaikka jouduttaisiinkin muokkaamaan aikaisemmin laadittua funktiota, on tämä silti nopeampaa kuin uuden funktion kirjoittaminen
Suunnitteluprosessi¶
Kuten täällä reaalimaailmassa yleensä, suunnittelemalla asiat etukäteen säästetään valtavasti aikaa ja vaivaa. Ennen kuin lähdetään kirjoittamaan ensimmäistäkään koodiriviä ohjelmaan, se tulee suunnitella ja paloitella. Ohjelmoinnin ammattilaiset käyttävät tässä mitä monipuolisimpia suunnittelutyökaluja, mutta meille riittää kynä ja paperi.
Käytä ohjelmiesi suunnittelussa seuraavaa menetelmää:
- Suunnittelu aloitetaan ohjelman toiminnan ja tehtävien määrittelyllä alkaen sen päätarkoituksesta
- Toimintoja tarkennetaan asteittain yhä pienemmiksi osakokonaisuuksiksi
- Etsitään toiminnoista yhteisiä asioita, jotka kannattaisi siis toteuttaa yleiskäyttöisinä funktiona
- Monimutkaisempien funktioiden tarkentamista voidaan jatkaa niin alhaiselle tasolle kuin tarpeen
- Lopulta tehtävät on jaettu niin, että näistä voidaan tehdä itsenäisesti toimivia funktioita
- Tuloksena syntyy ohjelman esitys (esim. algoritmi), joka sitten voidaan toteuttaa MILLÄ TAHANSA OHJELMOINTIKIELELLÄ.
Tätä asteittain tarkentavaa suunnittelua kutsutaan Top-Down-menetelmäksi (osittavaksi menetelmäksi), joka nimensä mukaisesti alkaa korkealta abstraktiotasolta ja tarkentuu asteittain matalan tason toiminnoiksi ja tehtäviksi.
Ohjelman suunnittelua ja toteutusta ei tarvitse tehdä kirjaimellisesti annetussa järjestyksessä, elleivät osat ole toisistaan riippuvaisia. Jos ei jokin ongelma heti ratkea, tehdään muita ensin alta pois. Näin ohjelmamme toteutus ei totaalisesti pysähdy yhteen ongelmaan.
Hox! Suunnitelma auttaa myös löytämään työläitä kohtia ohjelmasta etukäteen ja hahmottamaan kokonaistyömäärää.
Esimerkki¶
Muistetaan, että vielä tässä vaiheessa ei kirjoiteta kirjoita riviäkään koodia! Koodaus alkaa tämän suunnitteluvaiheen jälkeen..
Esimerkkitehtävä on seuraava:
Tee kassakoneohjelma, jolla voi laskea ostosten kokonaishinnan, tulostaa takaisin annettavan rahan määrän ja tulostaa kassassa olevan rahan määrän. Lisäksi jokainen kassakirjaus tallennetaan kovalevylle, josta on saatava listaus halutulta päivältä.
Tee kassakoneohjelma, jolla voi laskea ostosten kokonaishinnan, tulostaa takaisin annettavan rahan määrän ja tulostaa kassassa olevan rahan määrän. Lisäksi jokainen kassakirjaus tallennetaan kovalevylle, josta on saatava listaus halutulta päivältä.
Kun alamme suunnittelemaan ohjelmaa, meidän on ensin päätettävä, mitä ohjelmalla tehdään. Toisin sanoen kuinka ohjelma ilmentyy ihmiselle - ohjelman käyttäjälle. Tällä kertaa ohjelmamme on suoriuduttava seuraavista toiminnoista:
- Ohjelmassa on oltava jokin valintapaneeli, josta eri toimintoja voidaan suorittaa
- Ostostapahtuma rahanavihtoineen yms pitää pystyä suorittamaan
- Kassan saldo pitäisi saada näkyville tarvittaessa
- Historialistausta tapahtumista tarvitaan kirjanpitoa varten
Okei, nyt päästoon jo hyvään alkuun. Miettitään siis tarkemmin mistä osista ohjelma koostuu.
- Käyttöliittymä
- Ostostapahtuma
- Kassan saldon tulostus
- Historialistaus
Jatketaan prosessia menemällä alemmalle abstraktiotasolle eli tarkennetaan seuraavaksi mitä toimintoja yksittäiset osat sisältävät:
- Käyttöliittymä
- Tulostetaan näytölle ohjelman käynnistyessä
- Antaa käyttäjän valita toiminnon ja suorittaa sen
- Ostostapahtuma
- Ottaa vastaan asiakkaan ostosten hintoja, kunnes kaikki on syötetty
- Tulostaa ostosten kokonaissumman
- Jää odottamaan asiakkaan antamaa rahasummaa
- Tulostaa vaihtorahan määrän
- Kassan saldon tulostus
- Tulostaa kassassa olevan rahan määrän
- Historialistaus
- Kysyy päivän, jolta listaus halutaan
- Tulostaa halutun päivän tapahtumat
Nyt suunnitelmastamme voidaan jo hahmottaa kuinka ohjelma toimii käyttäjän kannalta. Seuraavaksi meidän on tarkennettava suunnitelmaa lähemmäs ohjelmointimaailmaa.
Valitaan osa-alue kerrallaan ja tarkastelemme, mitä siinä tapahtuu taas alemmala abstraktiotasolla.
- Ostostapahtuma
- Ottaa vastaan asiakkaan ostosten hintoja, kunnes kaikki on syötetty
- Tulosta monitorille: "Syötä hinta:"
- Odota kunnes hinta syötetään
- Laske hinta yhteensä
- Tulosta kokonaishinta kun hintojen syöttäminen loppuu
Tässä vaiheessa huomaamme, että meidän pitää toistaa samaa toimintoa, kunnes kaikki hinnat on syötetty. Täydennetäänpä hieman suunnitelmaa:
- Ostostapahtuma
- Suorita, kunnes viimeinen hinta on syötetty
- Tulosta näytölle "Syötä hinta:"
- Odota kunnes hinta syötetään
- Laske hinta yhteensä
- Tulosta: "Yhteensä: "
- Tulosta: "Annettu raha:"
- Odota kunnes raha syötetään
- Laske takaisin annettava raha
- Tulosta "Takaisin:"
- Palaa käyttöliittymään
Vaikka suunnitelmamme onkin tarkentunut, voidaan siihen lisätä vielä detaljeja:
- Ostostapahtuma
- Kunnes viimeinen hinta on syötetty
- Tulosta monitorille: "Syötä hinta:"
- Odota kunnes hinta syötetään
- Tallenna hinta
- Selvitä päivämäärä
- Avaa tiedosto ppkkvv.txt
- Tulosta hinta tiedoston loppuun
- Sulje tiedosto
- Lisää hinta muuttujaan yhteensä
- Tulosta: "Yhteensä: "
- Tulosta: "Annettu raha:"
- Odota kunnes raha syötetään
- Laske takaisin annettava raha
- Tulosta "Takaisin:"
- Palaa käyttöliittymään
Tarkentamista voidaan jatkaa kunnes saadaan aikaiseksi niin tarkka suunnitelma, että siinä on jo omin sanoin kerrottuna algoritmi osa-alueen toteuttamiseksi pseudo-koodilla!
Kun koko ohjelma on näin abstraktiona kasassa, iso osa ohjelmistoprojektia on jo valmiina ja voidaan lähteä toteuttamaan ohjelmaa valitulla ohjelmointikielellä.
Lopuksi¶
Usein aloittelevat ohjelmoijat aliarvioivat etukäteissuunnittelun merkitystä ja siihen menevää aikaa. On helpompaa vain rynnätä vääntämään koodia ajatuksella, että korjataan ne ongelmat sitten kun niitä ilmenee. Koodista tulee tällöin ihan varmasti sillisalaattia ja spagettikoodia.. Vaikeiden bugien selvittelyssä lopulta edessä on kaksi vaihtoehtoa: lisää spagettia tai uusi aloitus puhtaalta pöydältä. Consider yourself warned.
Käytetään siis oikeasti hyväksi rakenteellista ajattelutapaa ohjelmointitehtävän ratkaisun suunnitteluun ja toteutetaan koodia helposti ymmärrettävinä funktioina. Maksaa vaivan.
Anna palautetta
Kommentteja materiaalista?