CodeGym /Blog Java /Random-PL /Hermetyzacja w Javie
Autor
Milan Vucic
Programming Tutor at Codementor.io

Hermetyzacja w Javie

Opublikowano w grupie Random-PL
Cześć! Dzisiejszą lekcję poświęcimy enkapsulacji w Javie i zaczniemy od przykładów :) Tutaj masz zwykłą maszynę dozującą napoje gazowane . Mam do Ciebie jedno pytanie: jak to działa? Spróbuj udzielić szczegółowej odpowiedzi: Skąd pochodzi napój gazowany? Jak utrzymuje się temperaturę wewnętrzną? Gdzie jest przechowywany lód? Skąd maszyna wie, który syrop dodać? Prawdopodobnie nie znasz odpowiedzi na te pytania. Ok, może nie wszyscy używają tych maszyn. Obecnie nie są one tak popularne. Spróbujmy innego przykładu. Coś, czego na pewno używasz wiele razy każdego dnia. O, mam pomysł! Zasady enkapsulacji - 2Powiedz mi, jak działa wyszukiwarka GooglePracuje. Jak dokładnie wyszukuje informacje o wpisywanych słowach? Dlaczego te wyniki są na górze, a nie inne? Chociaż codziennie korzystasz z Google, prawdopodobnie nie wiesz. Ale to nie ma znaczenia. W końcu nie jest to coś, co musisz wiedzieć. Możesz korzystać z wyszukiwarki bez zastanawiania się, jak ona dokładnie działa. Możesz kupić napój gazowany z automatu, nie wiedząc, jak jest zbudowany. Możesz prowadzić samochód bez zagłębiania się w działanie silnika spalinowego i nawet bez znajomości fizyki na poziomie szkoły średniej. Wszystko to jest możliwe dzięki jednej z głównych zasad programowania obiektowego: enkapsulacji. Czytając różne artykuły na ten temat, na pewno zetknąłeś się z dwiema szeroko rozpowszechnionymi koncepcjami programistycznymi: enkapsulacją i ukrywaniem informacji. Tak się składa, że ​​różni ludzie rozumieją słowo „ enkapsulacja” oznaczać różne rzeczy. Rozszyfrujemy oba terminy, abyś miał pełne zrozumienie. W programowaniu pierwotne znaczeniehermetyzacja polegała na łączeniu danych i metod pracy z tymi danymi w jednym pakiecie („kapsułce”). W Javie pakietem enkapsulującym jest klasa . Klasa zawiera zarówno dane (pola), jak i metody pracy z tymi danymi. Zasady enkapsulacji - 3Może ci się to wydawać oczywiste, ale w innych paradygmatach programowania wszystko układa się inaczej. Na przykład w programowaniu funkcjonalnym dane są ściśle oddzielone od operacji na danych. W programowaniu zorientowanym obiektowo (OOP) programy składają się z kapsuł (klas) składających się zarówno z danych, jak i funkcji do pracy z danymi.

Porozmawiajmy teraz o ukrywaniu informacji

Jak możemy używać wszelkiego rodzaju złożonych mechanizmów bez zrozumienia, jak są zbudowane i jak działają? To proste: ich twórcy zapewnili proste i wygodne interfejsy. W automacie z napojami interfejsem są przyciski na przednim panelu. Za pomocą jednego przycisku możesz wybrać rozmiar miseczki. Syrop wybierasz drugim przyciskiem. Trzeci odpowiada za dodawanie lodu. I to wszystko, co musisz zrobić. Nie ma znaczenia, jak maszyna wygląda w środku. Ważne jest to, że jest tak zaprojektowany, że użytkownik dostaje napój gazowany, naciskając trzy przyciski. To samo dotyczy samochodu. Nieważne, co dzieje się w środku. Ważne jest to, że po naciśnięciu prawego pedału samochód jedzie do przodu, a po naciśnięciu lewego pedału samochód zwalnia. To jest istota ukrywania informacji. Cały program” s „wnętrzności” są ukryte przed użytkownikiem. Takie informacje są zbędne lub niepotrzebne dla użytkownika. Użytkownik potrzebuje efektu końcowego, a nie wewnętrznego procesu. Na przykład spójrzmy naKlasa pojazdu :

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();
   }
}
W ten sposób implementacja jest ukryta w programie Java. Zupełnie jak w prawdziwym życiu: użytkownik otrzymuje interfejs (metody). W programie, jeśli potrzebujesz samochodu do wykonania akcji, po prostu wywołujesz żądaną metodę. To, co dzieje się wewnątrz tych metod, jest zbędne. Ważne, że wszystko działa tak, jak powinno. Tutaj mówiliśmy o ukrywaniu implementacji. Java ma również ukrywanie danych. Pisaliśmy o tym na lekcji o getterach i setterach, ale przypomnienie nie zaszkodzi. Na przykład mamy klasę Cat :

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!");
   }


}
Może pamiętasz z poprzedniej lekcji jaki jest problem z tą klasą? Jeśli nie, przypomnijmy. Problem polega na tym, że jego dane (pola) są otwarte dla wszystkich. Inny programista mógłby z łatwością stworzyć bezimiennego kota o wadze 0 i wieku -1000 lat:

public static void main(String[] args) {

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

}
W tej sytuacji mógłbyś dokładnie prześledzić, czy któryś z twoich kolegów tworzy obiekty z nieprawidłowym stanem, ale znacznie lepiej byłoby wyeliminować nawet możliwość tworzenia tych nieprawidłowych obiektów. Zasady enkapsulacji - 4Ukrywanie danych uzyskujemy za pomocą:
  1. modyfikatory dostępu ( prywatny, chroniony, domyślny pakiet );
  2. pobierające i ustawiające.
Używamy ich, aby sprawdzić, czy ktoś nie próbuje nadać kotu negatywnego wieku. Jak powiedzieliśmy wcześniej, autorzy różnych artykułów na temat enkapsulacji w rzeczywistości odnoszą się do enkapsulacji (łączenie danych i metod) lub ukrywania informacji lub obu. Java ma oba mechanizmy (niekoniecznie tak jest w przypadku innych języków OOP), więc ostatnia opcja jest najbardziej poprawna.

Enkapsulacja daje nam kilka ważnych korzyści:

  1. Monitorowanie prawidłowego stanu obiektu. Przykłady tego podaliśmy powyżej: dzięki seterowi i modyfikatorowi private zabezpieczyliśmy nasz program przed kotami o wadze 0.

  2. Przyjazny dla użytkownika interfejs. Pozostawiamy tylko metody widoczne dla użytkownika. Użytkownik musi po prostu do nich zadzwonić, aby uzyskać wynik. I nie ma potrzeby zagłębiać się w szczegóły ich działania.

  3. Zmiany kodu nie mają wpływu na użytkowników. Wszelkich zmian dokonujemy wewnątrz metod. Nie ma to wpływu na użytkowników: napisali vehicle.gas() w celu zastosowania gazu i będą to robić dalej. Fakt, że zmieniliśmy coś w metodzie gas() pozostaje niewidoczny: tak jak poprzednio, po prostu uzyskują wymagany wynik.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION