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 sort
funkcji na dowolnym typie z Ord
instancją. Instancje można łatwo utworzyć, jeśli jeszcze nie istnieją.
Weź Animal
przykład i rozważ wdrożenie funkcji karmienia. Prostą implementacją OOP jest utrzymanie kolekcji Animal
obiektów i przechodzenie przez wszystkie z nich, wywołując feed
metodę na każdym z nich.
Jednak sprawy stają się trudne, gdy dochodzisz do szczegółów. Animal
Obiekt 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 FoodStore
obiekt stał się właśnie zależność od każdego Animal
, zarówno jako pole do Animal
obiektu, lub przekazywana jako parametr feed
metody. Alternatywnie, aby zachować Animal
spójność klasy, możesz przejść feed(animal)
do FoodStore
obiektu lub stworzyć obrzydliwość klasy zwanej taką AnimalFeeder
lub inną .
W FP nie ma skłonności do tego, aby pola Animal
zawsze pozostawały zgrupowane razem, co ma pewne interesujące implikacje dla ponownego użycia. Załóżmy, że masz listę Animal
rekordów, z pola podoba name
, species
, location
, food type
, food amount
, itd. Masz również listę FoodStore
rekordów z dziedzin takich jak location
, food type
i 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 Animal
do FoodStore
moduł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.