1. Introduksjon

Vi ønsker å vie dagens leksjon til innkapsling . Du vet allerede hva det er i generelle termer.

Innkapsling

Hva er fordelene med innkapsling? Det er ganske mange av dem, men jeg kan trekke ut fire som, etter min mening, er de viktigste:


2. Gyldig intern tilstand

I programmer oppstår ofte situasjoner når et objekt samhandler med flere andre klasser. Disse interaksjonene med objektet kan ødelegge dataene inne i objektet, noe som gjør det umulig for objektet å fortsette å fungere som forventet.

Som et resultat må objektet holde styr på eventuelle endringer i interne data, eller enda bedre, gjøre endringene selv.

Hvis vi ikke vil at en variabel skal endres av andre klasser, erklærer vi den privat. Når vi gjør det, er det bare metodene til dens egen klasse som kan få tilgang til den. Hvis vi vil at variablene skal være skrivebeskyttede, må vi legge til a public getterfor de relevante variablene.

Anta for eksempel at vi ønsker at alle skal kunne vite antall elementer i samlingen vår, men vi vil ikke at de skal kunne endre samlingen uten vår tillatelse. Deretter erklærer vi en private int countvariabel og en public getCount()metode.

Riktig bruk av innkapsling sikrer at ingen klasse har direkte tilgang til klassens interne data, noe som derfor forhindrer endringer utenfor vår kontroll. Disse endringene er bare mulige ved å kalle metodene i samme klasse som variablene som endres.

Det er best å anta at andre programmerere alltid vil bruke klassene dine på den måten som er mest praktisk for dem, ikke den måten som er tryggest for deg (for klassen din). Denne oppførselen er kilden til begge feilene samt forsøk på å forhindre dem.


3. Validering av metodeargumenter

Noen ganger må vi validere argumentene som sendes til metodene våre. La oss for eksempel si at vi har en klasse som representerer en person og lar deg angi en fødselsdato. Vi må sjekke alle inndataene for å sikre at de gir mening med logikken til programmet og logikken til klassen vår. For eksempel å nekte en fødselsdato i en 13. måned eller 30. februar, og så videre.

Hvorfor vil noen angi 30. februar som fødselsdato? For det første kan dette være en brukerfeil ved inntasting av data. For det andre kan et program ha mange feil før det begynner å kjøre som smurt. For eksempel er følgende situasjon mulig.

En programmerer skriver et program som identifiserer personer som har bursdag i overmorgen. La oss for eksempel si at det er 3. mars i dag. Programmet legger til tallet 2 til gjeldende dag i måneden og ser etter alle som er født 5. mars. Det ser ut til at alt stemmer.

Men når 30. mars kommer, vil ikke programmet finne noen, fordi kalenderen ikke har 32. mars. Et program har langt færre feil hvis vi sjekker dataene som sendes til metoder.

Husker du da vi studerte ArrayListog analyserte koden? Vi så at metodene getog setsjekket om indexer større enn eller lik null og mindre enn lengden på matrisen. Dessuten gir disse metodene et unntak hvis indeksen faller utenfor arrayens grenser. Dette er et klassisk eksempel på inputvalidering.


4. Minimering av feil ved endring av kode

Tenk deg at vi skrev en super nyttig klasse da vi var involvert i et stort prosjekt. Alle likte det så godt at andre programmerere begynte å bruke det hundrevis av steder i koden deres.

Klassen var så nyttig at du bestemte deg for å gi den noen forbedringer. Men hvis du fjerner noen metoder fra klassen, vil koden til dusinvis av mennesker slutte å kompilere. De må skrive om alt. Og jo flere endringer du gjør, jo flere feil vil du lage. Du vil bryte mange forsamlinger og du vil bli hatet.

Men når vi endrer metoder som er erklært som private, vet vi at det ikke er en eneste annen klasse noe sted som kan kalle disse metodene. Vi kan skrive dem om, endre antall parametere og deres typer, og eventuell avhengig ekstern kode vil fortsette å fungere. Vel, den vil i det minste kompilere.


5. Vi bestemmer hvordan objektet vårt samhandler med eksterne objekter

Vi kan begrense noen av handlingene som kan utføres med objektet vårt. Anta for eksempel at vi vil at et objekt bare skal instansieres én gang. Selv om det kan være opprettet flere steder i prosjektet. Og vi kan gjøre dette takket være innkapsling.

Innkapsling 2

Innkapsling lar oss legge til ytterligere begrensninger , som kan gjøres om til ytterligere fordeler . For eksempel Stringer klassen implementert som et uforanderlig objekt. Et objekt i Stringklassen er uforanderlig fra dets skapelse til det øyeblikket det dør. Alle metodene i Stringklassen ( remove, substring, ...), returnerer en ny streng uten å gjøre noen endringer i objektet de kalles på.

Innkapsling er en veldig interessant ting.