Witam! Czy mógłby mi ktoś wytłumaczyć w prosty sposób na czym polega hermetyzacja ?
W dużym skrócie: na utworzeniu klasy w taki sposób aby bez dokładnego studiowania dokumentacji początkujący programista używając klasy nie był w stanie doprowadzić do takiej sytuacji że klasa:
- powoduje wycieki pamięci
- zawiera nie spójne dane
- maże po pamięci
i kilka innych.
Wystarczy używać w odpowiedni sposób atrybutów i metod prywatnych (private) klas. Hermetyzacja to m.in tworzenie metod, które regulują w odpowiedni sposób możliwości pracy z danymi atrybutami. Mając atrybut "wiek" publiczny istnieje możliwość, że ktoś poda mu wartość "-1" ale nie ma ujemnego wieku tak więc robimy ten atrybut jako prywatny i tworzymy metode, która pozwala zmienić wiek na wartość od np. "5" do "10".
Gdybyśmy tak nie zrobili, a np. obiekt innej klasy korzystałby z tej wartości i oczekiwał wieku od 0 do 10, a napotkał -1 to byłoby źle. Oczywście to lajtowy przypadek ale mogą się pojawić gorsze analogiczne :)
Podręcznikowo hermetyzacja służy ukrywaniu nieistotnych rzeczy (nieistotnych z punktu widczenia autora klasy) po to, żeby klasa była prostsza niż w rzeczywistości jest i po to, żeby użytkownik klasy nie zrobił sobie bynajmniej krzywdy robiąc coś czego wcześniej wspomniany autor nie przewidział.
Ten mechanizm ma też drugie oblicze i służy jako narzędzie dla projektantów bibliotek. Chodzi tutaj wyłącznie o to, żeby wyodrębnić kod, ktory pod wpływem czasu zmieni się nie do poznania. Bez tego mechanizmu aktualizacja biblioteki pociągałaby za sobą konieczność aktualizowania wielu aplikacji.
Wg mnie cudowność hermetyzacji jest przereklamowana i zarazem nadużywana. Rozumiem przypadki dla których robi się akcesor, który w momencie aktualizacji zmiennej coś jeszcze z nią robi, ale nie łapie sensu 99% akcesorów, które i tak nic nie robią poza zabezpieczaniem przyszłości kodu. Taka hermetyzacja to wymóżdżanie aplikacji po to, żeby pokazać ile to regułek się wyczytało z książek.
W kodzie pythonowym nie korzysta się z hermetyzacji w oparciu o modyfikatory public, protected, private. Tam po prostu koduje się możliwie wiele rzeczy publicznie, bo tak jest bardziej intuicyjnie. Natomiast jeśli mamy solidne zastrzeżenia wobec danej zmiennej to ją oznaczamy podkreśleniem z początku nazwy i poprzez to informujemy innych, by tego nie używali.