[EDIT] Albo inaczej. Co Was przekonało do pisania czystych funkcji?
Wszystko sprowadza się do tego, czy potrafisz udowodnić, jak wygląda wejście dla funkcji, bo to pozwala na dowodzenie bądź obalanie hipotez i prostsze wnioskowanie o działaniu kodu. Czyste funkcje mają małe pole rażenia, bo zależą tylko od parametrów na wejściu, bo czysta funkcja ma wejście I (input) oraz wyjście O (output). Funkcja nieczysta ma wejście (I, S), gdzie S to stan aplikacji, potencjalnie globalny, i wyjście O. Obie funkcje dają zawsze takie samo wyjście dla tego samego wejścia, ale różnica jest w tym, że dla czystej funkcji wejściem jest jedynie I, a dla funkcji nieczystej jest to (I, S).
Teraz pytanie, co ten S właściwie zmienia? Można go przecież traktować, jako niejawnie przekazywany parametr "stan aplikacji" czy coś w tym rodzaju i z tego punktu widzenia wszystkie funkcje są czyste, bo prostu te "czyste czyste" przyjmują (I, zbiór pusty), a te "nieczyste czyste" przyjmują (I, S). Ale to zmienia bardzo dużo, bo o ile dla ustalenia I (czyli udowodnienia jakichś hipotez lub założeń) potrzebujemy zazwyczaj przeanalizować jedynie miejsce wywołania funkcji, o tyle ustalenie S jest potencjalnie o wiele trudniejsze. A to z tego względu, że o I możemy wnioskować liniowo, czyli najpierw w miejscu wywołania funkcji, potem w miejscu wywołania poprzedniej funkcji i tak dalej, przez cały stos wykonania, ale nie możemy tego samego zrobić z S, bo ten może być zmieniony zarówno przez obecną funkcję, jak i przez całą poprzednią historię wykonania. Mówiąc prościej: żeby udowodnić, że I jest takie i takie, wystarczy zazwyczaj pokazać, jak to I zostało ustawione (czyli wystarczy "przykład na dowód tezy"). Ale żeby udowodnić, że S jest takie i takie, to zazwyczaj muszę nie tylko pokazać, jak S zostało ustawione, ale też wykazać, że żadne miejsce w kodzie mi tego S nie zmieniło - czyli muszę pokazać, że nie istnieje żaden kontrargument. To może być o wiele trudniejsze, bo muszę przeanalizować o wiele więcej kodu (bo wiele funkcji ma dostęp do tego samego stanu), bo mogę nie wiedzieć, jak S jest zmieniane (czy "po ludzku", czy refleksją, czy hakami na pamięci), bo mogę nawet nie mieć dostępu do całego kodu, żeby to udowodnić (bo na przykład stan jest modyfikowany przez dynamicznie ładowaną wtyczkę, której nie posiadam).
Jeżeli potrafię trzymać w ryzach rozmiary I oraz S, to cała reszta jest już kwestią gustu i nie ma mierzalnej przewagi funkcji czystej nad nieczystą. Odpowiadając na Twoje pytanie — nie jestem przekonany do pisania tylko czystych funkcji, ale jestem przekonany, że wolę tak limitować I oraz S, żeby móc łatwo o funkcji wnioskować. Tu oczywiście do gry wchodzą umiejętności kognitywistyczne, doświadczenie i biegłość w programowaniu — dla jednej funkcji (i jednego programisty) trzy parametry wejściowe będą zbrodnią, dla innej funkcji (lub innego programisty) pięć zmiennych globalnych nie będzie żadnym problemem.
Dygresja: tak właściwie, to wszystkie funkcje przyjmują jeszcze parametr E, czyli środowisko wykonywania, rodzaj sprzętu, wypełnienie pamięci, a nawet promieniowanie kosmiczne czy elektromagnetyczne otoczenia (które chociażby zmieniło wynik wyborów w Szwajcarii). Różnica między S a E jest taka, że S kontrolujemy wewnątrz aplikacji, a E zazwyczaj nie kontrolujemy wcale, bo o ile jeszcze możemy pośrednio wpłynąć na ilość pamięci w komputerze, o tyle zakłóceń w zasilaczu już wcale nie zmienimy, za to one mogą zmienić naszą aplikację.
S4tnieczyste funkcje.
:)S4t