Mesta, države...
Zemljevidi
Za domačo nalogo boste napisali tri razrede. Prvi bo Zemljevid,
iz njega bosta izpeljana Drzava in Mesto. Razred
Zemljevid bo predpostavljal, da imajo izpeljani razredi
- atribut
koordinate, ki je slovar s koordinatami. Predpostavljal bo, da so ključi slovarja imena mest (ali trgovin, muzejev, restavracij); kakšne so vrednosti, ga ne zanima; - metodo
razdalja, ki sprejme (polegself) dva argumenta, to je, imeni mest ali trgovin ali muzejev ali česarkoli že in vrne razdaljo med njima.
Razred Zemljevid mora imeti metode, ki vrnejo dolžino poti,
najbližje mesto, n najbližjih mest in najkrajšo pot prek mest na seznamu.
Točneje, razred je videti takole
pass morate nadomestiti s pravimi funkcijami. V razred ne smete
dodajati nobenih novih metod, pa tudi argumentov obstoječih ne smete
spreminjati.
Izpeljana razreda Drzava in Mesto bosta dodala
konstruktor in metodo razdalja. Konstruktor sprejme en argument, ime datoteke.
Datoteki nista enake oblike: datoteka za razred Drzava je enaka
kot v zadnji domači nalogi. Datoteka za razred Mesto ima najprej
ime mesta, nato tabulator in potem koordinato oblike, na primer, C12. Prvi znak
bo vedno črka, preostanek bo neka poljubno dolga številka. Kako razred
Mesto shrani koordinato, je vaša odločitev, pomembno je le, da
njegova funkcija razdalja zna delati s takšnimi koordinatami.
(Namig: ord(c) vrne "zaporedno številko" znaka c).
Poleg tega morata izpeljana razreda definirati funkcijo
razdalja. Razreda se razlikujeta v tem, kako računata razdaljo.
Drzava računa razdaljo tako, kot ste jo računali v prejšnji domači
nalogi. Mesto računa Manhattansko razdaljo: razdalja med C5 in E1
je 6, ker se premaknemo s C na E (to je 2) in iz 5 na 1 (to je 4), in 2 + 4 = 6.
Naloge se loti takole: v razred Zemljevid skopiraj vsebino
funkcij iz prejšnje domače naloge. Uporabiš lahko svojo rešitev ali rešitev,
ki bo (je) objavljena na Učilnici. Podobno lahko tudi za razred
Drzava uporabiš že napisane funkcije. Na novo bo potrebno
sprogramirati le obe metodi razreda Mesto.
V prejšnji domači nalogi ste pisali funkcijo beri_mesta, ki je
prebrala datoteko in vrnila slovar. V tej nalogi to preselite v
konstruktor; ta bo prebral datoteko in shranil rezultat (slovar) v
self.koordinate. Konstruktorji ne vračajo rezultata (vsaj ne v
takšnem smislu, kot "običajne" funkcije in metode.
Metode razreda Zemljevid bodo uporabljale (predvsem) metodo
razdalja, ki jo bodo priskrbeli izpeljani razredi, na podoben
način, kot je na predavanjih metoda pozdravi uporabljala metodo
naziv, ki so jo priskrbeli izpeljani razredi.
Poleg tega bosta Zemljevidovi metodi najblizje in
najblizja uporabljali self.koordinate. Vendar bosta iz
tega slovarja jemali le ključe - imena mest - ne pa tudi koordinat, saj jih
"ne razumeta". Točneje, razreda Drzava in Mesto najbrž
ne bosta shranjevali koordinat na enak način - ali pač, to razreda
Zemljevid ne briga.
Rešitev
Rešitev je tokrat kar dolga, vendar ni bilo veliko programiranja, temveč
samo prirejanje kode iz prejšnje naloge - z izjemo metod v razredu
Mesta, ki pa tudi nista višek programerske znanosti.
Narediti je bilo potrebno tole: razred Zemljevid ste morali
napolniti z istoimenskimi funkcijami iz prejšnje naloge. Metode razreda
Zemljevid predpostavljajo, da objekt (self) vsebuje
atribut koordinate. Zaradi tega metode, za razliko od onih funkcij
izpred enega tedna, nimajo argumenta koordinate, temveč le - tako
kot vedno vse metode - argument self. Do koordinat pridejo prek
njega.
V vseh skopiranih metodah ste torej morali zamenjati koordinate
s self.koordinate. Obenem je bilo potrebno klice funkcij, kot so
razdalja in dolzina_poti zamenjati s klici metod,
torej self.razdalja in self.dolzina_poti. Po novem
te funkcije namreč niso več nekaj, kar "kar tako plava naokrog", temveč so
metode objekta in jih je treba tudi klicati kot metode objekta. Navsezadnje tudi
append vedno kličemo z nek_seznam.append, ne samo z
append(42) (dodaj 42 ... kam?! komu?!)
Metode razreda Zemljevid predpostavljajo, da je konstruktor
poskrbel, da ima objekt atribut koordinate in predpostavljajo, da
obstaja metoda razdalja. To ste morali priskrbeti v izpeljanih
razredih Drzava in Mesto. Lepota objektnega
programiranja je v tem, da konkstruktorja bereta podatke v različnih formatih
in jih tudi shranjujeta v različno sestavljenih slovarjih
koordinate. Kako je sestavljen ta slovar, mora vedeti le funkcija
razdalja.