Praca z czystymi funkcjami może być o wiele mniej stresująca, ponieważ można je łatwo przetestować i uzasadnić z większą pewnością.
Czyste funkcje to funkcje, które nie powodują skutków ubocznych i wywołane z tymi samymi parametrami wejściowymi zawsze zwracają ten sam wynik.
Możesz używać czystych funkcji, aby upewnić się, że Twój kod jest czysty, łatwy w utrzymaniu i testowalny. Funkcje te są idealne do tych zadań, ponieważ są przewidywalne i nie modyfikują stanów zewnętrznych.
Są również łatwiejsze do debugowania, co czyni je pomocnymi w opracowywaniu złożonych systemów oprogramowania. Tutaj poznasz czyste funkcje w JavaScript, ich cechy i zalety.
Charakterystyka funkcji czystej
Dla funkcja aby być „czystym”, musi spełniać kilka wymagań.
Stała wartość zwrotu
Czysta funkcja powinna zawsze zwracać tę samą wartość przy tych samych danych wejściowych, niezależnie od tego, ile razy została wywołana.
Rozważmy na przykład poniższą funkcję:
funkcjonowaćzwielokrotniać(a, b) {
powrót a * b;
}
The zwielokrotniać
funkcja w powyższym przykładzie zawsze zwróci iloczyn swoich dwóch argumentów. Biorąc pod uwagę ten sam zestaw argumentów, ma stałą wartość zwracaną.Wielokrotne wywołanie tej funkcji z tymi samymi argumentami da za każdym razem ten sam wynik. Na przykład:
zwielokrotniać(2, 3); // zwraca 6
zwielokrotniać(2, 3); // zwraca 6
zwielokrotniać(2, 3); // zwraca 6
Ewentualnie rozważ poniższy przykład:
funkcjonowaćpomnóżLosowąLiczbę(liczba) {
powrót liczba * Matematyka.podłoga(Matematyka.losowy() * 10);
}
pomnóżLosowąLiczbę(5); // Nieprzewidywalne wyniki
pomnóżLosowąLiczbę(5); // Nieprzewidywalne wyniki
pomnóżLosowąLiczbę(5); // Nieprzewidywalne wyniki
The pomnóżLosowąLiczbę powyższa funkcja zwróci różne wyniki za każdym razem, gdy ją wywołasz, co czyni ją nieczystą. Wyniki tej funkcji są nieprzewidywalne, więc testowanie komponentów, które na niej polegają, jest trudne.
Bez skutków ubocznych
Czysta funkcja nie może powodować żadnych skutków ubocznych. Efekt uboczny odnosi się do wszelkich modyfikacji stanu lub zachowania poza zakresem funkcji, takich jak modyfikacja zmiennych globalnych, danych wyjściowych konsoli, żądań sieciowych lub manipulacja DOM.
Kiedy czysta funkcja ma efekt uboczny, to już nie jest czysta, ponieważ wpływa na stan zewnętrzny i narusza zasadę braku obserwowalnych skutków ubocznych. Dlatego czyste funkcje unikają skutków ubocznych, aby zapewnić, że nie zmieniają stanu programu.
Rozważmy na przykład poniższy przykład:
pozwalać liczyć = 0;
funkcjonowaćprzyrost() {
liczyć++;
konsola.log (liczba);
}
przyrost(); // Dzienniki 1
przyrost(); // Dzienniki 2
przyrost(); // Dzienniki 3
The przyrost funkcja w tym przykładzie ma efekt uboczny modyfikacji liczyć zmienna poza swoim zakresem. Loguje się również do konsoli.
Ta funkcja nie jest czysta, ponieważ ma efekt uboczny, który może utrudnić przewidywanie jej danych wyjściowych i testowanie w izolacji. Aby uczynić go czystym, możesz go zmodyfikować, aby przyjąć liczyć zmienną jako argument i zwraca zwiększoną wartość bez modyfikowania jakiegokolwiek stanu zewnętrznego.
jak tak:
funkcjonowaćprzyrost(liczyć) {
powrót liczyć + 1;
}
przyrost(1); // zwraca 2
przyrost(1); // zwraca 2
przyrost(1); // zwraca 2
Wersja przyrost funkcja w powyższym przykładzie nie ma skutków ubocznych, ponieważ nie modyfikuje żadnej zmiennej zewnętrznej ani nie rejestruje żadnej wartości. Dodatkowo, bez względu na to, ile razy ją wywołasz, zwraca ona tę samą wartość dla tego samego wejścia. Jest to więc funkcja czysta.
Inne cechy
Oprócz posiadania stałej wartości zwrotu i braku skutków ubocznych, powinieneś przestrzegać następujących zasad, kiedy to robisz tworzenie funkcji JavaScript że chcesz być czysty:
- Twoja funkcja nie może modyfikować żadnego ze swoich argumentów. Zamiast tego, jeśli jakakolwiek operacja wymaga mutacji, utwórz kopię argumentu i zmutuj kopię.
- Twoja funkcja musi zawsze mieć wartość zwracaną. Jeśli twoja funkcja nie ma wartości zwracanej ani żadnych skutków ubocznych, nie może nic zrobić!
- Twoja funkcja nie może zależeć od żadnego stanu zewnętrznego.
Zalety czystych funkcji
Czyste funkcje mają pewne zalety w porównaniu z funkcjami nieczystymi, z których niektóre obejmują następujące.
Testowalność
Czyste funkcje są łatwe do przetestowania, ponieważ ich zachowanie wejścia/wyjścia jest dobrze zdefiniowane. Ponadto czyste funkcje nie zależą od stanu zewnętrznego ani skutków ubocznych. Dlatego możesz je testować w izolacji, nie martwiąc się o jakiekolwiek zależności lub interakcje z innymi częściami programu.
W przeciwieństwie do tego testowanie nieczystych funkcji, które zależą od stanu zewnętrznego lub wywołują efekty uboczne, może być trudniejsze, ponieważ ich zachowanie może zależeć od stanu programu lub innych czynników zewnętrznych. Może to utrudnić tworzenie kompleksowych przypadków testowych i zapewnić prawidłowe działanie funkcji we wszystkich scenariuszach.
Zapamiętywanie
Ponieważ czyste funkcje zawsze dają takie same dane wyjściowe dla tych samych danych wejściowych i nie powodują żadnych skutków ubocznych, można je łatwo zapamiętać.
Opierając się na tych właściwościach i używając zapamiętywania, możesz buforować wynik czystego wywołania funkcji dla określonego wejścia. Twoja funkcja może następnie zwrócić wynik z pamięci podręcznej przy następnym wywołaniu z tym samym wejściem.
Zapamiętywanie czystych funkcji może poprawić wydajność programu, zwłaszcza w przypadku kosztownych obliczeń, które wielokrotnie dotyczą tych samych danych wejściowych, bez martwienia się o ingerencję w stan programu.
W przeciwieństwie do tego, funkcje nieczyste mogą dawać różne wyniki dla tego samego wejścia, w zależności od stanu programu lub czynników zewnętrznych. To sprawia, że trudno je zapamiętać, ponieważ wynik w pamięci podręcznej może już nie być prawidłowy, jeśli zależności funkcji lub stan zewnętrzny zmieniają się między wywołaniami.
Konkurencja
Ponieważ funkcje czyste nie modyfikują żadnego stanu zewnętrznego ani nie powodują żadnych skutków ubocznych, są bezpieczne dla wątków. Możesz uruchamiać je jednocześnie, nie martwiąc się o warunki wyścigu lub problemy z synchronizacją.
W przeciwieństwie do tego, nieczyste funkcje mogą być trudne do wykonania współbieżnie, ponieważ mogą kolidować ze sobą lub powodować nieoczekiwane zachowanie, gdy są wykonywane równolegle. Na przykład, jeśli dwa wątki uzyskują dostęp do tej samej zmiennej globalnej i modyfikują ją, mogą wzajemnie nadpisywać zmiany lub dawać niespójne wyniki.
Czyste funkcje vs. Nieczyste funkcje
Możesz pisać programy, używając kombinacji funkcji czystych i nieczystych, ponieważ każdy typ ma swoje zastosowania.
Czyste funkcje można łatwo optymalizować, testować i łączyć równolegle, dzięki czemu nadają się do takich zastosowań, jak programowanie funkcjonalne, buforowanie, testowanie, programowanie równoległe i zadania przetwarzania danych.
Jednak nieczyste funkcje stanowią wyzwanie w testowaniu i współbieżności, ale są pomocne podczas pracy ze zmiennymi strukturami danych lub interakcji z zewnętrznymi systemami i zasobami.