Trên thực tế, mã OO ít tái sử dụng hơn và đó là do thiết kế. Ý tưởng đằng sau OOP là hạn chế các hoạt động trên các phần dữ liệu cụ thể đối với một mã đặc quyền nhất định trong lớp hoặc ở vị trí thích hợp trong hệ thống phân cấp thừa kế. Điều này hạn chế các tác động bất lợi của tính đột biến. Nếu cấu trúc dữ liệu thay đổi, chỉ có rất nhiều vị trí trong mã có thể chịu trách nhiệm.
Với tính không thay đổi, bạn không quan tâm ai có thể vận hành trên bất kỳ cấu trúc dữ liệu cụ thể nào, bởi vì không ai có thể thay đổi bản sao dữ liệu của bạn. Điều này làm cho việc tạo các chức năng mới để làm việc trên các cấu trúc dữ liệu hiện có dễ dàng hơn nhiều. Bạn chỉ cần tạo các hàm và nhóm chúng thành các mô-đun có vẻ phù hợp theo quan điểm tên miền. Bạn không phải lo lắng về nơi phù hợp với chúng trong hệ thống phân cấp thừa kế.
Một loại tái sử dụng mã khác là tạo các cấu trúc dữ liệu mới để hoạt động trên các hàm hiện có. Điều này được xử lý trong các ngôn ngữ chức năng bằng cách sử dụng các tính năng như chung chung và các lớp loại. Ví dụ, lớp loại Ord của Haskell cho phép bạn sử dụng sort
hàm trên bất kỳ loại nào với một Ord
thể hiện. Trường hợp dễ tạo ra nếu chúng chưa tồn tại.
Lấy Animal
ví dụ của bạn và xem xét thực hiện một tính năng cho ăn. Việc thực hiện OOP đơn giản là duy trì một tập hợp các Animal
đối tượng và lặp qua tất cả chúng, gọi feed
phương thức trên mỗi đối tượng.
Tuy nhiên, mọi thứ trở nên khó khăn khi bạn đi vào chi tiết. Một Animal
đối tượng tự nhiên biết loại thức ăn nào nó ăn, và nó cần bao nhiêu để cảm thấy no. Nó không tự nhiên biết thực phẩm được giữ ở đâu và có sẵn bao nhiêu, vì vậy một FoodStore
đối tượng đã trở thành một sự phụ thuộc của mọi người Animal
, như là một trường của Animal
đối tượng, hoặc được truyền vào như một tham số của feed
phương thức. Thay phiên, để giữ cho Animal
lớp gắn kết hơn, bạn có thể di chuyển feed(animal)
đến FoodStore
đối tượng hoặc bạn có thể tạo ra một sự ghê tởm của một lớp được gọi là một AnimalFeeder
hoặc một số như vậy.
Trong FP, không có xu hướng cho các lĩnh vực của một Animal
luôn luôn được nhóm lại với nhau, điều này có một số ý nghĩa thú vị cho việc tái sử dụng. Giả sử bạn có một danh sách các Animal
hồ sơ, với các lĩnh vực như name
, species
, location
, food type
, food amount
, vv Bạn cũng có một danh sách các FoodStore
hồ sơ với các lĩnh vực như location
, food type
, và food amount
.
Bước đầu tiên trong việc cho ăn có thể là ánh xạ từng danh sách các bản ghi đó vào danh sách các (food amount, food type)
cặp, với số âm cho số lượng của động vật. Sau đó, bạn có thể tạo các hàm để thực hiện tất cả các loại với các cặp này, như tổng số lượng của từng loại thực phẩm. Các chức năng này không hoàn toàn thuộc về một Animal
hoặc một FoodStore
mô-đun, nhưng cả hai đều có thể tái sử dụng cao.
Bạn kết thúc với một loạt các chức năng làm những thứ hữu ích với [(Num A, Eq B)]
khả năng tái sử dụng và mô đun, nhưng bạn gặp khó khăn trong việc tìm ra nơi để đặt chúng hoặc những gì để gọi chúng là một nhóm. Hiệu quả là các mô-đun FP khó phân loại hơn, nhưng việc phân loại ít quan trọng hơn nhiều.