"Hei, Amigo! Jeg vil dedikere dagens forelesning til innkapsling . Du har allerede en generell idé om hva det er."

Innkapsling - 1

Så hva er fordelene med innkapsling? Det er mange, men jeg vil peke på fire som etter mitt syn er viktigst:

1) Gyldig intern tilstand.

Programmer har ofte flere klasser som samhandler med det samme objektet. Ved å samhandle samtidig med objektets interne data, kan de krenke objektets dataintegritet, og føre til at objektet slutter å fungere som det skal.

Så objektet må spore eventuelle endringer i sine interne data, eller enda bedre – det bør være den som gjør disse endringene.

Hvis vi ikke vil at en klassevariabel skal endres av andre klasser, erklærer vi den privat , noe som betyr at bare den klassens metoder kan få tilgang til den. Hvis vi vil at variabler skal være skrivebeskyttet for andre klasser, legger vi til offentlig getter til disse variablene.

For eksempel vil vi kanskje at alle skal vite hvor mange elementer det er i samlingen vår, men ingen skal kunne endre det uten vår tillatelse. I dette tilfellet erklærer vi en variabel private int count og en metode public getCount() .

Riktig innkapsling garanterer at andre klasser ikke kan få direkte tilgang til klassens interne data og følgelig ikke endre dem uten at vi kan kontrollere handlingene deres. De må kalle metoder på klassen som inneholder variablene som skal endres.

Det er best å anta at andre programmerere alltid vil bruke klassene dine på den måten som er mest praktisk for dem, ikke på den måten som ville være tryggest for deg (eller klassen din). Dette er en kilde til feil, og en måte å forhindre dem på.

2) Parameterkontroll.

Noen ganger må du sjekke parameterne som sendes inn i metodene til klassen din. Anta for eksempel at vi har en klasse som representerer en "person", og du kan spesifisere fødselsdatoen. Vi bør verifisere at alle data som sendes inn samsvarer med programmets logikk og klassens logikk. For eksempel er det ingen 13. måned, ingen 30. februar osv.

"Hvorfor vil noen angi en fødselsdato 30. februar?"

"Vel, for det første kan det være et resultat av en datainntastingsfeil."

For det andre, før et program fungerer som smurt, kan det ha mange feil. For eksempel kan noe slikt skje.

En programmerer skriver kode som bestemmer hvem som har bursdag i overmorgen. La oss si at det er 3. mars i dag. Programmet legger til 2 til gjeldende dato og finner alle som ble født 5. mars. Så langt har det gått bra.

Men når 30. mars kommer, finner ikke programmet noen, siden det ikke er 32. mars. Programmer er langt mindre buggy når metoder utfører parameterkontroll."

"Jeg husker da vi studerte ArrayList, så jeg på koden, og det var kontroller i get- og set-metodene for å sikre at indeksparameteren er større enn eller lik null og mindre enn lengden på arrayen. Koden ville kaste en unntak hvis matrisen ikke hadde et element som tilsvarer indeksen.

"Ja, det er klassisk inndatakontroll. "

3) Færre feil når du endrer kode i klassene.

Tenk deg at vi skrev en veldig nyttig klasse som en del av et stort prosjekt. Alle liker det så godt at andre programmerere begynte å bruke det hundrevis av steder i sin egen kode.

Klassen viste seg å være så nyttig at du bestemte deg for å forbedre den. Men hvis du blir kvitt noen av metodene i klassen, vil koden til dusinvis av andre programmerere ikke lenger kompilere. De må raskt skrive om koden sin. Og jo mer omskriving som skjer, jo flere muligheter er det for feil. Hvis du regelmessig bryter bygget, vil du bli hatet.

Men hvis vi endrer metoder merket som private, vet vi at disse metodene ikke kalles opp av noen andres kode noe sted. Vi kan skrive dem om og endre antall og type parametere, og avhengig kode vil fortsatt fungere. Eller i det minste vil den fortsatt kompilere.

4) Vi definerer hvordan andre objekter skal samhandle med objektet vårt.

Vi kan begrense hvilke handlinger som kan utføres på objektet vårt. For eksempel vil vi kanskje at bare én forekomst av en klasse skal opprettes – selv om den opprettes flere steder samtidig i prosjektet. Og dette kan vi oppnå ved å bruke innkapsling.

Innkapsling - 2

Innkapsling lar oss pålegge ytterligere begrensninger som kan bli til ytterligere fordeler . For eksempel er String-klassen implementert som et uforanderlig objekt. En forekomst av String-klassen kan ikke endres mellom dens opprettelse og dens ødeleggelse. Alle metoder i String-klassen (remove, substring, ...) returnerer en ny streng og endrer på ingen måte objektet de kalles på.

"Hellige ku. Så sånn er det."

"Innkapsling er spennende."

"Jeg er enig."