"Hej, Amigo! Jag vill ägna dagens föreläsning åt inkapsling . Du har redan en allmän uppfattning om vad det är."

Inkapsling - 1

Så vad är fördelarna med inkapsling? Det finns många, men jag kommer att peka ut fyra som enligt min mening är viktigast:

1) Giltigt internt tillstånd.

Program har ofta flera klasser som interagerar med samma objekt. Genom att interagera samtidigt med objektets interna data kan de bryta mot objektets dataintegritet, vilket gör att objektet slutar fungera korrekt.

Så objektet måste spåra alla ändringar av dess interna data, eller ännu bättre – det bör vara den som gör dessa ändringar.

Om vi ​​inte vill att någon klassvariabel ska ändras av andra klasser, så förklarar vi den privat , vilket betyder att endast den klassens metoder kan komma åt den. Om vi ​​vill att variabler ska vara skrivskyddade för andra klasser, lägger vi till public getter till dessa variabler.

Till exempel kanske vi vill att alla ska veta hur många element det finns i vår samling, men ingen ska kunna ändra det utan vår tillåtelse. I det här fallet deklarerar vi en variabel privat int count och en metod public getCount() .

Korrekt inkapsling garanterar att andra klasser inte direkt kan komma åt vår klasss interna data och följaktligen inte kan ändra dem utan att vi kan kontrollera deras handlingar. De måste anropa metoder på klassen som innehåller variablerna som kommer att ändras.

Det är bäst att anta att andra programmerare alltid kommer att använda dina klasser på det sätt som är mest bekvämt för dem, inte på det sätt som skulle vara säkrast för dig (eller din klass). Detta är en källa till buggar och ett sätt att förhindra dem.

2) Parameterkontroll.

Ibland behöver du kontrollera parametrarna som skickas in i din klasss metoder. Anta till exempel att vi har en klass som representerar en "person" och att du kan ange dess födelsedatum. Vi bör verifiera att all data som skickas in överensstämmer med programmets logik och klassens logik. Det finns till exempel ingen 13:e månad, ingen 30 februari osv.

"Varför skulle någon ange ett födelsedatum den 30 februari?"

"Tja, först och främst kan det vara resultatet av ett datainmatningsfel."

För det andra, innan ett program fungerar som ett urverk, kan det ha många buggar. Till exempel kan något liknande hända.

En programmerare skriver kod som avgör vem som fyller år i övermorgon. Låt oss säga att det är den 3 mars i dag. Programmet lägger till 2 till det aktuella datumet och hittar alla som är födda den 5 mars. Så långt har det gått bra.

Men när den 30 mars kommer hittar inte programmet någon, eftersom det inte finns någon 32 mars. Program är mycket mindre buggiga när metoder utför parameterkontroll."

"Jag kommer ihåg att när vi studerade ArrayList tittade jag på dess kod, och det fanns kontroller i get- och set-metoderna för att säkerställa att indexparametern är större än eller lika med noll och mindre än längden på arrayen. Koden skulle kasta en undantag om arrayen inte hade ett element som motsvarar indexet.

"Japp, det är klassisk inmatningskontroll. "

3) Färre buggar när du byter kod i klasser.

Anta att vi skrev en riktigt hjälpsam klass som en del av ett stort projekt. Alla gillar det så mycket att andra programmerare började använda det på hundratals ställen i sin egen kod.

Klassen visade sig vara så användbar att du bestämde dig för att förbättra den. Men om du blir av med någon av metoderna i klassen kommer koden för dussintals andra programmerare inte längre att kompilera. De skulle snabbt behöva skriva om sin kod. Och ju mer omskrivning som händer, desto fler möjligheter finns det för buggar. Om du regelbundet bryter bygget kommer du att bli hatad.

Men om vi ändrar metoder markerade som privata vet vi att dessa metoder inte anropas av någon annans kod någonstans. Vi kan skriva om dem och ändra antalet och typen av parametrar, och beroende kod kommer fortfarande att fungera. Eller åtminstone kommer den fortfarande att kompilera.

4) Vi definierar hur andra objekt ska interagera med vårt objekt.

Vi kan begränsa vilka åtgärder som kan vidtas på vårt objekt. Till exempel kanske vi vill att bara en instans av en klass ska skapas – även om den skapas på flera ställen samtidigt i projektet. Och vi kan uppnå detta med hjälp av inkapsling.

Inkapsling - 2

Inkapsling låter oss införa ytterligare begränsningar som kan förvandlas till ytterligare fördelar . Till exempel implementeras klassen String som ett oföränderligt objekt. En instans av klassen String kan inte ändras mellan dess skapelse och dess förstörelse. Alla metoder i klassen String (remove, substring, ...) returnerar en ny sträng och ändrar inte på något sätt objektet de anropas på.

"Heliga ko. Så det är som det är."

"Inkapsling är spännande."

"Jag håller med."