tehdä ohjelmointiharkka Kuinka vauhdilla? Harjoitustyön tekeminen esittelyluento, kevät 1999 eli Miten harkasta saa helposti Turun yliopiston tietojenkäsittelyoppi ymmärrettävän? http://www.cs.utu./ http://www.cs.utu./sta/hat/eiel-0/ Harri Hakonen Harri Hakonen hat@cs.utu. hat@cs.utu.
nro 0. Tehtävä Tilienhallintaohjelma kassalla työskentelevälle Toteuta tilienhallintaohjelma. pankkitoimihenkilölle on voitava käsitellä tilejä monipuolisesti: Systeemin avaus, lopetus, otto, pano ja saldon kysely. tilin systeemistä valikko-ohjattu niin, että voit Tee toteutuksesi eri toimintoja helposti. Käytä testata apuna tekstitiedostoja tietojen tarvittaessa (raskaan käsisyötön välttämiseksi). lukemiseen ratkaisusi kokonaisrakenne huolellisesti, koska Mieti on tärkein osa työtäsi. Mieti luokkien eri se tärkeyttä kokonaisuuden kannalta, operaatioiden luokalle paras toteutusvaihtoehto ja valitse tilienhallintaohjelma Esimerkkiongelma: peukalosääntöjä Yleisiä Hyväksi havaittuja periaatteita Minä? Mieti kahdesti yhtä asiaa. 1. Erityisesti OO:ssa huonosti suunniteltu osa räjähtää omille silmille. Ongelma? Älä ahmi vaan paloittele. 2. Ajattelun atraimilla ongelma suupaloiksi. Maksaja? Ajattele kohdeyleisöäsi. 3. Ohjelmointi on kommunikointia tietokoneelle ja ihmiselle. Tietokone perustaa muotoseikkoihin, ihminen taas tarkoitukseen. perustele valintasi. joilla liftata ilmaiseksi!
peruskäsitteitä ja piirrellään mietitään Vältetään niitä yksityiskohtia! kuvia. kaavioita tekokin on ratkaistava ongelma Harkan panic!" "Dont Ongelman ratkaiseminen alkaa jääkaapilla ACCOUNTS Asiakaskaavio käynnillä! Sitten istutaan lepotuoliin ROOT_BANK ACCOUNT suttupaperikasan ja kynän kanssa. Kehitellään yleistettyjä esimerkkejä, BANK_MENU Harkan asia sisältö Tietorakennekaavio... ACCOUNTS 1. Ongelman kuvaus accounts 2. Ratkaisun ajatukset ja rajoitukset ROOT_BANK ACCOUNT accounts id "123-4567" menu BANK_MENU balance 10378.50 3. Kaavioita ja tapausesimerkkejä account 4. Aliosien liittymät ja erityishuomautukset 5. Testijärjestely eli toimintaesimerkkejä 6. Yksityiskohdat joten pilkotaan se osiin!
Sisällys Ongelman ja ratkaisun kuvaus 1. Kun jotain on hahmoteltu, mietitään koko oletusten, rajoitusten ja jos-kokeilua löytämiseksi. laajennussuuntien Huilataan ja täydennetään jääkaappia tekokin on ratkaistava ongelma Harkan Harkan sisälmyslista 1.1. Tehtävän kuvaus "Dont panic!", osa II 1.2. Ratkaisun ideat 1.3. Systeemin rajoitukset 1.4. Laajennuksia juttu alusta lähtien toisen kerran. Käydään juttelemassa kavereille ja/tai työn 2. Kaaviot 2.1. Asiakaskaavio ohjaajalle. Haetaan keskeisiä käsitteitä ja niiden 2.2. Tietorakennekaavio 3. Luokkien esittely 3.1. ACCOUNT-luokka yhteyksiä. Maailmankuva muuttuu oikeaan 3.2. ACCOUNTS-luokka suuntaan kun kuuluu loksahtelua. Tehdään absurdeja esimerkkejä ja mitä 3.3. BANK_MENU-luokka 3.4. Testausluokka ROOT_BANK 4. Testiajot 5. Liite: Ohjelmalistaukset 5.1. ACCOUNT.E 5.2. ACCOUNTS.E 5.3. BANK_MENU.E 5.4. ROOT_BANK.E tulevaa ponnistusta varten. 5.5. ACE.ROOT_BANK joten pilkotaan se osiin!
otsikko, otsikkokommentti sekä merkitys: ja loppuehdot (lisäksi alku- vaan mietitään miksi ja missä vasaraa, pieleen. menee Jo olemassaoleva ei ole pyhää, joskus on heittää kaikki tehty roskiin uskallettava aliosien riippumattomuus maksimoidaan niiden tietovirtasidokset. minimoimalla keinoina ovat: parametrit, Tiedonsiirron attribuutit. paluuarvot, Yritetään olla ytimekkäitä perustelemaan. selviä. ja Kerrataan jo tehtyä ja hiotaan sitä (eli on kytkentärajapinta Liityntä tekokin on ratkaistava ongelma Harkan panic!", osa III "Dont Kerrataan liittymiin liittyvien osien Liitynnöistä Tiedon on liikuttava luontevasti. Ts. luokkainvariantit). Mennään koneelle ja kirjoitetaan aliosien valmiiksi. Ajettavaa koodia ei liittymät tehdä! Keskeinen kysymys on Kenen vastuulla pitää olla ja miksi?. Tätä pitää tämän Käytetään opittuja käsitteitä ja luodaan Ollaan pikkutarkkoja ja nipotetaan uusia. hokea jatkuvasti liityntöjä suunniteltaessa. I/O nakertaa aina ylläpidettävyyttä, joten yksityiskohdista. Jos jossain alkaa tökkiä, ei haeta isompaa se hätistetään pois toimivasta osasta. Kaikki tehdyt ratkaisut on pystyttävä iteroidaan). Pidetään taukoja ja nukutaan öisin. (onneksi tosi harvoin). kuten Lego-palikoissakin. joten pilkotaan se osiin!
class ACCOUNT creation{any} make... ACCOUNT-liityntä... ACCOUNT-liityntä... ACCOUNT-luokka Päivitykset Alustaminen feature{none} deposit(amount: REAL) -- Lisää `amount saldoon. make(new_id: STRING) -- Alusta tunnisteeksi `new_id. sane_amount: 0.0 <= amount id_exists: new_id /= Void deposit_denition: balance = old balance + amount id_set: equal(id, new_id) no_money: balance = 0.0 withdraw(amount: REAL) -- Vähennä `amount saldosta. Perustiedot sane_amount: 0.0 <= amount id: STRING -- Tunniste. withdraw_denition: balance: REAL balance = old balance - amount -- Saldo markkoina.
end -- ACCOUNT class ACCOUNTS creation{any} make ACCOUNTS-liityntä...... ACCOUNT-liityntä Muunnokset ACCOUNTS-luokka to_string: STRING Alustaminen -- Merkkijonoarvo. string_value_denition: make -- Alusta kokoelma tyhjäksi. -- Result = -- "<account><id>id</id> -- <balance>balance</balance> -- </account>" Muunnokset to_string: STRING Sisäisestä toteutuksesta -- Merkkijonoarvo. feature{none} Tätä ei ole vielä tehty. string_value_denition: -- Result = Objektin eheys invariant -- "<accounts>account 1...account N -- </accounts>" id_exists: id /= Void
... ACCOUNTS-liityntä...... ACCOUNTS-liityntä... Perustiedot Tilatiedot has(account_id: STRING): BOOLEAN -- Onko tili `account_id kokoelmassa? symbols: STRING is "1234567890-" key_exists: account_id /= Void -- Tilisymbolit. has_denition: is_id(id: STRING): BOOLEAN -- Result = tili `account_id on -- Onko `id tilitunniste? -- kokoelmassa. id_exists: id /= Void item(account_id: STRING): ACCOUNT id_denition: -- Tili `account_id. -- Result implies key_exists: account_id /= Void -- `id on muotoa "s 1 s 2...s m -s 1 s 2...s n " valid_key: has(account_id) -- missä s i on jokin symboli -- `symbols:sta ja 1 < m, n. account_found: has(result.id) and equal(account_id, Result.id)
end -- ACCOUNT... ACCOUNTS-liityntä... ACCOUNTS-liityntä... Päivitykset put(account: ACCOUNT) -- Lisää `account. Sisäisestä toteutuksesta account_exists: account /= Void feature{none} Tätä ei ole vielä tehty. legal_id: is_id(account.id) not_in_yet: not has(account.id) Objektin eheys invariant account_inserted: has(account.id)??? symbols_exists: symbols /= Void accounts_exists: accounts /= Void account_inserted: item(account.id) = account -- accounts_sane: aina is_id((accounts @ i).id) prune(account_id: STRING) -- accounts_unique: (accounts @ i).id -- Poista tili `account_id. -- yksikäsitteinen key_exists: account_id /= Void is_in: has(account_id) account_pruned: not has(account_id)
valid_choice: legal_last_choice: Tarkoituksenmukaisin käyttö riippuu Yleensä voidaan tehdä erillään muusta (kunhan osaa jakaa vastuut järjestelmästä... käsittelystä Tiedoston tekemisestä Valikon Menun toteuttaminen interact -- Kysy ja suorita menuvalinnat. choice_keys: STRING is "PpOoSsTtZz" Tiedostojen käytöstä -- Menuvalinnat. is_nished: BOOLEAN -- Poistutaanko menusta? last_choice: CHARACTER -- Nykyinen menuvalinta. tapauksesta. Kyse on vastuun jakamisen järjestämisestä. read_choice -- Pyydä menuvalinta. choice_keys.has(last_choice) do_choice -- Suorita valittu operaatio. oikein). choice_keys.has(last_choice) display_choices -- Näytä ja selitä eri toiminnot. Yksi menyy, kiitos...
löytää mielenkiintoisia Miten esimerkkejä? räiskiä vauhkona haulikolla sinne kannata vaan parempi on hakea täsmäaseeksi tänne ja tehdä vain tähdättyjä lyöntejä. vasara sekä työn tekijä, ulkopuolinen Näin että täi pääsevät vähemmillä tarkkailija vammoilla. henkisillä Tee ensin testijärjestelyn käsikirjoitus. Mieti, millainen testaustapa soveltuu testata mahdollisimman paljon Kuinka vähällä kokeilemisella? mahdollisimman Invariantit: (tyhjä ja 1-kokoinen erikoistapaukset ääriarvot (min. ja max.)). rakenne, Alku- ja loppuehdot: yhdelmät, tiedon perustapausten Ajon simulointi: on vaikeaa... Testaus on vaikeaa... Testaus Testiajoista Kuinka vakuuttaa lukija toimivuudesta? Testaaminen on tapausanalyysiä Kuinka demonstroida erikoistapauksia? Motto: tukkimiehen täin tappamiseksi ei testata yhtä asiaa kuin kerran! Ei Automaattinen, piilossa oleva, tarkastaminen on aina toivottava. yksittäiset kulkeutuminen oikein. Eksplisiittinen, silmin tehtävä, mihinkäkin kohtaan. Testijärjestely voi koostua useista tarkastaminen on työlästä ja virhealtista. kohtauksista. Tue lukijaa väliselostuksilla. taskulaskin, välitulostukset,....
jotka talletetaan oletustiedostoon. tiliä, yhteydessä testataan myös Tässä tiedostoksi Empty.dat (tämän talletetaan lataaminen tyhjentää tiedoston joten erillistä poista kaikki tilikokoelman, ei tarvita). tilit-toimintoa Jatketaan oletustiedoston latauksella ja listauksella. Tileistä valitaan yksi tilien jolloin saadaan tilin muutettavaksi, (BANK_MENU). Tehdään ylläpitomenu tilinkäsittelytemppu ja palataan muutama (ROOT_BANK). ohjelmamenuun Lopuksi näytetään tilitiedot ja kokoelma Empty.dat-tiedoston tyhjennetään testauksen käsikirjoitus testaus Tilienhallintaohjelman Luodaan tyhjään tilikokoelmaan kolme tilisymbolien oikeellisuustarkistusta. Tilit poistetaan ja tyhjä tilikokoelma avulla ja poistutaan ohjelmasta.