Spring til indhold
Academi.dk

Objektorienteret programmering

Indkapsling

Øvet DA↔EN-ordliste 1 øvelse

Indkapsling er at holde et objekts data for sig selv og kun give adgang gennem metoder. Så kan objektet håndhæve sine egne regler. En saldo kan ikke blive negativ, hvis den kun kan ændres gennem en metode, der siger nej.

Forudsætter, at du har set klasser og objekter .

Problemet med åbne felter

Eksempel
class Konto {
constructor(saldo) {
  this.saldo = saldo;
}
}

const konto = new Konto(1000);
konto.saldo = -50000;

console.log(konto.saldo);

Output

Tryk på “Kør koden”.

Der er ingen, der stopper det. Enhver linje kode i hele programmet kan sætte saldoen til hvad som helst. Og når fejlen opdages tre uger senere, er der ingen måde at finde ud af, hvilken linje der gjorde det.

Luk feltet, åbn en dør

Eksempel
class Konto {
#saldo = 0;

constructor(start) {
  this.#saldo = start;
}

get saldo() {
  return this.#saldo;
}

haev(beloeb) {
  if (beloeb <= 0) {
    throw new Error("Beløbet skal være positivt");
  }
  if (beloeb > this.#saldo) {
    throw new Error("Der er ikke dækning");
  }
  this.#saldo = this.#saldo - beloeb;
  return this.#saldo;
}
}

const konto = new Konto(1000);
console.log(konto.haev(300));
console.log(konto.saldo);

try {
konto.haev(10000);
} catch (fejl) {
console.log("Afvist: " + fejl.message);
}

Output

Tryk på “Kør koden”.

Nu findes der kun én vej ind til saldoen, og den vej indeholder reglerne. Feltet #saldo kan slet ikke ses udefra. Prøver du, er det en syntaksfejl.

Det er hele idéen: objektet passer på sine egne data.

Gettere og settere

En get ser ud som et felt udefra, men er en metode:

Eksempel
class Rektangel {
#bredde;
#hoejde;

constructor(bredde, hoejde) {
  this.#bredde = bredde;
  this.#hoejde = hoejde;
}

get areal() {
  return this.#bredde * this.#hoejde;
}

set bredde(vaerdi) {
  if (vaerdi <= 0) {
    throw new Error("Bredden skal være positiv");
  }
  this.#bredde = vaerdi;
}
}

const r = new Rektangel(4, 5);
console.log(r.areal);

r.bredde = 10;
console.log(r.areal);

Output

Tryk på “Kør koden”.

Bemærk r.areal, uden parenteser. Det er en beregnet værdi, der altid er opdateret, fordi den regnes ud, når man spørger.

Hvad det giver dig i projektet

  • Reglerne står ét sted. Skal en ny regel ind, ændrer du én metode.
  • Du kan skifte det indre ud. Gemmer du senere saldoen i ører i stedet for kroner, mærker resten af programmet det ikke.
  • Fejl bliver lokale. Bliver saldoen forkert, er der kun én metode at mistænke.

Det sidste er også et rigtig godt svar til den mundtlige eksamen, fordi det kobler indkapsling til noget konkret i jeres eget projekt.

Kort opsamling

  • Privat data, offentlige metoder.
  • #felt er privat i JavaScript.
  • get ser ud som et felt, men er beregnet.
  • Kun sættemetoder, hvor der faktisk er en regel at håndhæve.

Øv dig

Læs videre

Senest gennemgået .