1. Introduktion
Vi ønsker at afsætte dagens lektion til indkapsling . Du ved allerede, hvad det er i generelle vendinger.
Hvad er fordelene ved indkapsling? Der er en del af dem, men jeg kan fremhæve fire, som efter min mening er de vigtigste:
2. Gyldig intern tilstand
I programmer opstår der ofte situationer, når et objekt interagerer med flere andre klasser. Disse interaktioner med objektet kan ødelægge dataene inde i objektet, hvilket gør det umuligt for objektet at fortsætte med at fungere som forventet.
Som et resultat skal objektet holde styr på eventuelle ændringer i dets interne data, eller endnu bedre, selv foretage ændringerne.
Hvis vi ikke ønsker, at en variabel skal ændres af andre klasser, så erklærer vi den for privat. Når vi gør det, er det kun metoderne i dens egen klasse, der kan få adgang til det. Hvis vi ønsker, at variablerne skal være skrivebeskyttede, skal vi tilføje a public getter
for de relevante variable.
Antag for eksempel, at vi ønsker, at alle skal kunne kende antallet af elementer i vores samling, men vi ønsker ikke, at de skal kunne ændre samlingen uden vores tilladelse. Så erklærer vi en private int count
variabel og en public getCount()
metode.
Korrekt brug af indkapsling sikrer, at ingen klasse kan få direkte adgang til vores klasses interne data, hvilket derfor forhindrer ændringer uden for vores kontrol. Disse ændringer er kun mulige ved at kalde metoderne i samme klasse som de variabler, der ændres.
Det er bedst at antage, at andre programmører altid vil bruge dine klasser på den måde, der er mest bekvem for dem, ikke den måde, der er mest sikker for dig (for din klasse). Denne adfærd er kilden til begge fejl såvel som forsøg på at forhindre dem.
3. Validering af metodeargumenter
Nogle gange er vi nødt til at validere de argumenter, der er sendt til vores metoder. Lad os f.eks. sige, at vi har en klasse, der repræsenterer en person og lader dig angive en fødselsdato. Vi skal kontrollere alle inputdata for at sikre, at de giver mening med programmets logik og vores klasses logik. For eksempel at afvise en fødselsdato i en 13. måned eller den 30. februar og så videre.
Hvorfor skulle nogen angive 30. februar for deres fødselsdato? For det første kan dette være en brugerfejl ved indtastning af data. For det andet kan et program have masser af fejl i det, før det begynder at køre som smurt. For eksempel er følgende situation mulig.
En programmør skriver et program, der identificerer personer, hvis fødselsdag er i overmorgen. Lad os f.eks. sige, at i dag er den 3. marts. Programmet føjer tallet 2 til den aktuelle dag i måneden og leder efter alle, der er født den 5. marts. Det ser ud til, at alt er korrekt.
Men når den 30. marts kommer, vil programmet ikke finde nogen, for kalenderen har ingen 32. marts. Et program har langt færre fejl, hvis vi tjekker de data, der sendes til metoder.
Kan du huske, da vi studerede ArrayList
og analyserede dens kode? Vi så, at og metoderne kontrollerede, om er større end eller lig med nul og mindre end længden af arrayet. get
set
index
Hvad mere er, giver disse metoder en undtagelse, hvis indekset falder uden for arrayets grænser. Dette er et klassisk eksempel på inputvalidering.
4. Minimering af fejl ved ændring af kode
Antag, at vi skrev en super nyttig klasse, da vi var involveret i et stort projekt. Alle kunne lide det så meget, at andre programmører begyndte at bruge det hundredvis af steder i deres kode.
Klassen var så nyttig, at du besluttede at give den nogle forbedringer. Men hvis du fjerner nogen metoder fra klassen, stopper koden for snesevis af mennesker med at kompilere. De bliver nødt til at omskrive alt. Og jo flere ændringer du foretager, jo flere fejl vil du skabe. Du vil bryde masser af forsamlinger, og du vil blive hadet.
Men når vi ændrer metoder, der er erklæret som private, ved vi, at der ikke er en eneste anden klasse nogen steder, der kunne kalde disse metoder. Vi kan omskrive dem, ændre antallet af parametre og deres typer, og enhver afhængig ekstern kode vil fortsætte med at fungere. Nå, i det mindste vil den kompilere.
5. Vi bestemmer, hvordan vores objekt interagerer med eksterne objekter
Vi kan begrænse nogle af de handlinger, der kan udføres med vores objekt. Antag for eksempel, at vi ønsker, at et objekt kun skal instansieres én gang. Også selvom det kan være oprettet flere steder i projektet. Og det kan vi gøre takket være indkapsling.
Indkapsling lader os tilføje yderligere begrænsninger , som kan omdannes til yderligere fordele . For eksempel String
er klassen implementeret som et uforanderligt objekt. Et objekt i String
klassen er uforanderligt fra dets skabelse til dets dødsøjeblik. Alle metoderne i String
klassen ( remove
, substring
, ...) returnerer en ny streng uden at foretage ændringer i det objekt, som de kaldes på.
Indkapsling er en meget interessant ting.
GO TO FULL VERSION