В последние несколько лет языки, которые я люблю использовать, становятся все более и более «функциональными». Сейчас я использую языки, которые являются своего рода «гибридом»: C #, F #, Scala. Мне нравится разрабатывать свое приложение, используя классы, которые соответствуют объектам домена, и использовать функциональные возможности, где это делает кодирование проще, более удобным и безопасным (особенно при работе с коллекциями или при передаче функций).
Однако эти два мира "сталкиваются", когда приходят к разработке шаблонов. Конкретный пример, с которым я недавно столкнулся, - это шаблон Observer. Я хочу, чтобы производитель уведомлял какой-то другой код («потребители / наблюдатели», например, хранилище БД, регистратор и т. Д.), Когда элемент создается или изменяется.
Я изначально сделал это "функционально" так:
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
Каковы плюсы и минусы двух подходов? Однажды я слышал, как гуру ФП сказал, что шаблоны проектирования существуют только из-за ограничений языка, и поэтому в функциональных языках их так мало. Может быть, это может быть примером этого?
РЕДАКТИРОВАТЬ: В моем конкретном сценарии мне это не нужно, но .. как бы вы реализовали удаление и добавление «наблюдателей» функциональным способом? (Т.е. как бы вы реализовали все функции в шаблоне?) Например, просто передали новую функцию?