Hermetyzacja to zasada programowania obiektowego mówiąca o tym, że
A. typy pól w klasach/obiektach mogą być dynamicznie zmieniane w zależności od danych im przypisywanych.
B. pola i metody wykorzystywane tylko przez daną klasę/obiekt są ograniczane zasięgiem private lub protected.
C. klasy/obiekty mogą współdzielić ze sobą funkcjonalność.
D. klasy/obiekty mogą mieć zdefiniowane metody wirtualne, które są implementowane w pochodnych klasach/obiektach.
Pytanie z egzaminu CKE, czerwiec 2017 (arkusz E.14-X-17.06).
Hermetyzacja polega na ukrywaniu szczegółów działania klasy i kontrolowaniu dostępu do jej danych oraz metod. Dlatego odpowiedź o ograniczaniu pól i metod zasięgiem private lub protected jest właściwa. W praktyce chodzi o to, żeby obiekt nie pozwalał każdemu fragmentowi programu grzebać bezpośrednio w jego stanie wewnętrznym. Na przykład klasa KontoBankowe może mieć prywatne pole saldo, a publiczne metody wplac(), wyplac() i pobierzSaldo(). Dzięki temu nie da się przypadkiem ustawić salda na wartość bez sensu, np. -999999, tylko każda zmiana przechodzi przez kontrolowaną logikę. To jest bardzo ważna dobra praktyka w OOP, spotykana w Javie, C#, PHP, TypeScript czy C++. Warto pamiętać, że private oznacza dostęp tylko wewnątrz danej klasy, a protected pozwala też korzystać z elementu w klasach dziedziczących. Moim zdaniem to jedna z tych zasad, które na początku wydają się formalnością, ale przy większym projekcie ratują porządek w kodzie. Hermetyzacja wspiera zasadę niskiego sprzężenia, ułatwia testowanie, zmniejsza ryzyko przypadkowych zmian i pozwala zmienić implementację klasy bez psucia reszty programu.
W tym pytaniu łatwo pomylić kilka filarów programowania obiektowego, bo wszystkie brzmią dość podobnie i często występują razem w tych samych klasach. Współdzielenie funkcjonalności między klasami lub obiektami kojarzy się raczej z dziedziczeniem, kompozycją albo użyciem traitów, zależnie od języka. To nie jest sedno hermetyzacji. Jeśli klasa Samochod dziedziczy po klasie Pojazd metodę rusz(), to faktycznie wykorzystuje wspólną funkcjonalność, ale nie mówi to jeszcze nic o ukrywaniu pól i kontroli dostępu. Dynamiczna zmiana typów pól to z kolei temat typowania dynamicznego, znany np. z JavaScript albo PHP. Zmienna może raz przechowywać liczbę, a później tekst, ale to dotyczy systemu typów, nie ochrony stanu obiektu. Mylenie tego z hermetyzacją wynika często z tego, że oba zagadnienia dotyczą danych w programie, tylko na zupełnie innym poziomie. Metody wirtualne implementowane w klasach pochodnych są związane głównie z polimorfizmem i mechanizmem nadpisywania metod. Dzięki nim można wywołać tę samą metodę na obiekcie bazowego typu, a program wykona wersję z konkretnej klasy pochodnej. To bardzo przydatne, ale nadal nie jest hermetyzacją. Hermetyzacja odpowiada na pytanie: kto ma prawo odczytać lub zmienić dane obiektu i przez jakie metody ma to zrobić. W dobrym kodzie obiekt nie wystawia wszystkiego publicznie, tylko udostępnia przemyślany interfejs, a szczegóły zostawia schowane wewnątrz klasy.