objektorientert programmering

Artikkelstart

Objektorientert programmering er en form for dataprogrammering der dataprogrammene organiseres i en struktur med klasser og objekter som minner om hvordan vi organiserer virkeligheten rundt oss.

Faktaboks

Uttale
objˈektorientert programmering

Data og metoder som naturlig hører sammen er samlet i enheter, kalt objekter. Ved hjelp av klassedefinisjoner kan man lage nye datatyper med navn tilsvarende de ord og begreper som betegner det man måtte ønske å ha med i dataprogrammet. Skal man for eksempel lage et dataprogram for et bibliotek, vil det være naturlig å lage datatyper som Bok, Låntaker, Bibliotek og så videre.

En klasse definerer en datatype og beskriver innhold og egenskaper til objekter av denne datatypen. Klassens datafelter er lagerenheter for objektets verdier, og klassens metoder beskriver operasjonene som kan gjøres på eller av objektene.

Klassens navn, som også er navnet på datatypen, brukes til å opprette en eller flere objekter, der hvert objekt har sine egne lagerenheter i minnetdatamaskinen. Alle objektene av samme datatype vil da ha de samme datafeltene og metodene som er beskrevet i klassedefinisjonen, men likevel være forskjellige fordi de ulike objektene vil ha forskjellige verdier lagret i sine private datafelt.

Alle klassedefinisjoner kan gjenbrukes i definisjonen av nye datatyper. Denne formen for gjenbruk av kode har ført til at det har blitt opprettet utallige biblioteker og rammeverk, der ferdig programvare kan hentes for så å gjenbrukes i utviklingen av ny programvare.

Historikk

Nordmennene Ole-Johan Dahl (1931–2002) og Kristen Nygaard (1926–2002) var opphavsmennene til objektorientert programmering. I 1960-årene utviklet de det første objektorienterte programmeringsspråket, Simula, og i 1967 ble Simula versjon 1.0 lansert. Språket introduserte en rekke nye begreper som objekter, klasser, arv og polymorfisme. Den nye måten å organisere dataprogrammer på skulle vise seg å revolusjonere programmeringen, og objektorienterte programmeringsspråk har siden tusenårsskiftet vært dominerende på verdensbasis. Foruten å være forgjengeren til språk som Smalltalk, C++, C#, Java og Python, fikk Simulas objektorienterte tankegang også betydning for andre områder innen datateknologien. Objektorienterte databaser og ikke minst grafiske brukergrensesnitt, der komponentene i skjermbildet er representert som objekter, er basert på de samme objektorienterte prinsippene.

Ole-Johan Dahl og Kristen Nygaards utvikling av Simula regnes som den største bragden i norsk IT-historie og har bidratt til å plassere Norge på verdenskartet innenfor IT-forskning. I 2001 mottok de Turing-prisen for sitt arbeid, en pris som kan sidestilles med Nobelpriser innenfor andre fagområder.

Ideen bak

Ideen bak Simula var å designe et språk som var egnet til å simulere virkeligheten, derav navnet Simula. Tanken var å samle data som logisk hørte sammen i navngitte enheter (objekter), sammen med tilhørende metoder som bruker dem på en kontrollert måte. På samme måte som mennesker oppfatter virkeligheten i form av navngitte objekter (hus, bil, bok og så videre) og klassifiserer navn og begreper i begrepshierarkier, gjorde Simula det mulig å representere ting og fenomener fra den virkelige verden på tilsvarende måte i dataprogrammet. Tanken var også å øke sikkerheten ved å gjøre programmene mer robuste, lettere å vedlikeholde og, ikke minst, lettere å videreutvikle.

Gjenbruk av kode

Et viktig prinsipp i objektorientert programmering er gjenbruk av kode. Når en datatype først er definert i form av en klassedefinisjon, kan den gjenbrukes i nye dataprogrammer. Dette har ført til utviklingen av utallige rammeverk og biblioteker som inneholder ferdig programvare som programmerere kan gjenbruke og bygge videre på. Programmereren trenger imidlertid ikke kjenne til hvordan programvaren er bygget opp, vedkommende trenger kun å vite hva den gjør og hvordan den skal brukes.

Klasser og objekter

Definisjon av datatypen Bok i programmeringsspråket Java
.
Lisens: CC BY SA 3.0

Opprettelse av tre objekter av typen Bok i programmeringsspråket Java.

.
Lisens: CC BY SA 3.0

Når en verdi skal lagres i datamaskinen, trengs det informasjon om verdiens datatype, slik at det riktige antall bytes kan reserveres for verdien. I utgangspunktet finnes det et begrenset antall grunnleggende datatyper, som heltall, desimaltall, tegn og tekst. Objektorienterte språk åpner imidlertid for at programmereren kan lage sine egne, navngitte datatyper. Navnene gjenspeiler gjerne det datatypene skal representere, for eksempel en bok.

En klassedefinisjon definerer en ny datatype. Klassen beskriver hvilke egenskaper objekter av den nye typen har:

  • dataene som er særegne for hvert enkelt objekt
  • operasjonene som kan utføres på eller av objektene

Når en datatype er definert, kan den brukes til å opprette objekter som blir lagret i minnet på datamaskinen.

Aksesskontroll

Når de ulike objektene i et program skal kommunisere med hverandre, er det viktig at objektets integritet bevares, det vil si at dataene som er lagret i objektet ikke blir ødelagt eller forandret på en uønsket måte av andre deler av programmet. Objektets datafelter og metoder tilordnes derfor ulike aksessnivåer som regulerer hvilke deler av objektets kode som skal være tilgjengelig utenfra. Aksessnivåene varierer fra private, som er det strengesteog mest lukkede, til public som er helt åpent. De delene av koden som er private kan kun aksesseres fra objektets egne metoder, mens alt som er public kan brukes av «alle». Mellom disse ytterpunktene finnes aksesstyper som protected og pakke-aksess. Programkodens ulike aksessnivåer definerer objektenes grensesnitt mot resten av programmet. Som en tommelfingerregel bør datafeltene ha private aksess, mens metoder som skal kunne kalles opp fra andre deler av programmet, bør ha public aksess. Ved å la tilgangen til objektets datafelter gå via metoder, kan man forhindre at de tilordnes ugyldige verdier eller endres på en uønsket måte.

Arv og polymorfisme

Eksempel på et begrepshierarki.
.
Lisens: CC BY SA 3.0
Eksempel på bruk av arv: Datatypen Fagbok er avledet fra datatypen Bok i programmeringsspråket Java
Av .
Lisens: CC BY SA 3.0
Eksempel på en datastruktur (her en tabell) som inneholder ulike typer objekter.
.
Lisens: CC BY SA 3.0

I naturen og samfunnet rundt oss klassifiserer vi alt i begrepshierarkier. Vi har felles betegnelser for grupper av ting, som igjen inndeles i underkategorier. Eksempelvis er begrepet Bok en fellesbetegnelse for alle bøker. Gruppen bøker kan så deles inn i underkategorier som Fagbok, Dokumentar, Roman, og så videre. Medlemmene i en underkategori har alle egenskapene til gruppen den er avledet fra, men har i tillegg spesielle egenskaper som kjennetegner underkategorien. For eksempel er alle fagbøker bøker, men ikke alle bøker er fagbøker.

Når vi skal modellere fenomener fra virkeligheten i et dataprogram, er det spesielt nyttig å kunne gjenspeile virkelighetens begrepshierarkier i dataprogrammet. I objektorienterte programmeringsspråk kan vi bygge opp tilsvarende hierarkier ved hjelp av mekanismen arv (inheritance) der vi lager nye datatyper ved å bygge videre på eksisterende, det vil si at vi avleder nye definisjoner av klasser fra eksisterende klassedefinisjoner. Den nye klassen (subklassen) vil da arve alle datafelter og metoder fra klassen den er avledet av (superklassen) og i tillegg få de nye datafeltene og metodene som defineres i subklassen.

Det er ingen begrensning på hvor store slike hierarkier kan være og uansett hvor mange nivåer en subklasse har over seg i hierarkiet, vil den arve alt innhold i superklassen(e), enten disse er opprettet av programmereren selv, eller hentet fra importerte biblioteker og/eller rammeverk. Det å kunne bygge videre på eksisterende programvare for så å utvide og skreddersy den til behovene i dataprogrammet, er noe av forklaringen på den enorme suksessen objektorienterte språk har hatt.

I dataprogrammer lagres gjerne objektene i ulike former for datastrukturer, som tabeller, lister, trestrukturer, grafer og så videre. Ordet polymorfisme, somstammer fra gresk og betegner noe som opptrer i flere former, er i objektorientert programmering knyttet til at vi behandler objektene i en datastruktur som om de var av samme type, til tross for at de er av forskjellig type.

Datatypehåndteringen i objektorienterte språk tillater at vi kan ha ulike typer objekter i en og samme datastruktur, forutsatt at objektenes datatyper er avledet fra samme superklasse. Dermed er det mulighet til å gjennomløpe en datastruktur som inneholder forskjellige typer objekter ved hjelp av en og samme løkkeinstruksjon. Denne styrken ved objektorienterte programmeringsspråk er også noe av forklaringen på deres utbredelse.

Les mer i Store norske leksikon

Kommentarer

Kommentaren din publiseres her. Fagansvarlig eller redaktør svarer når de kan.

Du må være logget inn for å kommentere.

eller registrer deg