You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

Innkapsling er en programmeringsteknikk som har som formål å hindre direkte tilgang til tilstanden til et objekt fra objekter av andre klasser. Motivasjonen er todelt: For det første er det viktig å sikre at tilstanden til alle objektene er gyldig. Dette gjøres best ved at alle endringer av tilstanden skjer ved å kalle objektets metoder, heller enn å endre på attributtene direkte. På denne måten slipper andre objekter å kjenne til alle reglene for gyldighet og konsistens, og koden blir mer robust ved at all logikk om attributter og regler samles i én klasse. For det andre er det viktig at koden for en klasse ikke er avhengig av detaljer i en annen, f.eks. eksakt hvilke attributter og datatyper som brukes for å representere data, fordi dette gjør endringer lettere å håndtere.

Ta som eksempel representasjon av fornavn og etternavn for en person. Dette kan gjøres med ett String-attributt, med fornavn og etternavn skilt med mellomrom, eller to separate String-attributter, ett for fornavn og ett for etternavn. Uansett hvilken konkret representasjon som velges, så handler det logisk sett om å håndtere to (uavhengige) verdier og det er ingen grunn til at detaljer om hvordan representasjonen gjøres skal være kjent for andre klasser. Istedet defineres operasjoner for både å lese og endre disse to verdiene og implementasjonene tar seg av detaljene. Dette er illustrert i følgende figur:

Innkapsling av fornavn, mellomnavn og etternavnPersonString getGivenName()void setGivenName(String givenName)String getFamilyName()void setFamilyName(String familyName)Operations onlyPersonAlternative1String givenNameString familyNameString getGivenName()void setGivenName(String givenName)String getFamilyName()void setFamilyName(String familyName)"Implementation alternative 1, separate attributes for each value"PersonAlternative2String fullNameString getGivenName()void setGivenName(String givenName)String getFamilyName()void setFamilyName(String familyName)"Implementation alternative 2, one attribute combining both values"

 

For det andre er det viktig at detaljer om hvordan data representeres med attributter   kalle metoder Først og fremst gjøres dette ved å 1) definere regler for gyldighet for de ulike typene objekter og 2) sikre at alle metoder kodes i henhold til disse reglene. Dette er nøkkelen til programmeringsmetoden kalt innkapsling, som sammen med såkalte synlighetsmodifikatorer utgjør et vern mot ugyldig tilstander i programmer.

Formålet med innkapsling er hovedsaklig å sikre riktig bruk av et objekt

  • No labels