Ratkaistu: / tehtävää

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 loogisesti pieniin ja yksinkertaisiin tehtäviin, 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ä:

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ää:
  1. Suunnittelu aloitetaan ohjelman toiminnan ja tehtävien määrittelyllä alkaen sen päätarkoituksesta
  2. Toimintoja tarkennetaan asteittain yhä pienemmiksi osakokonaisuuksiksi
  3. Etsitään toiminnoista yhteisiä asioita, jotka kannattaisi siis toteuttaa yleiskäyttöisinä funktiona
  4. Monimutkaisempien funktioiden tarkentamista voidaan jatkaa niin alhaiselle tasolle kuin tarpeen
  5. Lopulta tehtävät on jaettu niin, että näistä voidaan tehdä itsenäisesti toimivia funktioita
  6. 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ä.
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:
Okei, nyt päästoon jo hyvään alkuun. Miettitään siis tarkemmin mistä osista ohjelma koostuu.
Jatketaan prosessia menemällä alemmalle abstraktiotasolle eli tarkennetaan seuraavaksi mitä toimintoja yksittäiset osat sisältävät:
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.
Tässä vaiheessa huomaamme, että meidän pitää toistaa samaa toimintoa, kunnes kaikki hinnat on syötetty. Täydennetäänpä hieman suunnitelmaa:
Vaikka suunnitelmamme onkin tarkentunut, voidaan siihen lisätä vielä detaljeja:
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.
?