Zaletą jest to, że czyste funkcje ułatwiają zrozumienie kodu. Innymi słowy, skutki uboczne zwiększają złożoność kodu.
Weź przykład computeProductPrice
metody.
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 math
bibliotece, która określa dokładność analizowanych liczb. Więc z wartością 1
parsowania ł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 5349
jako 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.