1. Introduktion

Vi vill ägna dagens lektion åt inkapsling . Du vet redan vad det är i allmänna termer.

Inkapsling

Vilka är fördelarna med inkapsling? Det finns en hel del av dem, men jag kan peka ut fyra som, enligt min mening, är de viktigaste:


2. Giltigt internt tillstånd

I program uppstår ofta situationer när ett objekt interagerar med flera andra klasser. Dessa interaktioner med objektet kan korrumpera data inuti objektet, vilket gör det omöjligt för objektet att fortsätta att fungera som förväntat.

Som ett resultat måste objektet hålla reda på eventuella ändringar av dess interna data, eller ännu bättre, göra ändringarna själv.

Om vi ​​inte vill att någon variabel ska ändras av andra klasser, förklarar vi den privat. När vi väl gör det kan bara metoderna i den egna klassen komma åt det. Om vi ​​vill att variablerna ska vara skrivskyddade måste vi lägga till a public getterför de relevanta variablerna.

Anta till exempel att vi vill att alla ska kunna veta antalet element i vår samling, men vi vill inte att de ska kunna ändra samlingen utan vårt tillstånd. Sedan deklarerar vi en private int countvariabel och en public getCount()metod.

Korrekt användning av inkapsling säkerställer att ingen klass direkt kan komma åt vår klasss interna data, vilket därför förhindrar ändringar utanför vår kontroll. Dessa ändringar är endast möjliga genom att anropa metoderna i samma klass som de variabler som ä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 det sätt som är säkrast för dig (för din klass). Detta beteende är källan till både buggar och försök att förhindra dem.


3. Validera metodargument

Ibland behöver vi validera de argument som skickas till våra metoder. Säg till exempel att vi har en klass som representerar en person och som låter dig ange ett födelsedatum. Vi måste kontrollera all indata för att säkerställa att det är vettigt med logiken i programmet och logiken i vår klass. Till exempel för att inte tillåta ett födelsedatum i en 13:e månad eller den 30 februari, och så vidare.

Varför skulle någon ange 30 februari för sitt födelsedatum? För det första kan detta vara ett användarfel när du anger data. För det andra kan ett program ha massor av fel i sig innan det börjar köra som en klocka. Till exempel är följande situation möjlig.

En programmerare skriver ett program som identifierar personer vars födelsedag är i övermorgon. Låt oss till exempel säga att idag är den 3 mars. Programmet lägger till siffran 2 till den aktuella dagen i månaden och letar efter alla som är födda den 5 mars. Det verkar som att allt stämmer.

Men när den 30 mars kommer kommer programmet inte att hitta någon, eftersom kalendern inte har någon 32 mars. Ett program har mycket färre fel om vi kontrollerar data som skickas till metoder.

Kommer du ihåg när vi studerade ArrayListoch analyserade dess kod? Vi såg att metoderna getoch setkontrollerade om indexär större än eller lika med noll och mindre än längden på arrayen. Dessutom ger dessa metoder ett undantag om indexet faller utanför gränserna för arrayen. Detta är ett klassiskt exempel på indatavalidering.


4. Minimera fel vid byte av kod

Anta att vi skrev en supernyttig klass när vi var involverade i ett stort projekt. Alla gillade det så mycket att andra programmerare började använda det på hundratals ställen i sin kod.

Klassen var så användbar att du bestämde dig för att ge den några förbättringar. Men om du tar bort några metoder från klassen kommer koden för dussintals personer att sluta kompilera. De kommer att behöva skriva om allt. Och ju fler ändringar du gör, desto fler fel kommer du att skapa. Du kommer att bryta massor av sammankomster och du kommer att bli hatad.

Men när vi ändrar metoder som deklareras som privata vet vi att det inte finns en enda annan klass någonstans som kan anropa dessa metoder. Vi kan skriva om dem, ändra antalet parametrar och deras typer, och eventuell beroende extern kod kommer att fortsätta att fungera. Tja, den kommer åtminstone att kompilera.


5. Vi bestämmer hur vårt objekt interagerar med externa objekt

Vi kan begränsa några av de åtgärder som kan utföras med vårt objekt. Anta till exempel att vi vill att ett objekt bara ska instansieras en gång. Även om det kan skapas på flera ställen i projektet. Och det kan vi göra tack vare inkapsling.

Inkapsling 2

Inkapsling låter oss lägga till ytterligare begränsningar , som kan omvandlas till ytterligare fördelar . Till exempel Stringimplementeras klassen som ett oföränderligt objekt. Ett objekt i Stringklassen är oföränderligt från ögonblicket för dess skapelse till dess dödsögonblick. Alla metoder i Stringklassen ( remove, substring, ...) returnerar en ny sträng utan att göra några ändringar i objektet som de anropas på.

Inkapsling är en mycket intressant sak.