For at et program skal virke etter hensikten, er det helt vesentlig 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:
PlantUML Macro | ||
---|---|---|
| ||
class Person {
String getGivenName()
void setGivenName(String givenName)
String getFamilyName()
void setFamilyName(String familyName)
}
note right: "Only operations are relevant for other classes"
class PersonAlternative1 {
String givenName
String familyName
String getGivenName()
void setGivenName(String givenName)
String getFamilyName()
void setFamilyName(String familyName)
}
note right: "Implementation alternative 1, with separate attributes for each value"
class PersonAlternative2 {
String fullName
String getGivenName()
void setGivenName(String givenName)
String getFamilyName()
void setFamilyName(String familyName)
}
note right: "Implementation alternative 2, with 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.Eksempel følger...
Formålet med innkapsling er hovedsaklig å sikre riktig bruk av et objekt