В останні кілька років мови, які я люблю використовувати, стають все більш "функціональними". Зараз я використовую мови, які є свого роду "гібридом": C #, F #, Scala. Мені подобається розробляти свої програми за допомогою класів, які відповідають об’єктам домену, і використовую функціональні функції, де це робить кодування простішим, зручнішим та безпечнішим (особливо при роботі з колекціями або при передачі функцій).
Однак два світи "стикаються", коли приходять до дизайнерських моделей. Конкретним прикладом, з яким я стикався нещодавно, є модель спостерігача. Я хочу, щоб виробник повідомляв про якийсь інший код ("споживачі / спостерігачі", наприклад, сховище БД, реєстратор тощо), коли елемент створюється або змінюється.
Я спочатку робив це "функціонально" так:
producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed
Але мені зараз цікаво, чи варто використовувати більш "ОО" підхід:
interface IItemObserver {
onNotify(Item)
}
class DBObserver : IItemObserver ...
class LogObserver: IItemObserver ...
producer.addObserver(new DBObserver)
producer.addObserver(new LogObserver)
producer.foo() //calls observer in a loop
Які плюси і мінуси двох підходів? Я колись чув гуру ФП, який каже, що шаблони дизайну існують лише через обмеження мови, і тому функціональних мов їх так мало. Може, це може бути прикладом цього?
EDIT: У моєму конкретному сценарії мені це не потрібно, але .. як би ви реалізували функціональне усунення та додавання "спостерігачів"? (Тобто, як би ви реалізували всі функції у шаблоні?) Просто передаючи нову функцію, наприклад?