Today () jest nieczystą funkcją, ponieważ jej wynik zależy od czegoś, czego jej nie dajesz; konkretnie aktualny czas systemowy. Dlatego jego wynik nie jest deterministyczny, jeśli opiera się wyłącznie na danych wejściowych dostarczonych podczas wywołania.
Byłaby to czysta funkcja int Add(int a, int b) {return a + b;}
. Funkcja działa wyłącznie z tym, co została podana, i nie wykorzystuje innych danych o stanie zewnętrznym. Naturalnym rezultatem tego jest to, że możesz Add(2,2)
zdobyć 4 od teraz do końca czasu. Ponadto, ponieważ funkcja nie zmienia żadnego stanu zewnętrznego (nie ma „skutków ubocznych”), dodawanie (2) i 2 od teraz aż do końca czasu nie zmieni niczego innego w systemie, chyba że wtedy przypisz wynik funkcji do zmiennej lub w inny sposób użyj wartości do aktualizacji stanu (co nie jest operacją wykonywaną przez samą funkcję). Praktycznie wszystkie klasyczne operacje matematyczne są czystymi funkcjami i mogą być jako takie realizowane.
Z drugiej strony Today () może wygenerować tę samą wartość, gdy zostanie wywołany dwa razy z rzędu, ale nie, jeśli zostanie wywołany wielokrotnie przez kilka dni. Wynika to z faktu, że jest on zależny od danych o stanie zewnętrznym, które nie są dostarczane przez Ciebie jako parametr funkcji. W rezultacie niemożliwe jest kontrolowanie wyniku funkcji Today () w granicach programu. Będzie generować określoną wartość w danym dniu i nigdy nie wytworzy tej wartości w żadnym innym dniu, chyba że zmienisz zegar systemowy komputera, na którym jest on uruchomiony (zmiana zwykle występuje poza granicami programu).
Zanieczyszczona funkcja niekoniecznie jest złą rzeczą; nieczyste funkcje są wymagane, nawet w językach funkcjonalnych, do interakcji z czymkolwiek poza granicami programu, takimi jak magazyny danych, potoki komunikacyjne, wyświetlacze interfejsu użytkownika, urządzenia peryferyjne itp. Program, który nie wykonuje żadnej z tych czynności, jest programem jest to znacznie ograniczone pod względem użyteczności; Posunąłbym się nawet do tego, że nazwałbym taki program trywialnym, ponieważ bez jakiegokolwiek sposobu akceptacji danych wejściowych lub jakiejkolwiek drogi do poinformowania cię o jego wyniku, równie dobrze mógłby nic nie robić. Programy napisane w językach funkcjonalnych mogą mieć tylko dane wejściowe dostarczone przez środowisko wykonawcze i generować dane wyjściowe zgłaszane do środowiska wykonawczego bez żadnych wyraźnie zdefiniowanych nieczystych metod, ale dzieje się tak, ponieważ środowisko wykonawcze wyodrębnia wszystkie te nieczyste szczegóły pracy w niedoskonałym systemie komputerowym,
Po prostu Bardzo Dobrą Rzeczą jest wiedzieć, które z funkcji, których używasz, są czyste, a które nie, abyś mógł podejmować trafne decyzje dotyczące ich użycia. Zanieczyszczone funkcje, ponieważ robią rzeczy lub są zależne od rzeczy, które nie są oczywiste z ich użycia, mogą zachowywać się nieprzewidywalnie, biorąc pod uwagę tylko wiedzę o użytkowaniu. Konieczna jest dalsza znajomość celu funkcji, a tym samym tego, czego potrzebuje od stanu zewnętrznego lub do czego służy, aby ustawić system, który używa go w spójnym stanie, a tym samym oczekiwać wyniku deterministycznego.