Most recent comments
Liveblogg nyttårsaften 2017
Tor, 11 months, 2 weeks
Jogging og blogging
Are, 1 year, 11 months
Liveblogg nyttårsaften 2016
Are, 1 year, 11 months
Reading in dark times
Are, 2 years, 1 month
Moldejazz 2016
Camilla, 2 years, 4 months
Dørskilt
Karoline, 2 years, 5 months
Halifax
Tor, 2 years, 5 months
Sony Smartwatch 3 review
Tor, 2 years, 6 months
Numerikk, takk
Tor, 2 years, 6 months
Topp tur
Camilla, 2 years, 8 months
50 book challenge
Camilla, 11 months, 2 weeks
Controls
Register

Objektorientert programmering

Camilla spurte her en dag om det var mulig å fikse det slik at nøkkelord som kun hører til upubliserte artikler ikke vises på listen over alle nøkkelord. Det korte svaret er naturligvis «Ja», og det bittelitt lengre svaret er «Ja, men det vil bli en del stress». Men, vi bestemte oss ikke for å bli forskere fordi vi liker korte svar, så jeg tenkte jeg skulle fleske til med et litt lengre et.

Objektorientert programmering


Objektorientert programmering er, i følge en MiT-forelesning jeg så på iTunesU for noen uker siden, noe man kom opp med som en løsning på den andre software-krisen. Problemet var at store prosjekter skrevet i C og Fortran ble veldig uoversiktlige, og det gjorde det veldig vanskelig for flere personer å jobbe på samme prosjekt samtidig. Derfor fant man opp objektorientering, som går ut på at man konstruerer objeketer som har egenskaper, og som vekselvirker med hverandre ved hjelp av metoder. La meg prøve å forklare:

Sett at man er i ferd med å lage et kalenderprogram. Da vil man typisk opprette et objekt for å representere en avtale. Dette objektet vil ha egenskaper, som for eksempel tidspunkt, sted og varighet. Det er altså rett og slett en måte å lagre data med merkelapper. For spesielt interesserte kan jeg nevne at man i Python kan definere et slikt objekt (eller strengt tatt definerer man en klasse) slik:

class Avtale(object):
  pass


Så kan man opprette et objekt som er en tom instans av klassen:

middag = Avtale()


Og så kan man fylle objektet med data:

middag.tid = datetime(2010, 11, 15, 16, 00)
middag.varighet = timedelta(hours = 1)
middag.sted = 'Hangaren'


(I praksis vil man gjøre en del ting litt annerledes, men det jeg har beskrevet her er fullt mulig å gjøre. Bare fyr opp python og prøv selv. Datetime og timedelta finnes i datetime-modulen, og gjør det du tror de gjør)

Videre kan man definere metoder. Et eksempel kan være en metode som forteller hvor lang tid det er igjen til en avtale. Det som er poenget da, er at hvis man har en annen bit av programmet, som ønsker å lage en liste over kommende avtaler, trenger ikke denne biten å kjenne detaljene omkring hvordan data er lagret internt i Avtale-objektet, det holder at man vet at det finnes en metode som for eksempel heter tid_til, som forteller hvor lang tid det er til avtalen begynner. Dermed kan forskjellige programmerere jobbe på ulike deler av programmet, uten at de trenger å vite i detalj hva de andre driver med.

Igjen, for spesielt interesserte, slik kan man definere metoder i Python:

class Avtale(object):
  pass
  
  def tid_til(self):
    return self.tid - datetime.now()


(datetime.now() returnerer tiden akkurat nå.)

Såh. Det var en kort introduksjon til objektorientert programmering. Merk at jeg har gjort veldig lite av denslags i forhold til for eksempel Are, som sikkert sysler med slikt til daglig. Forskjellen på oss er naturligvis at Are jobber på slike store prosjekter som var hele grunnen til at man fant opp objektorientering, mens jeg sysler med et program som skal leses av meg og en eller to til, og som skal gjøre nøyaktig én ting, nemlig knuse masse tall så fort som mulig. Are kunne derfor sikkert forklart dette bedre og i mer detalj (hint, hint).

Hva har dette med Calcuttagutta å gjøre?


Calcuttagutta er essensielt skrevet i Python, og er objektorientert som bare det. Alt du ser rundt deg når du besøker denne siden er objekter. For eksempel, en artikkel er et objekt, som blant annet har egenskapene tittel, tekst, språk, forfatter, dato den ble postet, et felt som sier om den er synlig eller ikke, et felt som sier om man tillater kommentarer eller ikke, ogsåvidere.

Et annet eksempel på et objekt er et nøkkelord. Et nøkkelord er et veldig enkelt objekt. Det har et navn, som rett og slett er nøkkelordet selv, det har ett eller flere språk, og det har en størrelse, som er antallet artikler som er merket med dette nøkkelordet. Også har det også en eller flere artikler, via et felt som i django kalles ManyToManyField. Et ManyToManyField er en egenskap som inneholder pekere til et eller flere (eller ingen) andre objekter, i dette tilfellet artikler. Vi sier at et nøkkelord er knyttet til en eller flere artikler.

(For spesielt interesserte kan jeg nevne at nøkkelord også har en metode, som heter get_size(). Denne sjekker databasen, og returnerer antallet artikler nøkkelordet er knyttet til. Hver gang et nøkkelord blir lagt til eller fjernet kalles denne metoden for å oppdatere størrelsen på nøkkelordet.)

Poenget


Og da har vi endelig kommet til poenget, som var at jeg skulle forklare hvorfor det ikke er trivielt å kun vise nøkkelord som tilhører publiserte artikler i oversikten over alle nøkkelord. Det som skjer når man laster denne siden, er at man kaller en funksjon som henter ut alle nøkkelord fra databasen. Hvis man er logget inn henter man kun frem de nøkkelordene som tilhører de språkene brukeren har valgt i profilen. Dette er enkelt å gjøre, siden nøkkelordene har en egenskap som heter språk.

Å filtrere på upubliserte artikler er derimot ikke fullt så enkelt. Problemet er at hvert enkelt nøkkelord har ikke en egenskap som forteller om det tilhører en publisert artikkel eller ikke, nøkkelordet vet bare hvilke artikler det tilhører. Det man naturligvis kan gjøre er å hente alle nøkkelordene, for så å ta dem for seg ett etter ett, og sjekke om det er knyttet til minst én publisert artikkel. Problemet med dette er at det øker antall databasespørringer for å laste nøkkelordsiden fra 41 til 2146, og siden tar mange, mange ganger så lang tid for å laste.

En mulig løsning på problemet kan være å legge til et felt i nøkkelordobjektet som forteller om nøkkelordet tilhører en publisert artikkel eller ikke, og så oppdatere denne informasjonen hver gang man legger til eller fjerner et nøkkelord, eller publiserer eller av-publiserer en artikkel. Og det er forsåvidt ikke noe stort problem å fikse dette, men det krever litt tid og planlegging.

Såh. Det var det lange svaret på hvorfor det ikke er fullt så trivielt som det kanskje høres ut å filtrere upubliserte nøkkelord.

-Tor Nordam
Matteus, Are likes this
Category
Technology
Tags
calcuttagutta
utvikling
django
python
programmering
nøkkelord
objektorientering
Views
2632
Google hits
3
Last google search
objektorientert programmering artikkel