Комментарии 35
Если рассматривать класс как функцию, то внедрение зависимостей это преобразование класса в чистую функцию. Если зависимости неизменяемые, то все методы класса будут чистыми функциями. Если нет, то все немного сложнее, но идея та же. Не быть зависимым от внешнего мира.
Смысл не в том, что у функции нет зависимостей, а в том, что если зависимости те же, то результат — тот же.
К примеру функция f(x) = x + 1. Если неважно сколько раз вы вызовите f(1), вы всегда получите 2. А вот функция g(db, str) = db.getByString(str) + 1 может вернуть разный результат в зависимости от состоянии базы данных. То есть вы завязали функцию на внешний мир.
Зная это, вы захотите переписать программу так, что-бы логика программы не была завязана на внешний мир. Вы переместите доступ к данным на внешний слой, что-бы в ядре программы использовать f(x), которую проще тестировать и контролировать. Так все изменчивые компоненты будут находится за пределами ядра и вы получите луковую архитектуру естественным образом.
В хаскеле, иначе написать нельзя в принципе. Все типы данных которые завязаны на внешний мир помечены и использовать просто так вместе с обычными данными их нельзя. Их придется преобразовать и если преобразование не получилось, то эти данные вообще в ядро программы не попадут.
Нельзя сравнивать ФП или ООП — все это — инструменты, и каждый лучше или хуже подходит для конкретных задач, вот и все.
Прекратите уже сравнивать несравнимое!
А какие доказательства Вам нужны?
Примеры, очевидно. Плюсы и минусы. То, что абстрактно «можно» и так понятно, вопрос как именно можно, и что из этого получается.
Скажем, такой процедурный язык как Go позволяет использовать и чистые функции и неизменяемость, однако в нем отсутствуют такие популярные методы, как .map()
или .filter()
. Хотя, опять таки, ничего не мешает написать их самостоятельно.
Мы, видимо, по разному поняли эту статью. Лично я вынес из нее, что вышеуказанные техники совсем не противоречат ООП. Таким образом не нарушают концепцию. Большинство языков мультипарадигменны и основная парадигма языка чаще всего определяется сообществом и открытым кодом, опять-таки написанным сообществом.
Это краткая статья о ключевых моментах, которые чаще всего упоминаются в ФП, хотя они также имеют смысл и в ООП. Она скорее для новичков, которые пытаются понять в чем суть ФП и в чем отличие от ООП (на деле ФП можно применять в ООП). Я просто решил начать с чего-то, в планах перевод более глубоких статей.
можно вообще не использовать циклы с изменением локальных переменных
То есть пользоваться рекурсией не имея никаких гарантий того, что не будет просадок по производительности. В ФП рекурсивные вызовы вылизывают на уровне ядра языка, как основное средство работы, а в какой-нибудь java этим всерьез кто-нибудь занимался? Вот и получается, что можно-то оно может и можно, но если очень хочется, то лучше взять какой-нибудь erlang, а не делать вид, что можно быть чуть-чуть беременным.
Современный язык неподдерживающий tailcall это моветон.
Это и есть оптимизация. Позволяет не создавать фрейм для каждого рекурсивного вызова.
Перевод: Почему ФП важно даже для ООП программистов?