Taso ja pistearvo: | B 240 |
---|---|
Lyhyesti: | Toteutetaan kokonaan itse autoja kuvaava luokka simulaattoriohjelmaan. |
Mitä opitaan: | Kirjoittamaan luokan koodi kokonaan itse, käyttämään toisiin olioihin viittaavia ilmentymämuuttujia, hyödyntämään kokoaja-muuttujaroolia, toteuttamaan aavistuksen aiempaa mutkikkaampia metodeita. |
Toteuttamisen vapaus: | Keskitasoa. Ohjelman rakenteen isot linjat ja ratkaistava ongelma on ennalta määrätty tarkasti, mutta ongelman ratkaisutavan voi ja pitääkin päättää itse. |
Realistisuus: | Työskentelytavan osalta korkea. Tässä pyritään luomaan spesifikaation mukaisesti toimiva luokka, mikä on tyypillinen oikeankin elämän ohjelmointitehtävä. CarSim-ohjelma tosin on vain kurssikäyttöön laadittu "leluesimerkki". |
Haastavuus: | Korkea. Ennen tätä kurssia ohjelmoineille tämä(kin) tehtävä on helppo, mutta aloittelijoille kokonaisen uuden luokan kirjoittaminen tyhjästä ensimmäistä kertaa on varsin haastavaa. |
Työläys: | Korkea. Kirjoitettavan koodin määrä ei sinänsä ole valtava ja rutinoituneempi ohjelmoija suoriutuukin tästä vauhdilla. Kuitenkin aloittelijoiden kannattaa varata pähkäilyyn, kokeiluun ja koodaamiseen runsaasti aikaa. Useimmilla menee tähän tehtävään 3-5 tuntia. |
Autosimulaattoriohjelma CarSim ei ole valmis. Siihen on kyllä tehty GUI (graafinen käyttöliittymä) ja valmiina on
myös luokka Location
autojen ja paikkojen sijaintien kuvaamiseen. Kuitenkin ohjelman ydin eli autoja kuvaava
Car
-luokka on vielä tekemättä.
Tehtävänne on toteuttaa luokka Car
siten, että se toimii annetun Epydoc-dokumentaation mukaisesti.
Palauttakaa tiedosto car.py
Gobliniin.
carsim
tuottaa
aluksi virheilmoituksia. Tämä johtuu siitä, että käyttöliittymä yrittää kutsua
sellaisia Car
-luokan metodeita, joita ei vielä ole olemassa (esim. drive
,
fuel
) koska ette ole vielä tehneet tätä tehtävää. Näistä virheilmoituksista
ei siis tarvitse huolestua.
Car
karkean luonnoksen, jossa alustusmetodi ja
kaikki metodit ovat edes olemassa vaikka eivät vielä mitään fiksua tekisikään.
Tällaisia ns. dummy-metodeita voi kirjoittaa tähän tapaan:
def drive(self, destination): return False # TODO: täydennä tämä myöhemmin def fuel(self, amount): return 0 # TODO: täydennä tämä myöhemmin
Tällainen dummy-metodien käyttö on yleinen ohjelmointikikka ja voi olla kätevä monessa muussakin tehtävässä.
Location
ei pidä muuttaa.
Car
on monimutkaisempi kuin mikään muu luokka, jota
olette tällä kurssilla kirjoittaneet. Mutta ei huolta: isompikin annos saadaan nieltyä
pala kerrallaan (eli inkrementaalisesti, kuten hienosti sanotaan). Suosittelemme
seuraavaa toimintasuunnitelmaa:
Car
ja Location
dokumentaatio.
Luokan Car
kuvaus toimii spesifikaationa sille, mitä teidän pitää tässä tehtävässä saada tehtyä.
Pankaa merkille, että luokassa Location
on metodi kahden pisteen etäisyyden määrittämiseen. Tästä tulee olemaan hyötyä tehtävässä...
Car
ja alkakaa kirjoittaa sitä vähitellen. Miettikää ensin
millaisia ilmentymämuuttujia tarvitaan pitämään auton ominaisuudet ja tila tallessa.
Ainakin sijainti, tankin koko, ... mitä muuta? Kirjatkaa ilmentymämuuttujat koodiin.
get_location
-metodille. Sen pitäisi vain palauttaa auton
senhetkinen sijainti.
car_sim_GUI
.)
Vaikka auto ei vielä osaakaan liikkua mihinkään (koska
drive
-metodia ei ole vielä toteutettu), voitte kuitenkin kokeilla autojen
luomista ja sijoittamista näkyviin käyttöliittymään.
drive
ja testatkaa sitä käyttöliittymän avulla. Alla on hieman lisävinkkejä ajamismetodiin liittyen.
Location
-olio.
Kukin auto siis tarvitsee ilmentymämuuttujan, jonka avulla voidaan viitata auton sijaintiolioon.
Tämä ilmentymämuuttuja toimii tuoreimman säilyttäjänä (most-resent holder): se saa uusia arvoja auton ajaessa ympäriinsä.
Uudet arvot lasketaan aina vanhan sijainnin ja auton liikkeen suunnan ja pituuden perusteella.
Kun auton sijainti muuttuu ajaessa, laskekaa ensin uuden sijainnin koordinaatit, luokaa
sitten uusi sijaintiolio kuvaamaan tätä koordinaattiparia, ja sijoittakaa laittakaa uusi sijaintiolio auton sijainniksi.
(drive
-metodin siis pitää luoda uusia sijaintiolioita aina kun auto vaihtaa paikkaa.)
Location
-luokan metodeita.