Hermetyzacja w Javascript

Hermetyzacja (zwana też enkapsulacjąarrow-up-right) to kolejne pojęcie nierozłącznie związane z programowaniem obiektowym. Polega ono na rozdzieleniu wewnętrznego i zewnętrznego interfejsu naszego obiektu.

Wyobraź sobie, że robisz dość skomplikowany mechanizm - np. machinę produkującą kebabyarrow-up-right. Obiekt taki będzie miał pełno właściwości i metod, które będą działać w jego wnętrzu.

Ty jako programista raczej byś nie chciał, by inni programiści mogli grzebać w każdej składowej takiego obiektu, ponieważ potencjalnie mogli by coś popsuć, przez co nasze dzieło przestało by prawidłowo działać.

Tu właśnie pojawia się pojęcie hermetyzacji, która polega na odpowiednim ukrywaniu pewnych składowych przed zewnętrznym środowiskiem. Nasz obiekt może z nich korzystać, natomiast zewnętrzne środowisko może używać tylko rzeczy, które my mu świadomie udostępnimy.

Prywatne i publiczne

W programowaniu zorientowanym obiektowo metody i właściwości możemy podzielić na dwie grupy:

  • prywatne - mają do nich dostęp tylko metody danego obiektu

  • publiczne - mają do nich dostęp metody danego obiektu, ale i zewnętrzne środowisko

W niektórych językach do takiej klasyfikacji używa się słów kluczowych private i public. Poniżej zamieszczam zapożyczony z Wikipediiarrow-up-right przykład klasy z Java:

Widzisz modyfikatory public i private? To właśnie tymi słowami określamy która metoda i właściwość ma być prywatna, a która publiczna. W niektórych językach pojawia się też słowo protected, ale nie będę się tutaj na nim skupiał.

Hermetyzacja w Javascript

Do zabezpieczania swojego kodu możemy w Javascript podejść na kilka sposobów.

I teraz gdy utworzysz przykładową klasę:

domyślnie wszystkie jej metody i właściwości będą publiczne. Oznacza to, że w każdej chwili mogę w obiekcie tworzonym na jej bazie wszystko zmieniać.

Prywatne właściwości i metody w nowym Javascript

Od kilku lat Javascript mocno ewoluuje, a programiści coraz częściej za jego pomocą tworzą pokaźne aplikacje. Dlatego chcąc nie chcąc środowisko to musiało zaproponować oficjalne rozwiązania.

W najnowszych wersjach języka możemy już tworzyć w klasach metody i właściwości prywatne. Wystarczy, że poprzedzimy je znakiem #:

Hermetyzacja przez moduły

Kolejnym sposobem zabezpieczania naszego kodu jest stosowanie modułów. W każdym takim module wyznaczamy rzeczy, które zostaną wystawione poza dany plik. Dzięki temu inne pliki mają dostęp do rzeczy z danego pliku, które wystawiliśmy, natomiast nie mają dostępu do całej reszty kodu, który nie został przez nas wystawiony. Możemy to wykorzystać w naszym przypadku wyrzucając metody klasy poza jej ciało, dzięki czemu będzie miała do nich dostęp tylko nasza klasa, natomiast reszta plików zobaczy tylko klasę, którą właśnie wystawiliśmy.

Oznaczanie prywatnych właściwości

W starszych wersjach Javascript podziału na prywatne i publiczne właściwości nie było. Jednym ze sposobów rozwiązania tego zaganienia było poprzedzanie nazwy prywatnej składowej znakiem podłogi:

Konwencja ta nie tyczy się tylko klas, a o wiele częściej stosowana jest przy tworzeniu pojedynczych obiektów.

Dzięki niej osoba używająca naszego kodu będzie wiedziała, że danej składowej nie powinna ruszać spoza obiektu.

Konwencja ta nie zabezpiecza nam kodu, a tylko daje wskazówkę dla innych programistów. Podobnych konwencji mamy w Javascript kilka - nazwy konstruktorów czy klas piszemy z dużej litery, niektórzy programiści piszą nazwy stałych dużymi literami, pierwsze parametry funkcji w Node są miejscem na błędy, nadużywamy klas w html, bo nie umiemy css itp.

Zabezpieczanie przez zakresy zagnieżdżone

Kolejnym sposobem, który możesz spotkać w internecie to stosowanie zakresów zagnieżdżonych. Pamiętaj, że funkcje i zakresy zagnieżdżone mają dostęp do "rzeczy na zewnątrz", natomiast zewnętrzne środowisko nie ma dostępu do tego co jest wewnątrz danego zakresu/funkcji.

Przykład takiego podejścia pokazuje poniższy przykład. Jest to "klasyczne" zastosowanie wzorca modułu:

Last updated