Насправді OO-код набагато менш використаний, і це за дизайном. Ідея OOP полягає в обмеженні операцій над певними фрагментами даних певним привілейованим кодом, який знаходиться або в класі, або у відповідному місці в ієрархії спадкування. Це обмежує несприятливі наслідки змінності. Якщо структура даних змінюється, у коді є лише стільки місць, які можуть відповідати.
Завдяки незмінності вам не байдуже, хто може оперувати будь-якою структурою даних, оскільки ніхто не може змінити вашу копію даних. Це значно спрощує створення нових функцій для роботи над існуючими структурами даних. Ви просто створите функції та згрупуєте їх у модулі, які здаються доцільними з точки зору домену. Вам не потрібно турбуватися про те, де їх вписати в ієрархію спадкування.
Інший вид повторного використання коду - це створення нових структур даних для роботи над існуючими функціями. Це обробляється на функціональних мовах за допомогою функцій, таких як дженерики та класи типів. Наприклад, клас типу Orke Haskell дозволяє використовувати sort
функцію будь-якого типу з Ord
екземпляром. Екземпляри легко створити, якщо вони ще не існують.
Візьміть свій Animal
приклад і розгляньте можливість використання функції годування. Безпосередня реалізація OOP полягає у підтримці колекції Animal
об'єктів та проходженні їх через усі, викликаючи feed
метод на кожному з них.
Однак, справи стають складними, коли ви переходите до деталей. Animal
Об'єкт природно знає , яку їжу він їсть, і скільки це необхідно для того , щоб відчувати себе повністю. Це, природно, не знає, де зберігається їжа та скільки є, тому FoodStore
об’єкт просто став залежністю кожного Animal
, чи то як поле Animal
об’єкта, чи передається як параметр feed
методу. Крім того, щоб зберегти Animal
клас більш згуртованим, ви можете перейти feed(animal)
до FoodStore
об'єкта, або ви можете створити огиду класу, який називається тим AnimalFeeder
чи іншим .
У FP немає схильності поля Animal
завжди залишатися згрупованими разом, що має деякі цікаві наслідки для повторного використання. Скажімо , у вас є список Animal
записів, з такими областями , як name
, species
, location
, food type
, food amount
і т.д. У вас також є список FoodStore
записів з полями , як location
, food type
і food amount
.
Першим кроком у годівлі може бути зіставлення кожного з цих списків записів до списків (food amount, food type)
пар із негативними цифрами для кількості тварин. Потім ви можете створити функції, щоб робити всілякі речі з цими парами, як, наприклад, підсумовувати кількість продуктів кожного типу. Ці функції не належать до абсолютно або Animal
або в FoodStore
модулі, але вельми багаторазові обома.
У вас з'явилася купа функцій, які роблять корисні речі [(Num A, Eq B)]
для багаторазового використання та модульної роботи, але у вас виникають труднощі з розумінням, куди їх розмістити або як назвати їх як групу. Ефект полягає в тому, що модулі FP важче класифікувати, але класифікація набагато менш важлива.