CodeGym /Java-blogg /Tilfeldig /Innkapsling i Java
John Squirrels
Nivå
San Francisco

Innkapsling i Java

Publisert i gruppen
Hei! Vi skal vie dagens leksjon til Encapsulation in Java og begynne med eksempler rett ut av porten:) Her har du en vanlig brusautomat . Jeg har ett spørsmål til deg: hvordan fungerer det? Prøv å gi et detaljert svar: Hvor kommer brusen fra? Hvordan opprettholdes den indre temperaturen? Hvor er isen lagret? Hvordan vet maskinen hvilken sirup som skal tilsettes? Du har sannsynligvis ikke svar på disse spørsmålene. Ok, kanskje ikke alle bruker disse maskinene. De er ikke så populære for tiden. La oss prøve et annet eksempel. Noe du definitivt bruker mange ganger hver dag. Å, jeg har en idé! Prinsipper for innkapsling - 2Fortell meg hvordan Googles søkemotorvirker. Hvordan søker den etter informasjon om ordene du skriver inn? Hvorfor er disse resultatene på toppen og ikke andre? Selv om du bruker Google hver dag, vet du sannsynligvis ikke det. Men det spiller ingen rolle. Det er tross alt ikke noe du trenger å vite. Du kan bruke en søkemotor uten å tenke på nøyaktig hvordan den fungerer. Du kan kjøpe brus fra en maskin uten å vite hvordan den er bygget. Du kan kjøre bil uten å fordype deg i hvordan forbrenningsmotoren fungerer og uten engang å kunne fysikk på videregående skole. Dette er alt mulig takket være et av hovedprinsippene for objektorientert programmering: innkapsling. Når du leser forskjellige artikler om emnet, må du ha møtt to utbredte programmeringskonsepter: innkapsling og informasjonsskjuling. Som det skjer, forstår forskjellige mennesker ordet ' innkapsling' til å bety forskjellige ting. Vi dechiffrerer begge begrepene slik at du har en fullstendig forståelse. I programmering, den opprinnelige betydningen avinnkapsling var å kombinere data og metoder for å jobbe med disse dataene i én pakke ("kapsel"). I Java er innkapslingspakke klassen . Klassen inneholder både data (felt) og metoder for å arbeide med disse dataene. Prinsipper for innkapsling - 3Dette kan virke innlysende for deg, men alt er ordnet annerledes i andre programmeringsparadigmer. For eksempel, i funksjonell programmering, er data strengt skilt fra dataoperasjoner. I objektorientert programmering (OOP) består programmer av kapsler (klasser) bestående av både data og funksjoner for arbeid med data.

La oss nå snakke om å skjule informasjon

Hvordan bruker vi alle slags komplekse mekanismer uten å forstå hvordan de er bygget opp eller hvordan de fungerer? Det er enkelt: Skaperne deres ga enkle og praktiske grensesnitt. På en brusmaskin er grensesnittet knappene på frontpanelet. Én knapp lar deg velge koppstørrelsen. Du velger sirupen med en annen knapp. En tredje er ansvarlig for å legge til is. Og det er alt du trenger å gjøre. Det spiller ingen rolle hvordan maskinen ser ut innvendig. Det viktige er at den er utformet slik at brukeren får i seg brus ved å trykke på tre knapper. Det samme gjelder for en bil. Det spiller ingen rolle hva som skjer på innsiden. Det viktige er at når du trykker på høyre pedal går bilen fremover, og når du trykker på venstre pedal bremser bilen ned. Dette er essensen av å skjule informasjon. Alt av et program' Innmaten er skjult for brukeren. Slik informasjon er overflødig eller unødvendig for brukeren. Brukeren trenger et sluttresultat, ikke en intern prosess. For et eksempel, la oss ta en titt påKjøretøysklasse :

public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
Slik er implementeringen skjult i et Java-program. Akkurat som i det virkelige liv: brukeren er utstyrt med et grensesnitt (metoder). I et program, hvis du trenger en bil for å utføre en handling, ringer du ganske enkelt ønsket metode. Det som skjer inne i disse metodene er overflødig. Det som betyr noe er at alt fungerer som det skal. Her har vi snakket om implementeringsskjul. Java har også dataskjul. Vi skrev om det i leksjonen om getters og setters, men en påminnelse vil ikke skade. For eksempel har vi en Cat- klasse:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
Kanskje du husker fra en tidligere leksjon hva problemet er med denne timen? Hvis ikke, la oss huske. Problemet er at dataene (feltene) er åpne for alle. En annen programmerer kan enkelt lage en navnløs katt med en vekt på 0 og en alder på -1000 år:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
I denne situasjonen kan du nøye spore om en av kollegene dine lager objekter med ugyldig tilstand, men det ville være mye bedre å eliminere til og med muligheten for å lage disse ugyldige objektene. Prinsipper for innkapsling - 4Vi oppnår dataskjul ved hjelp av:
  1. tilgangsmodifikatorer ( privat, beskyttet, pakkestandard );
  2. gettere og settere.
Vi bruker dem for å sjekke om noen prøver å gi katten en negativ alder. Som vi sa tidligere, refererer forfatterne av forskjellige artikler om innkapsling faktisk til innkapsling (kombinerer data og metoder) eller informasjonsskjuling, eller begge deler. Java har begge mekanismene (dette er ikke nødvendigvis tilfellet i andre OOP-språk), så det siste alternativet er mest korrekt.

Innkapsling gir oss flere viktige fordeler:

  1. Overvåke riktig objekttilstand. Vi ga eksempler på dette ovenfor: takket være setteren og den private modifikatoren har vi sikret programmet vårt mot katter med en vekt på 0.

  2. Brukervennlig grensesnitt. Vi lar kun metoder være eksponert for brukeren. Brukeren trenger bare å ringe dem for å få et resultat. Og det er overhodet ikke nødvendig å fordype seg i detaljene om hvordan de fungerer.

  3. Kodeendringer påvirker ikke brukere. Vi gjør alle endringer inne i metoder. Dette påvirker ikke brukere: de skrev vehicle.gas() for å bruke gassen, og det er det de vil fortsette å gjøre. Det faktum at vi endret noe inne i gas()- metoden forblir usynlig: som før får de ganske enkelt det nødvendige resultatet.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION