1. Wstęp

Dzisiejszą lekcję chcemy poświęcić enkapsulacji . Wiesz już, co to jest ogólnie.

Kapsułkowanie

Jakie są zalety enkapsulacji? Jest ich całkiem sporo, ale mogę wyróżnić cztery, które moim zdaniem są najważniejsze:


2. Prawidłowy stan wewnętrzny

W programach często dochodzi do sytuacji, gdy obiekt wchodzi w interakcję z kilkoma innymi klasami. Te interakcje z obiektem mogą uszkodzić dane wewnątrz obiektu, uniemożliwiając dalsze działanie obiektu zgodnie z oczekiwaniami.

W rezultacie obiekt musi śledzić wszelkie zmiany w swoich danych wewnętrznych, a jeszcze lepiej, sam je wprowadzać.

Jeśli nie chcemy, aby jakaś zmienna była zmieniana przez inne klasy, deklarujemy ją jako prywatną. Gdy to zrobimy, dostęp do niego będą miały tylko metody jego własnej klasy. Jeśli chcemy, aby zmienne były tylko do odczytu, musimy dodać a public getterdla odpowiednich zmiennych.

Załóżmy na przykład, że chcemy, aby każdy mógł znać liczbę elementów w naszej kolekcji, ale nie chcemy, aby mogli ją zmieniać bez naszej zgody. Następnie deklarujemy private int countzmienną i public getCount()metodę.

Właściwe użycie enkapsulacji gwarantuje, że żadna klasa nie będzie miała bezpośredniego dostępu do wewnętrznych danych naszej klasy, co zapobiega wszelkim zmianom będącym poza naszą kontrolą. Zmiany te są możliwe tylko poprzez wywołanie metod tej samej klasy co zmieniane zmienne.

Najlepiej założyć, że inni programiści zawsze będą korzystać z twoich zajęć w sposób dla nich najwygodniejszy, a nie najbezpieczniejszy dla ciebie (dla twojej klasy). Takie zachowanie jest źródłem zarówno błędów, jak i prób zapobiegania im.


3. Walidacja argumentów metody

Czasami musimy zweryfikować argumenty przekazywane do naszych metod. Załóżmy na przykład, że mamy klasę, która reprezentuje osobę i pozwala ustawić datę urodzenia. Musimy sprawdzić wszystkie dane wejściowe, aby upewnić się, że mają sens z logiką programu i logiką naszej klasy. Na przykład, aby nie zezwolić na datę urodzenia w 13 miesiącu lub 30 lutego i tak dalej.

Dlaczego ktoś miałby podawać 30 lutego jako datę urodzenia? Po pierwsze, może to być błąd użytkownika podczas wprowadzania danych. Po drugie, program może zawierać wiele błędów, zanim zacznie działać jak w zegarku. Na przykład możliwa jest następująca sytuacja.

Programista pisze program, który identyfikuje osoby, których urodziny przypadają pojutrze. Załóżmy na przykład, że dzisiaj jest 3 marca. Program dodaje cyfrę 2 do bieżącego dnia miesiąca i szuka wszystkich, którzy urodzili się 5 marca. Wygląda na to, że wszystko się zgadza.

Ale kiedy nadejdzie 30 marca, program nikogo nie znajdzie, bo w kalendarzu nie ma 32 marca. Program ma znacznie mniej błędów, jeśli sprawdzimy dane przekazywane do metod.

Pamiętasz, jak studiowaliśmy ArrayListi analizowaliśmy jego kod? Widzieliśmy, że metody geti setsprawdzały, czy indexjest większa lub równa zeru i mniejsza niż długość tablicy. Co więcej, te metody zgłaszają wyjątek, jeśli indeks wykracza poza granice tablicy. Jest to klasyczny przykład sprawdzania poprawności danych wejściowych.


4. Minimalizacja błędów przy zmianie kodu

Załóżmy, że napisaliśmy super przydatną klasę, kiedy byliśmy zaangażowani w duży projekt. Wszystkim tak się to spodobało, że inni programiści zaczęli go używać w setkach miejsc w swoim kodzie.

Zajęcia były tak przydatne, że postanowiłeś wprowadzić do nich kilka ulepszeń. Ale jeśli usuniesz jakiekolwiek metody z klasy, kod dziesiątek osób przestanie się kompilować. Będą musieli napisać wszystko od nowa. A im więcej zmian wprowadzisz, tym więcej błędów stworzysz. Złamiesz wiele zgromadzeń i będziesz znienawidzony.

Ale kiedy zmienimy metody, które są zadeklarowane jako prywatne, wiemy, że nie ma nigdzie innej klasy, która mogłaby wywoływać te metody. Możemy je przepisać, zmienić ilość parametrów i ich typy, a każdy zależny od nich kod zewnętrzny będzie nadal działał. Cóż, przynajmniej się skompiluje.


5. Decydujemy o tym, jak nasz obiekt oddziałuje na obiekty zewnętrzne

Możemy ograniczyć niektóre akcje, które można wykonać na naszym obiekcie. Załóżmy na przykład, że chcemy, aby obiekt został utworzony tylko raz. Nawet jeśli może powstać w kilku miejscach w projekcie. A możemy to zrobić dzięki enkapsulacji.

Hermetyzacja 2

Enkapsulacja pozwala na dodanie dodatkowych ograniczeń , które można zamienić w dodatkowe korzyści . Na przykład Stringklasa jest zaimplementowana jako niezmienny obiekt. Przedmiot klasy Stringjest niezmienny od momentu jego powstania aż do śmierci. Wszystkie metody klasy String( remove, substring, ...) zwracają nowy ciąg znaków bez wprowadzania jakichkolwiek zmian w obiekcie, na którym są wywoływane.

Enkapsulacja to bardzo ciekawa rzecz.