Sebenarnya, kode OO jauh lebih tidak dapat digunakan kembali, dan itu adalah desain. Gagasan di balik OOP adalah untuk membatasi operasi pada potongan data tertentu ke kode istimewa tertentu yang ada di kelas atau di tempat yang sesuai dalam hierarki warisan. Ini membatasi efek buruk dari mutabilitas. Jika struktur data berubah, hanya ada begitu banyak tempat dalam kode yang dapat bertanggung jawab.
Dengan kekekalan, Anda tidak peduli siapa yang dapat beroperasi pada struktur data apa pun, karena tidak ada yang dapat mengubah salinan data Anda. Ini membuat membuat fungsi-fungsi baru untuk bekerja pada struktur data yang ada jauh lebih mudah. Anda cukup membuat fungsi dan mengelompokkannya ke dalam modul yang tampaknya sesuai dari sudut pandang domain. Anda tidak perlu khawatir tentang di mana menempatkan mereka ke dalam hierarki warisan.
Jenis lain penggunaan kembali kode adalah menciptakan struktur data baru untuk bekerja pada fungsi yang ada. Ini ditangani dalam bahasa fungsional menggunakan fitur seperti generik dan kelas tipe. Sebagai contoh, kelas jenis Ord Haskell memungkinkan Anda untuk menggunakan sort
fungsi pada jenis apa pun dengan sebuah Ord
instance. Contoh mudah dibuat jika belum ada.
Ambil Animal
contoh Anda , dan pertimbangkan menerapkan fitur pemberian makan. Implementasi OOP langsung adalah untuk mempertahankan koleksi Animal
objek, dan loop melalui semuanya, memanggil feed
metode pada masing-masing.
Namun, banyak hal menjadi rumit ketika Anda sampai ke detail. Suatu Animal
objek secara alami tahu jenis makanan apa yang dimakannya, dan berapa banyak yang dibutuhkan agar merasa kenyang. Itu tidak secara alami tahu di mana makanan disimpan dan berapa banyak tersedia, sehingga suatu FoodStore
objek baru saja menjadi ketergantungan setiap Animal
, baik sebagai bidang Animal
objek, atau diteruskan sebagai parameter feed
metode. Secara bergantian, untuk menjaga agar Animal
kelas lebih kohesif, Anda mungkin pindah feed(animal)
ke FoodStore
objek, atau Anda dapat membuat kekejian dari kelas yang disebut AnimalFeeder
atau semacamnya.
Dalam FP, tidak ada kecenderungan untuk bidang Animal
untuk selalu tetap dikelompokkan bersama, yang memiliki beberapa implikasi menarik untuk dapat digunakan kembali. Katakanlah Anda memiliki daftar Animal
catatan, dengan bidang seperti name
, species
, location
, food type
, food amount
, dll Anda juga memiliki daftar FoodStore
catatan dengan bidang-bidang seperti location
, food type
, dan food amount
.
Langkah pertama dalam pemberian makanan mungkin adalah memetakan masing-masing daftar catatan tersebut ke daftar (food amount, food type)
pasangan, dengan angka negatif untuk jumlah hewan. Anda kemudian dapat membuat fungsi untuk melakukan segala macam hal dengan pasangan ini, seperti jumlah jumlah masing-masing jenis makanan. Fungsi-fungsi ini bukan milik modul Animal
atau FoodStore
modul, tetapi sangat dapat digunakan kembali oleh keduanya.
Anda berakhir dengan banyak fungsi yang melakukan hal-hal berguna dengan [(Num A, Eq B)]
yang dapat digunakan kembali dan modular, tetapi Anda memiliki kesulitan mencari tahu di mana harus meletakkannya atau apa yang harus mereka sebut sebagai grup. Efeknya adalah bahwa modul FP lebih sulit untuk diklasifikasi, tetapi klasifikasinya jauh kurang penting.