Ukrywanie pewnych pól lub metod obiektów danej klasy tak, aby były one dostępne tylko metodom wewnętrznym tej klasy lub funkcjom zaprzyjaźnionym, to
A. polimorfizm.
B. konkatenacja.
C. dziedziczenie.
D. hermetyzacja.
Pytanie z egzaminu CKE, styczeń 2015 (arkusz E.14-X-15.01).
Chodzi tu o hermetyzację, czyli jedną z podstawowych zasad programowania obiektowego. Polega ona na ukrywaniu szczegółów działania klasy przed kodem zewnętrznym i udostępnianiu tylko tego, co naprawdę powinno być używane z zewnątrz. W praktyce robi się to przez modyfikatory dostępu, np. private, protected i public. Jeżeli pole klasy jest prywatne, to nie powinno się go zmieniać bezpośrednio z innych części programu, tylko przez metody klasy, np. gettery, settery albo bardziej sensowne metody typu ustawHaslo(), obliczWartosc(), dodajProdukt(). W C++ dodatkowo istnieją funkcje zaprzyjaźnione, które mogą mieć dostęp do prywatnych składników klasy, ale to powinno być używane ostrożnie, bo łatwo zepsuć porządek w projekcie. Moim zdaniem hermetyzacja jest trochę jak zamknięcie mechanizmu w obudowie: użytkownik ma przyciski, ale nie grzebie w przewodach. To jest dobra praktyka branżowa, bo zmniejsza ryzyko przypadkowych błędów, ułatwia testowanie, rozwój kodu i późniejsze poprawki. Dzięki temu można zmienić wewnętrzną implementację klasy bez rozwalania reszty aplikacji.
W tym pytaniu kluczowe jest rozpoznanie pojęcia z programowania obiektowego, które dotyczy ukrywania wewnętrznych danych klasy. Nie chodzi o polimorfizm, chociaż to też bardzo ważna cecha obiektowości. Polimorfizm oznacza możliwość używania tego samego interfejsu dla różnych typów obiektów, na przykład gdy metoda rysuj() działa inaczej dla klasy Kolo, Prostokat i Trojkat. Tam istotne jest różne zachowanie obiektów, a nie blokowanie dostępu do pól czy metod. Łatwo się tu pomylić, bo oba pojęcia występują zwykle razem przy klasach, metodach i obiektach. Konkatenacja jest już z zupełnie innego obszaru. Oznacza łączenie tekstów, na przykład sklejenie imienia i nazwiska w jeden napis. Nie ma związku z dostępem do składników klasy ani z bezpieczeństwem struktury obiektu. Dziedziczenie również nie opisuje ukrywania pól. Ono pozwala tworzyć nowe klasy na podstawie już istniejących, czyli klasa potomna przejmuje cechy i zachowania klasy bazowej. W dziedziczeniu mogą występować modyfikatory dostępu, np. protected, ale samo dziedziczenie nie jest mechanizmem ukrywania implementacji. Poprawnym pojęciem jest hermetyzacja, bo to ona mówi, że szczegóły klasy powinny być schowane, a kod zewnętrzny ma korzystać z kontrolowanego interfejsu. Z mojego doświadczenia to jedna z tych zasad, które na początku wydają się teorią, a potem ratują projekt przed bałaganem.