W rzeczywistości kod OO jest znacznie mniej przydatny do ponownego wykorzystania, i to już z założenia. Ideą OOP jest ograniczenie operacji na określonych fragmentach danych do określonego uprzywilejowanego kodu, który znajduje się w klasie lub w odpowiednim miejscu w hierarchii dziedziczenia. Ogranicza to niekorzystne skutki zmienności. Jeśli zmienia się struktura danych, w kodzie jest tylko tyle miejsc, które mogą być odpowiedzialne.
Dzięki niezmienności nie obchodzi Cię, kto może operować na dowolnej strukturze danych, ponieważ nikt nie może zmienić twojej kopii danych. To znacznie ułatwia tworzenie nowych funkcji do pracy na istniejących strukturach danych. Po prostu tworzysz funkcje i grupujesz je w moduły, które wydają się odpowiednie z punktu widzenia domeny. Nie musisz się martwić, gdzie zmieścisz je w hierarchii dziedziczenia.
Innym rodzajem ponownego wykorzystania kodu jest tworzenie nowych struktur danych do pracy na istniejących funkcjach. Jest to obsługiwane w językach funkcjonalnych przy użyciu funkcji takich jak generics i klasy typów. Na przykład klasa typu Ord Haskella pozwala na użycie sortfunkcji na dowolnym typie z Ordinstancją. Instancje można łatwo utworzyć, jeśli jeszcze nie istnieją.
Weź Animalprzykład i rozważ wdrożenie funkcji karmienia. Prostą implementacją OOP jest utrzymanie kolekcji Animalobiektów i przechodzenie przez wszystkie z nich, wywołując feedmetodę na każdym z nich.
Jednak sprawy stają się trudne, gdy dochodzisz do szczegółów. AnimalObiekt naturalnie wie, jaki rodzaj pokarmu zjada, i ile potrzebuje, aby czuć się pełna. To nie nie naturalnie wiedzieć, gdzie jedzenie jest przechowywane i ile jest dostępny, a więc FoodStoreobiekt stał się właśnie zależność od każdego Animal, zarówno jako pole do Animalobiektu, lub przekazywana jako parametr feedmetody. Alternatywnie, aby zachować Animalspójność klasy, możesz przejść feed(animal)do FoodStoreobiektu lub stworzyć obrzydliwość klasy zwanej taką AnimalFeederlub inną .
W FP nie ma skłonności do tego, aby pola Animalzawsze pozostawały zgrupowane razem, co ma pewne interesujące implikacje dla ponownego użycia. Załóżmy, że masz listę Animalrekordów, z pola podoba name, species, location, food type, food amount, itd. Masz również listę FoodStorerekordów z dziedzin takich jak location, food typei food amount.
Pierwszym krokiem w żywieniu może być mapowanie każdej z tych list rekordów na listy (food amount, food type)par z liczbami ujemnymi dla ilości zwierząt. Następnie możesz tworzyć funkcje do robienia różnego rodzaju rzeczy za pomocą tych par, takich jak sumowanie ilości każdego rodzaju żywności. Funkcje te nie należą idealnie ani Animaldo FoodStoremodułu, ani do jednego , ale można z nich wielokrotnie korzystać.
W efekcie powstaje mnóstwo funkcji, które robią użyteczne rzeczy, [(Num A, Eq B)]które są wielokrotnego użytku i modułowe, ale masz problem z ustaleniem, gdzie je umieścić lub jak nazwać je jako grupę. W rezultacie moduły FP są trudniejsze do sklasyfikowania, ale klasyfikacja jest znacznie mniej ważna.