Tak, FP można stosować w aplikacjach korporacyjnych. Clojure jest jednym z przykładów języka FP z sukcesem w przedsiębiorstwie: http://cognitect.com/clojure#successstories
Reprezentowanie stanu może być wyzwaniem w FP, a zmiana paradygmatów w celu dopasowania FP może być trochę zniekształceniem umysłu. Niektóre języki FP całkowicie wykluczają działania niepożądane i stan mutacji. Clojure pozwala na oba, ale zniechęca lub izoluje te paradygmaty.
Krótko mówiąc, reprezentacja stanu może być bardzo podobna do OO. To modyfikacja stanu jest zupełnie inna. Na przykład w stanie FP mogą być reprezentowane przez listy i mapy. Lista pracowników może wyglądać następująco:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Znam dwa sposoby radzenia sobie ze zmianą stanu w FP. Jednym z nich jest funkcjonalne programowanie reaktywne. W tym paradygmacie wszystkie stany są obsługiwane tylko na najwyższym poziomie ... na przykład widok HTML aplikacji ma stan w widoku (np. Imię i nazwisko osoby, adres itp.). Teraz, kiedy klikniesz „aktualizuj nazwę”, wywoływana jest funkcja, która obsługuje wszystkie czynności związane z aktualizacją nazwy oprócz faktycznej zmiany nazwy. To może zabrzmieć dziwnie ... ale trzymaj się mnie. Zmieniona nazwa zostanie następnie zwrócona przez funkcję, a widok (lub trwały magazyn danych itp.) Pokaże nową nazwę. Lub alternatywnie zostanie zwrócona cała nowa struktura ze zaktualizowaną nazwą. Czym więc jest ta funkcja? Sprawdza poprawność nazwy i zwraca nową nazwę, jeśli jest poprawna, błąd, jeśli nie jest, i ewentualnie nowy link do widoku lub nawigacji. W przypadku czegoś bardziej złożonego niż zmiana nazwy może to zrobić znacznie więcej.
Tak więc dla FRP obiekt zwrócony przez funkcję jest nowym stanem i może być przekazany bezpośrednio do widoku lub cokolwiek na wysokim poziomie. W niektórych przypadkach FRP przejmuje cały stan, przekazuje go do funkcji i odzyskuje cały stan.
W tym paradygmacie kontener lub środowisko musi obsługiwać aktualizację wyświetlacza, bazy danych lub cokolwiek innego wymagającego aktualizacji z nowego stanu. Możesz więc wyobrazić sobie strukturę, która rysuje aplikację na ekranie. Gdy użytkownik kliknie, wywoływane są funkcje i zwracany jest nowy stan. Struktura następnie aktualizuje ekran, przerysowując wszystko lub inteligentnie przerysowując części wyświetlacza. Zobacz http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/
Clojure wykorzystuje drugi paradygmat, z którym się zetknąłem, a mianowicie izolowanie zmian stanu, ale niekoniecznie ograniczanie ich do najwyższego poziomu. W Clojure wszystkie zmienne stany muszą być „wstrzymane” (chyba że używasz obiektów Java dla stanu) przez atom, agenta lub referencję. Sposób, w jaki to działa, to obiekt trzymany, wskazywany lub do którego odwołuje się (jakkolwiek chcesz to nazwać) atom / agent / ref jest niezmienny, ale atom / agent / ref może zmienić się, wskazując nowy obiekt. W tym przypadku używasz specjalnych metod dla atomu / agenta / ref, które mówią „zaktualizuj obiekt tutaj, wykonując takie a takie i ponownie przypisując atom / agent / ref do nowego obiektu”.
Dlaczego warto zadać pytanie? Ponieważ niezmienny obiekt, do którego odwołują się te konstrukcje Clojure, może zostać przekazany do funkcji, która coś robi, a podczas działania tej funkcji jego odwołanie do obiektu jest gwarantowane, że się nie zmieni. Oznacza to, że atom / agent / ref nie jest przekazywany do funkcji, ale przekazywany przez nich niezmienny obiekt. Atomy, agenci i referencje mają specjalne właściwości, które obsługują aktualizacje i współbieżność w bezpieczny sposób i stanowią część języka. Zobacz http://clojure.org/state
Mam nadzieję, że to pomoże. Proponuję przeczytać więcej o stanie Clojure i FRP, aby lepiej zrozumieć, w jaki sposób pracownicy i osoby mogą być reprezentowane w FP. Chociaż rzeczywista reprezentacja byłaby podobna do programowania obiektowego ... to zmienność jest naprawdę inna.