środa, 30 grudnia 2015

Widocznośc zmiennych w JS

Taka moja mała dygresja ​dotycząca utrzymywania porządku w kodzie, która nasunęła mi się po kilku dniach programowania w Angularze, ale aplikuje się w sumie do wszystkiego.

Na początku każdego projektu jest spoko, kod jest mały i wszystko łatwo ogarnąć. Problemy zaczynają się, gdy kod zaczyna się rozrastać, zmiennych jest coraz więcej, a nam coraz trudniej połapać się o co we wszystkim chodzi.
W szczególności, gdy piszemy wszystko w jednym pliku, musimy pamiętać wszystkie zależności (a jest ich kwadratowo wiele, tak jak liczba wszystkich uścisków dłoni, także błędów też jest kwadratowo wiele)

Żeby wszystkiemu zaradzić i nie pogubić się, przychodzi na ratunek enkapsulacja. Z wikipedi: "Enkapsulacja(Hemrmetyzacja) polega na ukrywaniu pewnych danych składowych lub metod obiektów danej klasy tak, aby były one dostępne tylko metodom wewnętrznym danej klasy"
Co to więc dla nas znaczy? ​Naszym celem jest to, żeby moduły były ze sobą luźno powiązane.To znaczy, że każdy z komponentów jest zależny od jak najmniejszej liczby innych elementów. Dzięki temu możemy łatwo podmieniać elementy i łatwo je testować. Np. gdy mamy backend i frontend, to chcemy w tylko jednym miejscu opisać jak te dwa elementy są ze sobą połączone. Po co? A po to żeby móc rozwijać te dwie rzeczy osobno, niezależnie od siebie. Mowa oczywiście o testowaniu.

Ale wróćmy do naszej ​*enkapsulacji*​, na której chciałbym się skupić. Dawniej, myśląc o tym, miałem przed oczami private i public w Javie, które ograniczają widoczność zmiennych na inne obiekty, ale to nie do końca jest najważniejsze. Enkapsulacja to jak dla mnie praktyka, którą powinniśmy się kierować pisząc kod. W każdym momencie powinniśmy zwracać uwagę na to kto ma dostęp do zmiennych/metod, które właśnie napisaliśmy. Jeśli w danym momencie, nasza zmienna opisująca adres serwera, jest dostępna w widoku głównym, to znaczy że robimy to źle. Zmienne powinny być widoczne tylko na takim poziomie na jakim jest to konieczne i nie możemy tego rozszerzać http://pastebin.com/FUbtkiqQ

Czemu to jest zrobione źle? ​Bo na głównym scopie, funkcja `cokolwiek` jest na tym samym poziomie abstrakcji co`ServerIP`, a to nie prawda Prawidłowo powinno być: ​http://pastebin.com/LaeLCPyY

Także podsumowując mój (bez)sensowny wywód - jak deklarujemy nowe funkcje/zmienne, zawsze róbmy to na jak najniższym poziomie, tak żeby jak najmniej innych elementów na danym poziomie widziało to co napisaliśmy. W ten sposób nasze funkcje będą małe, a my będziemy skupiali się na tym, że nasz kod to zlepek luźno powiązanych klocków, które można łatwo podmieniać.




Brak komentarzy:

Prześlij komentarz