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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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



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

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

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

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

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

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

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

В эрланге нет АТД, но есть паттерн матчинг.
Правда это связано с тем что он динамический, а потому нет необходимости объявлять тип, достаточно использовать символы и кортежи:
{just, X}
nothing
...
Рейтинг: 0 / 0
Functional vs. OOP == Complex State vs. Complex Arguments
    #38729391
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв том чтобы ошибки ловились не в процессе выполнения а задолго до него, а на жабоскрипте так нельзя.Про ошибки это пока отдельно - мы сейчас обсуждаем простоту кода - в функциональном стиле не получается сделать его проще и компактней. Я не думаю что алгебраические тыпы позволят упростить обьем кода.
...
Рейтинг: 0 / 0
Functional vs. OOP == Complex State vs. Complex Arguments
    #38734105
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Functional vs. OOP == Complex State vs. Complex Arguments
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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