Objektorientert programmering

**Objektorientert programmering** (**OOP**) er et paradigme for programmering av datamaskiner.

Konseptet stammer fra arbeidet nordmennene Kristen Nygaard og Ole-Johan Dahl gjorde ved Norsk Regnesentral med programmeringsspråket Simula på 1960-tallet, noe de ble belønnet med både Turing-prisen og John von Neumann-medaljen for.

Prinsippene i OOP som de skapte påvirket og ble utbredt senere gjennom en rekke programmeringsspråk. Blant annet Smalltalk fra 1970-årene, C++ fra 1980-årene, Java og Python fra 1990-årene og en rekke nyere programmeringsspråk etter 2000. De fleste av de mest brukte programmeringsspråkene i dag benytter seg av en objektorientert programmeringsmodell.

Følgende prinsipper er sentrale i OOP:
* *Objekter* – pakke data og funksjonalitet sammen i enhetstyper/klasser i programmet. Dette er basis for *modularitet*, en av kvalitetene man prøver å oppnå.
* *Abstraksjon* – gjøre at programmereren underveis kan ignorere noen av detaljene ved implementasjon av det som jobbes med.
* *Innkapsling* – skjule den interne tilstanden til et objekt fra andre. Dette gjør at utenforstående kode ikke kan endre på tilstanden til objektet på uforutsette måter.
* *Polymorfi* – gjøre at et objekt kan oppføre seg som et annet, bare den oppfyller den «kontrakten» grensesnittet spesifiserer.
* *Arv* – lette arbeidet med innkapsling og polymorfi ved å tillate programmereren å lage objekter som er mer spesialiserte utgaver av andre objekter.

## Kobling
Kobling er et mål på hvor sterkt et objekt er knyttet til andre objekter innen objektorientert programmering. Det er ofte et mål at objekter har et begrenset antall avhengigheter. Om mange objekter har lav kopling henger ofte sammen med høy kohesjon, som ofte er ønsket.

## Kohesjon
Kohesjon handler om hvor fokusert ansvar et objekt har i objektorientert programmering. Et mål i objektorientert programmering er ofte høy kohesjon. 

Høy kohesjon vil si høyt fokus og begrenset ansvar, og begrenset ansvar betyr som regel at objektet utfører et begrenset antall oppgaver gjerne innenfor ett funksjonelt område.

Ved å sørge for høy kohesjon bidrar man til å modularisere og gjøre vedlikehold enklere. 

Høy kohesjon korrelerer ofte med lav kopling.

## Fordeler og ulemper
Objektorientert programmering har vært det rådende paradigmet siden 1990-årene, og har både tilhengere og motstandere. Tilhengerne peker ofte på at objekter og hierarkier både passer den virkelige verden godt og er en naturlig måte å tenke på for mennesker. De trekker også fram at de fleste utviklere i dag er kjent med og tildels utdannet i paradigmet, og kan jobbe med kode som er skrevet slik uten ekstra opplæring. Motstanderne peker ofte på virkelige problemstillinger som passer dårlig i en objektmodell samt problemet med å bruke objektorientering i samband med relasjonsdatabaser og at umodne utviklere kan overdrive og dra prinsippene for langt og etterape stil og floskler uten å helt forstå når noe er riktig og feil å bruke og da ende opp med kildekode som er mer komplisert enn nødvendig. Funksjonell programmering trekkes ofte frem som en motsats til OOP selv om noen også ser de to paradigmene som utfyllende til hverandre og at man kan bruke begge deler i samme system/kodebase ‒ noen språk har støtte for begge.

## Se også
* Funksjonell programmering
* Generisk programmering

## Referanser


## Eksterne lenker
* 
* Artikkel om Simula fra Fagbladet Forskningspolitikk