19
1 Læringsmål for forelesningen • OO innkapsling vha. tilgangsmetoder • Java fra attributter til tilgangsmetoder • Eclipse generering av tilgangsmetoder

innkapsling

Embed Size (px)

Citation preview

Page 1: innkapsling

1

Læringsmål for forelesningen

• OO– innkapsling vha. tilgangsmetoder

• Java– fra attributter til tilgangsmetoder

• Eclipse– generering av tilgangsmetoder

Page 2: innkapsling

2

Forskjellige typer objekter

• Dataorienterte objekter– primært laget for å lagre sammenhørende dataverdier eller

knytte objekter sammen

• ”Vanlige” objekter– til sammenhørende data hører operasjoner

(også kalt metoder) for å manipulere dataene

• Funksjonsorienterte objekter– brukes utelukkende for evnene til å gjøre noe, f.eks.

behandle data som ligger i andre objekter

data

funksjoner

Page 3: innkapsling

3

Illustrasjon av innkapslingfra (den forrige) boka

object

Methods

Data

Client

Page 4: innkapsling

4

Innkapsling

• Viktig prinsipp i objektorientering– Engelsk: encapsulation– Norsk: innkapsling

• Et objekt skal beskytte og håndtere sin egen informasjon

• Endringer i et objekts tilstand skal bare gjøres via trygge metoder

• Vi bør designe objektene slik at ikke andre objekter kan gå inn og endre tilstanden på en ukontrollert måte

Page 5: innkapsling

5

Innkapsling

• Attributtene til et objekt representerer en kompleks tilstand– hvert attributt kan ha en rekke verdier– attributtene kan endres på ulike måter vha. metodene

• Det finnes regler for hvilke tilstander som er logisk gyldige• Ved å utelukkende å tilby metoder for å endre tilstanden,

kan et objekt lettere beskytte seg mot gal bruk• Eksempel: dato, med år-, måned- og dag-attributter

– det er aldri flere dager i en måned enn 31, dvs. dag <= 31– i tillegg kan hver måned begrense ytterligere, f.eks. har april kun 30 dager– skuddår endrer regelen for februar, den har da 29 dager

• Innkapsling av et objekt, ved å definere et metode-grensesnitt som sikrer riktig bruk, er et sentral poeng innen objektorientering

Page 6: innkapsling

6

Innkapsling

• Poenget er å definere– hva som skal være private egenskaper til et objekt, og

– hva som skal være offentlig kjent av andre

• Skille mellom den private innsiden og den offentlige utsiden til et objekt

• Definere utsiden utelukkende vha. metoder og regler for samhandling

Page 7: innkapsling

7

Synlighetsmodifikatorer

• Såkalt synlighetsmodifikatorer (visibility modifiers) brukes for å spesifisere hva som er privat og hva som er offentlig– private – skjult for andre klasser– public – åpent for alle klasser– <ingenting> - åpent for klasser i samme pakke

• Spesifikke tilgangsmetoder er offentlige og kan brukes for å lese eller endre objektets tilstand (feltene)

Page 8: innkapsling

8

public

• “public visibility”

• Egenskaper (felt og metoder) som er deklarert som public, kan nåes fra kode i andre klasser– også i andre pakker

Page 9: innkapsling

9

private

• “private visibility”

• Egenskaper (felt og metoder) som er deklarert som private kan KUN nåes fra kode i samme klasse

Page 10: innkapsling

10

<ingenting>

• “package visibility”

• Felter og metoder uten spesifikk tilgang kan KUN nåes fra kode i samme pakke

Page 11: innkapsling

11

La oss prøve

• pakke1.Klasse1– private felt1;– felt2;– public felt3;

• pakke1.Klasse2• pakke2.Klasse3

• Hvilke av pakke1.Klasse1 sine felt får pakke1.Klasse2 og pakke2.klasse3 tilgang til?

Page 12: innkapsling

12

Felter hører til innsiden, (utvalgte) metoder hører til utsiden

• Grunnregel for styring av tilgang– felter skal være private

(unntaket er konstanter, deklarert som final static)– get- og set-metoder kan være offentlige

• Generelt prinsipp– så lite som mulig skal være synlig utenfor en klasse– dess mindre som er synlig, dess mer kan endres uten at

annen kode blir påvirket

Page 13: innkapsling

13

Effekten av private og public

Bryter med prinsippet om innkapsling

Håndhever

Innkapsling

Gir funksjonalitet til andre objekter

Interne støttefunksjoner i

klassen

public private

Felter

Metoder

Page 14: innkapsling

14

Felt og tilgangsmetoder

• Set-metoden beskytter mot gal bruk av felt– kan inneholde kode for konvertering og validering av verdien,

f.eks. sjekke om dato er frem i tid, beløp er positivt, navn er gyldig, osv.

• Get- og set-metoder kan gi en illusjon av felt som egentlig ikke finnes

– en get-metode kan beregne verdien sin, fra eksisterende felter

– en set-metode kan tilsvarende endre (deler av) andre felter

• Sett utenifra er det viktigere å vite hvilke tilgangsmetoder et objekt har, enn hvilke felt som faktisk finnes

• Property-begrepet brukes ofte om verdier som kan leses/endres vha. tilgangsmetoder, uavhengig om de tilsvarer faktiske felt eller ikke

Page 15: innkapsling

15

Fra felt til tilgangsmetoder

• Alle felt markeres som private– <type> <feltnavn> blir til– private <type> <feltnavn>

• Relevante, offentlige tilgangsmetoder legges til

– public <type> get<Feltnavn>() {return <feltnavn>;

}// evt. følgende, når <type> er booleanpublic boolean is<Feltnavn>() {

return <feltnavn>;}

– public void set<Feltnavn>(<type> <feltnavn>) {this.<feltnavn> = <feltnavn>;

}

• Merk konvensjonen for bruk av stor bokstav etter ”get” og ”set”-prefiksene

• Reglene er såpass enkle at Eclipse har dem innebygget, inkludert en funksjon for å generere dem

Page 16: innkapsling

16

Fra felt til tilgangsmetoder

• Tabell-felt gir mer kompliserte tilgangsmetoder, siden en ikke kan tillate tilgang til tabell-verdien direkte (hvorfor ikke?)

– <type>[] <flertall> blir til– private <type>[] <flertall>

• Relevante, offentlige tilgangsmetoder legges til, f.eks.:

– public int get<Entall>Count();– public int indexOf<Entall>(<type> <entall>);– public <type> get<Entall>(int i);– public void set<Entall>(int i, <type> <entall>);– public void add<Entall>(<type> <entall>);– public void add/insert<Entall>(int i, <type> <entall>);– public void remove<Entall>(int i);– public void remove<Entall>(<type> <entall>);

• Her finnes det ikke like klare regler som for enkle felt

Page 17: innkapsling

17

Eksempel: Person innkapsler Person[] children

public class Person {

// private feltprivate Person[] children;

// lesemetoderpublic int getChildCount();public int indexOfChild(Person child);public Person getChild(int i);

// endringsmetoderpublic void setChild(int i, Person child);public void addChild(Person child);public void addChild(Person child, int i);public void removeChild(int i);public void removeChild(Person child);

}

Page 18: innkapsling

18

Læringsmål for forelesningen

• OO– innkapsling vha. tilgangsmetoder

• Java– fra attributter til tilgangsmetoder

• Eclipse– generering av tilgangsmetoder

Page 19: innkapsling

19

Har du nådd læringsmålene?

• OO– Hvorfor er det så viktig å innkapsle et objekt i et

metodegrensesnitt?

• Java– Lag en Person-klasse med et String-attributt alder. Definer

en tilgangsmetode for å endre attributtet, som kun endrer alderen hvis den er > 0 og mindre enn 100. Definere en tilgangsmetode for å lese alderen, kalt getAlder. Bytt så ut alder-attributtet med et java.util.Date-attributt, og endre getAlder så den fortsatt gir rett svar.

• Eclipse– generer tilgangsmetoder for fodselsdato-attributtet.