Objekter til alt

Er du klar over alt du kan få til med objekter? Jeg vil demonstrere bruk av objekter som du kanskje ikke har sett før, ved hjelp av god, gammeldags objektorientering.

De siste årene har vi sett en renessanse for funksjonell programmering. Dette er også blitt en inspirasjon for objektorienterte språk. For eksempel vil det i Java 8 komme ny syntaks for lambdauttrykk. Det som kanskje er mindre kjent er at lambdauttrykk også har objektorienterte forløpere. Ved å kombinere lamdauttrykk med objektorientering åpner det seg spennende muligheter!

Programmeringsspraket Smalltalk viser at alt kan bygges med objekter. For å få til dette er det noen sentrale ingredienser vi behøver:

1. Alt er objekter

For det første er absolutt alt man finner i et Smalltalk-program objekter. Hva menes med dette?

2. Alt skjer ved meldinger

2 negated

Den andre typen melding kallen en binær melding. Identifikatoren består av ett eller fler spesialtegn og har alltid et argument. Her er eksempler på likhetstest og addisjon:

a = b.

a + b

Uttrykk skilles med punktum, akkurat som i setninger i naturlig språk. Vi sier for eksempel at vi sender meldingen = til a med argument b.

Den siste typen melding kalles en keyword message. Dette er meldinger som har ett eller flere argumenter med nøkkelord mellom.

Et par eksempler:

dictionary at: 'en' put: 'one'.

transaction amount: 0

Syntaksen kan minne om Objective C. En fordel ved dette er at hvert arguments rolle synliggjøres også ved kall. Her sender vi meldingen at:put: til dictionary med argumenter ’en’ og ’one’.

3. Blokker

For å programmere behøver vi kontrollstrukturer, for eksempel if-else. Hvordan kan vi gå fram for å få til dette med objekter? Vi er nødt til å introdusere en ny type objekt med tilhørende syntaks:

[a + b]

Dersom en evaluerer en kodesnutt som er omkranset av klammeparenteser, kjøres ikke koden, i stedet returneres et objekt som kalles for en blokk. Blokken er et førsteklasses objekt som refererer tilbake til koden. Dette tilsvarer et Java 8 lambda uttrykk.

Programflyt

Nå har vi tilstrekkelig syntaks til å uttrykke en if-else struktur. I Smalltalk uttrykkes dette ved meldingen ifTrue:ifFalse: :

a > b ifTrue: [a] ifFalse: [b]

Det er en keyword melding med to blokk argumenter. Det første argumentet er en blokk som gjelder for true, det andre argumentet en blokk for false.

Polymorfi

Nå behøver vi bare en mekanisme for å bestemme hvilken blokk som brukes. Her kommer et lite triks: I motsetning til det vi er vant til fra andre programmeringsspråk er verdiene true og false instanser av hver sin respektive subklasse i Smalltalk:

 

 

Flyten styres så ved at metoden ifTrue:ifFalse: er polymorf. I klassen True svarer meldingen verdien av å evaluere den første blokka, i False evalueres den andre blokka.

Nå har vi implementert en if-else struktur kun ved bruk av objekter!

Et annet eksempel er logiske meldinger med betinget evaluering. Hvis vi for eksempel ønsker å teste om en verdi er innen et gitt intervall kunne vi implementert det utelukkende med binære meldinger:

(value > min) & (value < max)

Men dersom value < min, behøver vi jo ikke å teste mot max!
Dette kan også løses med en blokk og den polymorfe metoden and: :

value > min and: [value < max]

Dersom mottaker er true, svarer meldingen resultatet av å evaluere blokka. Dersom mottaker er false, svarer den rett og slett seg selv, da svaret nødvendigvis må være false.

Et annen artig polymorf metode i Boolean hierarkiet er meldingen not (tilsvarer ! i Java). Denne løses også trivielt ved at true svarer false, og omvendt.

Nå har vi sett på de aller enkleste eksemplene. Mer avanserte kontrollstrukturer slik som løkker og unntakshåndtering uttrykkes også ved hjelp av meldinger og blokker. Siden byggesteinene er så enkelt tilgjengelig i Smalltalk, finnes det et utall forskjellige forgrenings og løkke varianter. Det er også vanlig å lage sine egne domenespesifikke flyt og iterasjons meldinger. Dette tilfører mer semantisk informasjon, muliggjør gjenbruk og gir bedre sporbarhet i kode. Ved å implementere kontrollstrukturer i vanlig kode, bidrar kildekoden i til å dokumentere språkets oppførsel.

Hva kan vi lære av Smalltalk?

Litt om forfatteren

Martin-Skarsaune

Martin Skarsaune

Martin Skarsaune er systemutvikler i Kantega.
comments powered by Disqus