Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Functional vs. OOP == Complex State vs. Complex Arguments / 15 сообщений из 15, страница 1 из 1
22.08.2014, 01:21
    #38726171
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
Попробовал на JavaScript небольшой кусочек написать в функциональном стиле (статический генератор сайтов) - и быстро отказался от этой затеи.

чтобы пример был конкретным, а не некая абстрактная штуковина - мы пишем статический генератор блога - на вход даем папку с текстовыми файлами - а на выходе наща программа генерирует из текстовых html файлы.

И мы оперируем со следующим данными:

- srcPath - директория где лежат текстовые файлы.
- srcTree - дерево файлов в исходной папке (мы кешируем его чтобы не читать в диск каждый раз)
- buildPath - директория в которую нужно сгенерить html файлы.
- buildTree - кешированое дерево файлов которые уже существуют в этой директории
- posts - список файлов-постов
- config - конфиг, разные опции там хранятся

Что получается:

В ООП стиле я создаю класс BlogGenerator в котором в инстанс-переменных сохраняя все это и могу использовать в методах класса любой из этих данных когда мне вздумается.

В функциональном стиле - получается какая-то жуть - почти в каждой функции нужно передавать по 2-3 из этих переменных + 1-2 переменных специфичных для этой функкции. В итоге сигнатуры функций получаются жирными потому что в них нужно передавать по 3-5 параметров и мозг взрывается пытаясь запомнить что и куда нужно передать и код получается хуже и сложнее чем в ООП варианте.

Что я не так делаю? Может в функциональном стиле такие переменные нужно через скоупы(замыкания) передавать? Или может лисп-подобные языки (Clojure напр.) имеют какие-то другие механизмы для этого?
...
Рейтинг: 0 / 0
22.08.2014, 13:01
    #38726570
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
Список задач которые решает функциональное программирование

1. Получение остаточной процедуры.
2. Построение математического описания функций.
3. Определение формальной семантики языка программирования.
4. Описание динамических структур данных.
5. Автоматическое построение "значительной" части программы по описанию структур данных, которые обрабатываются создаваемой программой.
6. Доказательство наличия некоторого свойства программы.
7. Эквивалентная трансформация программ.
...
Рейтинг: 0 / 0
22.08.2014, 15:50
    #38726860
рубист
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
private,

Функциональный стиль не мешает использовать структуры.
Можно создать структуру (типа blogContext), где хранить все что нужно,
и в функции передавать один аргумент.
...
Рейтинг: 0 / 0
22.08.2014, 16:30
    #38726928
kolchanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
> Функциональный стиль не мешает использовать структуры.
> Можно создать структуру (типа blogContext), где хранить все что нужно,
> и в функции передавать один аргумент

И хорошо бы, чтобы они были immutable
...
Рейтинг: 0 / 0
23.08.2014, 02:42
    #38727184
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
авторФункциональный стиль не мешает использовать структуры.
Можно создать структуру (типа blogContext), где хранить все что нужно,
и в функции передавать один аргумент.Чем тогда это отличается от ООП? Мы даем функциям доступ ко всем данным, вводя своего рода "глобальный" контекст со всеми данными.

Единственно иммутабельность (точнее персистентые данные как в кложуре) может чуть помоч.

авторСписок задач которые решает функциональное программирование

1. Получение остаточной процедуры.
2. Построение математического описания функций.
3. Определение формальной семантики языка программирования.
4. Описание динамических структур данных.
5. Автоматическое построение "значительной" части программы по описанию структур данных, которые обрабатываются создаваемой программой.
6. Доказательство наличия некоторого свойства программы.
7. Эквивалентная трансформация программ.Т.е. - тех задач за которые обычно платят бабло - создать полезный программный продукт - оно не решает?
...
Рейтинг: 0 / 0
23.08.2014, 10:27
    #38727209
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateТ.е. - тех задач за которые обычно платят бабло - создать полезный программный продукт - оно не решает?
Это была вводная. А теперь конкретно. JavaScript не является языком ФП. Что такое - писать в функциональном стиле?
Что это за фейк. Покажи исходники мне просто любопытно. И если вобщем-то разница между ФП-стилем и обычным
императивным программированием у тебя будет невелика - то и предмет спора сам собой отпадёт.
...
Рейтинг: 0 / 0
23.08.2014, 23:07
    #38727356
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
авторJavaScript не является языком ФП.Что именно в нем отсутствует (из того что практически используется)?

Про конкретный пример кода согласен, на днях постараюсь вытащить пример чтобы можно было обсудить конкретные вещи.
...
Рейтинг: 0 / 0
25.08.2014, 14:13
    #38728098
WebSharper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateЧем тогда это отличается от ООП? Мы даем функциям доступ ко всем данным, вводя своего рода "глобальный" контекст со всеми данными.


Зачем именно глобальный? всем функциям нужен build path?
...
Рейтинг: 0 / 0
25.08.2014, 14:34
    #38728121
WebSharper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateВ ООП стиле я создаю класс BlogGenerator в котором в инстанс-переменных сохраняя все это и могу использовать в методах класса любой из этих данных когда мне вздумается.


Это мне тоже не кажется таким хорошим.

Я бы сделал примерно по такой схеме:

Код: javascript
1.
2.
var blog = parseSource(sourcePath, parseOptions);
var result = generateHtmlRepresentation(posts, buildPath, htmlGenerationOptions)



И в ФП и в ООП стиле я бы разделял 3 вещи = исходники, логическую модель, и рендеринг
...
Рейтинг: 0 / 0
25.08.2014, 15:51
    #38728225
nolocky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateЧто я не так делаю? Может в функциональном стиле такие переменные нужно через скоупы(замыкания) передавать? Или может лисп-подобные языки (Clojure напр.) имеют какие-то другие механизмы для этого?

Передавай объекты целиком (структуры, коллекции, списки), чего ты стесняешься? Кто тебя насилует передавать только атомарные значения?

В scheme/lisp правда сделано все, как всегда, через жопу - объект это оказывается замыкание. Кого прет от такого - хз, мне вот - больше тошнит.

http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
...
Рейтинг: 0 / 0
26.08.2014, 13:32
    #38728996
Strangecat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateавторJavaScript не является языком ФП.Что именно в нем отсутствует (из того что практически используется)?
.

Алгебраических типов. А нет ADT, значит нет сопоставления с образцом. А нет паттерн-матчинга, то значит язык не ФЯ(функциональный язык), а ФигнЯ.

И вообще вся соль
Код: c#
1.
Maybe<X> = Just X | Nothing

в том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.
...
Рейтинг: 0 / 0
26.08.2014, 15:19
    #38729169
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
nolockyВ scheme/lisp правда сделано все, как всегда, через жопу - объект это оказывается замыкание.Чем же это через жопу? К тому же, в лиспе есть CLOS
...
Рейтинг: 0 / 0
26.08.2014, 15:20
    #38729170
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
StrangecatАлгебраических типов. А нет ADT, значит нет сопоставления с образцом. А нет паттерн-матчинга, то значит язык не ФЯ(функциональный язык), а ФигнЯ.

В эрланге нет АТД, но есть паттерн матчинг.
Правда это связано с тем что он динамический, а потому нет необходимости объявлять тип, достаточно использовать символы и кортежи:
{just, X}
nothing
...
Рейтинг: 0 / 0
26.08.2014, 18:32
    #38729391
private
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
авторв том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.Про ошибки это пока отдельно - мы сейчас обсуждаем простоту кода - в функциональном стиле не получается сделать его проще и компактней. Я не думаю что алгебраические тыпы позволят упростить обьем кода.
...
Рейтинг: 0 / 0
01.09.2014, 14:53
    #38734105
Strangecat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Functional vs. OOP == Complex State vs. Complex Arguments
privateавторв том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.Про ошибки это пока отдельно - мы сейчас обсуждаем простоту кода - в функциональном стиле не получается сделать его проще и компактней. Я не думаю что алгебраические тыпы позволят упростить обьем кода.

Позволяют иногда. Не всегда, но всякие оптимизаторы и парсеры удобно делать, особенно когда нужно несколько раз внутрь залезать, то есть типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- Выражение это сложение, возведение в квадрат, умножение или литерал
adt Expr = Plus Expr | Square Expr | Multiply Expr Expr | Literal Int

Optimize : Expr -> Expr
-- a^2 + (b^2 + 2ab) = (a+b)^2
Optimize (Plus (Square a) 
               (Plus (Square b) 
                     (Multiply (Literal 2) (Mutliply a b)))) =  
     (Square (Plus a b))



Тут правда проблема в том, что далеко не во всех ФЯ паттерн матчинг достаточно мощный чтобы одно и то же значение матчить несколько раз (в примере a и b используются многократно), плюс аст надо упорядочивать определенным образом (пример как есть не сработает для a^2 + (2ab + b^2)), но всё равно на с++ это сложнее описать.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Functional vs. OOP == Complex State vs. Complex Arguments / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]