|
|
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
Попробовал на JavaScript небольшой кусочек написать в функциональном стиле (статический генератор сайтов) - и быстро отказался от этой затеи. чтобы пример был конкретным, а не некая абстрактная штуковина - мы пишем статический генератор блога - на вход даем папку с текстовыми файлами - а на выходе наща программа генерирует из текстовых html файлы. И мы оперируем со следующим данными: - srcPath - директория где лежат текстовые файлы. - srcTree - дерево файлов в исходной папке (мы кешируем его чтобы не читать в диск каждый раз) - buildPath - директория в которую нужно сгенерить html файлы. - buildTree - кешированое дерево файлов которые уже существуют в этой директории - posts - список файлов-постов - config - конфиг, разные опции там хранятся Что получается: В ООП стиле я создаю класс BlogGenerator в котором в инстанс-переменных сохраняя все это и могу использовать в методах класса любой из этих данных когда мне вздумается. В функциональном стиле - получается какая-то жуть - почти в каждой функции нужно передавать по 2-3 из этих переменных + 1-2 переменных специфичных для этой функкции. В итоге сигнатуры функций получаются жирными потому что в них нужно передавать по 3-5 параметров и мозг взрывается пытаясь запомнить что и куда нужно передать и код получается хуже и сложнее чем в ООП варианте. Что я не так делаю? Может в функциональном стиле такие переменные нужно через скоупы(замыкания) передавать? Или может лисп-подобные языки (Clojure напр.) имеют какие-то другие механизмы для этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 01:21 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
Список задач которые решает функциональное программирование 1. Получение остаточной процедуры. 2. Построение математического описания функций. 3. Определение формальной семантики языка программирования. 4. Описание динамических структур данных. 5. Автоматическое построение "значительной" части программы по описанию структур данных, которые обрабатываются создаваемой программой. 6. Доказательство наличия некоторого свойства программы. 7. Эквивалентная трансформация программ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 13:01 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
private, Функциональный стиль не мешает использовать структуры. Можно создать структуру (типа blogContext), где хранить все что нужно, и в функции передавать один аргумент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 15:50 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
> Функциональный стиль не мешает использовать структуры. > Можно создать структуру (типа blogContext), где хранить все что нужно, > и в функции передавать один аргумент И хорошо бы, чтобы они были immutable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 16:30 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
авторФункциональный стиль не мешает использовать структуры. Можно создать структуру (типа blogContext), где хранить все что нужно, и в функции передавать один аргумент.Чем тогда это отличается от ООП? Мы даем функциям доступ ко всем данным, вводя своего рода "глобальный" контекст со всеми данными. Единственно иммутабельность (точнее персистентые данные как в кложуре) может чуть помоч. авторСписок задач которые решает функциональное программирование 1. Получение остаточной процедуры. 2. Построение математического описания функций. 3. Определение формальной семантики языка программирования. 4. Описание динамических структур данных. 5. Автоматическое построение "значительной" части программы по описанию структур данных, которые обрабатываются создаваемой программой. 6. Доказательство наличия некоторого свойства программы. 7. Эквивалентная трансформация программ.Т.е. - тех задач за которые обычно платят бабло - создать полезный программный продукт - оно не решает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2014, 02:42 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateТ.е. - тех задач за которые обычно платят бабло - создать полезный программный продукт - оно не решает? Это была вводная. А теперь конкретно. JavaScript не является языком ФП. Что такое - писать в функциональном стиле? Что это за фейк. Покажи исходники мне просто любопытно. И если вобщем-то разница между ФП-стилем и обычным императивным программированием у тебя будет невелика - то и предмет спора сам собой отпадёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2014, 10:27 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
авторJavaScript не является языком ФП.Что именно в нем отсутствует (из того что практически используется)? Про конкретный пример кода согласен, на днях постараюсь вытащить пример чтобы можно было обсудить конкретные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2014, 23:07 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateЧем тогда это отличается от ООП? Мы даем функциям доступ ко всем данным, вводя своего рода "глобальный" контекст со всеми данными. Зачем именно глобальный? всем функциям нужен build path? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 14:13 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateВ ООП стиле я создаю класс BlogGenerator в котором в инстанс-переменных сохраняя все это и могу использовать в методах класса любой из этих данных когда мне вздумается. Это мне тоже не кажется таким хорошим. Я бы сделал примерно по такой схеме: Код: javascript 1. 2. И в ФП и в ООП стиле я бы разделял 3 вещи = исходники, логическую модель, и рендеринг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 14:34 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateЧто я не так делаю? Может в функциональном стиле такие переменные нужно через скоупы(замыкания) передавать? Или может лисп-подобные языки (Clojure напр.) имеют какие-то другие механизмы для этого? Передавай объекты целиком (структуры, коллекции, списки), чего ты стесняешься? Кто тебя насилует передавать только атомарные значения? В scheme/lisp правда сделано все, как всегда, через жопу - объект это оказывается замыкание. Кого прет от такого - хз, мне вот - больше тошнит. http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2014, 15:51 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateавторJavaScript не является языком ФП.Что именно в нем отсутствует (из того что практически используется)? . Алгебраических типов. А нет ADT, значит нет сопоставления с образцом. А нет паттерн-матчинга, то значит язык не ФЯ(функциональный язык), а ФигнЯ. И вообще вся соль Код: c# 1. в том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 13:32 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
nolockyВ scheme/lisp правда сделано все, как всегда, через жопу - объект это оказывается замыкание.Чем же это через жопу? К тому же, в лиспе есть CLOS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 15:19 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
StrangecatАлгебраических типов. А нет ADT, значит нет сопоставления с образцом. А нет паттерн-матчинга, то значит язык не ФЯ(функциональный язык), а ФигнЯ. В эрланге нет АТД, но есть паттерн матчинг. Правда это связано с тем что он динамический, а потому нет необходимости объявлять тип, достаточно использовать символы и кортежи: {just, X} nothing ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 15:20 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
авторв том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.Про ошибки это пока отдельно - мы сейчас обсуждаем простоту кода - в функциональном стиле не получается сделать его проще и компактней. Я не думаю что алгебраические тыпы позволят упростить обьем кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 18:32 |
|
||
|
Functional vs. OOP == Complex State vs. Complex Arguments
|
|||
|---|---|---|---|
|
#18+
privateавторв том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.Про ошибки это пока отдельно - мы сейчас обсуждаем простоту кода - в функциональном стиле не получается сделать его проще и компактней. Я не думаю что алгебраические тыпы позволят упростить обьем кода. Позволяют иногда. Не всегда, но всякие оптимизаторы и парсеры удобно делать, особенно когда нужно несколько раз внутрь залезать, то есть типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Тут правда проблема в том, что далеко не во всех ФЯ паттерн матчинг достаточно мощный чтобы одно и то же значение матчить несколько раз (в примере a и b используются многократно), плюс аст надо упорядочивать определенным образом (пример как есть не сработает для a^2 + (2ab + b^2)), но всё равно на с++ это сложнее описать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2014, 14:53 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38726171&tid=1341246]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
141ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 430ms |

| 0 / 0 |
