Zaletą jest to, że czyste funkcje ułatwiają zrozumienie kodu. Innymi słowy, skutki uboczne zwiększają złożoność kodu.
Weź przykład computeProductPricemetody.
Czysta metoda poprosiłaby cię o ilość produktu, walutę itp. Wiesz, że ilekroć metoda jest wywoływana z tymi samymi argumentami, zawsze da ten sam wynik.
- Możesz go nawet buforować i używać wersji z pamięci podręcznej.
- Możesz sprawić, by był leniwy i odłożył wywołanie, kiedy naprawdę go potrzebujesz, wiedząc, że wartość nie zmieni się w międzyczasie.
- Możesz wywołać tę metodę wiele razy, wiedząc, że nie będzie ona miała skutków ubocznych.
- Możesz rozumować samą metodę w izolacji od świata, wiedząc, że wszystko, czego potrzebuje, to argumenty.
Nieoczyszczona metoda będzie bardziej złożona w użyciu i debugowaniu. Ponieważ zależy to od stanu zmiennych innych niż argumenty i ewentualnie ich zmiany, oznacza to, że może wywoływać różne wyniki, gdy jest wywoływany wiele razy, lub nie może zachowywać się tak samo, gdy w ogóle nie jest wywoływany lub wywoływany zbyt wcześnie lub za późno.
Przykład
Wyobraź sobie, że w ramach jest metoda, która analizuje liczbę:
decimal math.parse(string t)
Nie ma przezroczystości referencyjnej, ponieważ zależy od:
Zmienna środowiskowa określająca system numeracji, czyli Base 10 lub coś innego.
Zmienna w mathbibliotece, która określa dokładność analizowanych liczb. Więc z wartością 1parsowania łańcucha "12.3456"da 12.3.
Kultura, która określa oczekiwane formatowanie. Na przykład, z fr-FR, parsowanie "12.345"da 12345, ponieważ znak separacji powinien być ,, nie.
Wyobraź sobie, jak łatwa lub trudna byłaby praca z taką metodą. Przy tym samym wejściu możesz uzyskać radykalnie różne wyniki w zależności od momentu wywołania metody, ponieważ coś gdzieś zmieniło zmienną środowiskową lub zmieniło kulturę lub ustawiało inną precyzję. Niedeterministyczny charakter metody prowadziłby do większej liczby błędów i koszmaru debugowania. Wywoływanie math.parse("12345")i uzyskiwanie 5349jako odpowiedź, ponieważ jakiś równoległy kod analizował liczby ósemkowe, nie jest przyjemny.
Jak naprawić tę oczywiście zepsutą metodę? Wprowadzając przejrzystość referencyjną. Innymi słowy, pozbywając się stanu globalnego i przenosząc wszystko do parametrów metody:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Teraz, gdy metoda jest czysta, wiesz, że bez względu na to, kiedy wywołasz metodę, zawsze będzie generować ten sam wynik dla tych samych argumentów.