14. Hermetyzacja danych - cechy klas obiektowych
Enkapsulacja (z ang. encapsulation, kapsułkowanie, hermetyzacja lub inaczej ukrywanie informacji) polega na ukrywaniu pewnych danych składowych (pól) lub metod obiektów danej klasy tak, aby były one (i ich modyfikacja) dostępne tylko metodom wewnętrznym danej klasy lub funkcjom z nią zaprzyjaźnionym.
Z pełną enkapsulacją mamy do czynienia wtedy gdy dostęp do wszystkich pól w klasie jest możliwy tylko i wyłącznie poprzez metody, lub inaczej: gdy wszystkie pola w klasie znajdują się w sekcji prywatnej (lub chronionej).
- pola - zmienne, które są składnikiem klasy
- metody - są to funkcje zadeklarowane wewnątrz klasy. Funkcje te mają zakres klasy, w której zostały zadeklarowane. Mają pełny dostęp do wszystkich składników swojej klasy, tzn. i do danych, i do innych metod. Do składnika swojej klasy odwołują się poprzez podanie jego nazwy.
Istnieją etykiety, za pomocą których można określić dostęp do składników klasy. Są trzy rodzaje dostępu do składnika klasy:
- public - jest dostępny bez ograniczeń. Zwykle takimi składnikami są jakieś wybrane funkcje składowe. To za ich pomocą dokonuje się z zewnątrz operacji na danych prywatnych.
- private - jest dostępny tylko dla funkcji składowych danej klasy, a także dla funkcji zaprzyjaźnionych z tą klasą.
- protected - jest dostępny tak, jak składnik private, ale dodatkowo jest jeszcze dostępny dla klas wywodzących się od tej klasy.
Przyczyny stosowania enkapsulacji:
· Uodparnia tworzony model na błędy polegające np. na błędnym przypisywaniu wartości oraz umożliwia wykonanie czynności pomocniczych jak np. pobranie z konta 10% wypłacanej kwoty jako prowizja.
· Lepiej oddaje rzeczywistość. Np. obrazuje atomowe operacje na koncie bankowym, podczas gdy odwołanie się bezpośrednie do salda nie oznaczałoby nic szczególnego.
· Umożliwia rozbicie modelu na mniejsze elementy. Dzięki stosowaniu enkapsulacji można budować modele rzeczywistości jako struktury składające z mniejszych modułów, z których każdy ma pewne określone dane i określone metody wpływania na ich stan i sprawdzania go.
Ukrywanie wewnętrznej struktury obiektu jest bardzo ważne z kilku powodów:
· obiekt taki jest odizolowany, a więc nie jest narażony na celowe, bądź niezamierzone działanie ze strony użytkownika,
· obiekt ten na pewno jest chroniony od niepożądanych referencji ze strony innych obiektów,
· obiekt taki - jeśli jest to tylko możliwe, nie wpływa na zmiany, czy jakieś małe korekty wprowadzone w implementacji (obie strony nie kolidują wówczas ze sobą),
· dzięki ukryciu wewnętrznej struktury obiektu, można uzyskać jego przenośność. Innymi słowy, zastosować definiującą go klasę w innym fragmencie kodu, czy też programie.