Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Holy Wars > ООП - в топку!


Автор: ya2500 18.05.19, 12:47
Цитата
Объектно-ориентированное программирование — чрезвычайно плохая идея, которая могла возникнуть только в Калифорнии.

— Эдсгер Вибе Дейкстра


Чем быстрее вы забудете ООП, тем лучше для вас и ваших программ

Автор: D_KEY 18.05.19, 12:48
А что такое ООП?

Автор: Qraizer 18.05.19, 21:47
ya2500, не читай. Автор прекрасный тролль, не более чем.

Автор: D_KEY 18.05.19, 22:01
Qraizer, а ты знаешь, что такое ООП?

Автор: Астарот 18.05.19, 23:31
Может сразу перейдем к коммерческому коду?

Автор: Qraizer 19.05.19, 03:04
Знаю, D_KEY.

Автор: Славян 19.05.19, 03:47
Я достаточно далёк от ООП, но хотелось бы и какого-то такого:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    class a; // суть описана. Я понимаю, что надо "class A{}; A a;".
     
    a.SetFunc( "getSqrt(x)", "return -sqrt(x);" );
    b = a.GetFunc( "getSqrt", 4); // b = -2


А может даже:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    a.SetFunc(...)
    b = a.getSqrt(4);


Добавлено
И ещё:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    b = 4.getSqrt(a);

Автор: applegame 19.05.19, 05:21
Цитата D_KEY @
Qraizer, а ты знаешь, что такое ООП?
Никто не знает что такое ООП, потому что каждый обзывает этим термином то, что ему захочется. Для кого-то эрланг вполне себе ООП, а для кого-то и плюсы не ООП.

Добавлено
Цитата Славян @
Я достаточно далёк от ООП, но хотелось бы и какого-то такого:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    class a; // суть описана. Я понимаю, что надо "class A{}; A a;".
     
    a.SetFunc( "getSqrt(x)", "return -sqrt(x);" );
    b = a.GetFunc( "getSqrt", 4); // b = -2


А может даже:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    a.SetFunc(...)
    b = a.getSqrt(4);


Добавлено
И ещё:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    b = 4.getSqrt(a);

Все что вы описали есть в Ruby. В смысле возможность динамически добавлять методы и то что все является объектами, включая базовые типы.
Не особо такого хочется на самом деле.

Автор: OpenGL 19.05.19, 07:39
Цитата Славян @
но хотелось бы и какого-то такого:

Ога. Особенно весело будет, если строка в SetFunc будет генерироваться каким-либо методом, который тоже был сгенерирован через SetFunc :D Поиграться может быть и весело, но на практике не нужно.

Автор: Славян 19.05.19, 08:05
Ну это так, первое, что пришло в голову. :blush:

Автор: JoeUser 19.05.19, 08:39
Цитата Славян @
Я достаточно далёк от ООП, но хотелось бы и какого-то такого:

Интерпретировать и исполнять данные как код - не по фэншую. Но все же, если хочется можно скрестить лямбды, std::map и std::any. Да, можно будет выбирать и вызывать лямбды по текстовому ключу. Но, имхо, это изват и тормоза. Да и зачем все это?

Добавлено
В С++17 ввели std::optional ... Де жа вю! Из Раста скомуниздили штоле? :)

Автор: D_KEY 19.05.19, 09:34
Цитата applegame @
Никто не знает что такое ООП

Неправда! Qraizer знает:
Цитата Qraizer @
Знаю, D_KEY.


Добавлено
Цитата JoeUser @
В С++17 ввели std::optional ... Де жа вю! Из Раста скомуниздили штоле? :)

Нет. Из раста вообще пока никто ничего еще не комуниздил. Рано.
Был boost.optional. До того было во многих языках. Идет скорее из функционального программирования.

Добавлено
Цитата applegame @
Для кого-то эрланг вполне себе ООП, а для кого-то и плюсы не ООП.

А для кого-то этот вообще с языком не связано.

Автор: D_KEY 19.05.19, 13:01
Цитата applegame @
Все что вы описали есть в Ruby.

Да даже в C++ можно запилить что-то подобное. Проблема есть в возвращаемом значении, но можно что-нибудь придумать.

Автор: Qraizer 19.05.19, 17:00
Цитата applegame @
Никто не знает что такое ООП, потому что каждый обзывает этим термином то, что ему захочется.
Вероятно, ты имел в виду "знать ООП", а не "знать, что такое ООП". Что это такое, вполне себе чётко описано в определении, и оно языконезависимое. Другое дело, что любой язык предоставляет средства выражения ООП, по-разному отображающие эту парадигму на его грамматику. Включая те, которые вообще не поддерживают ООП какими-либо своими специальными конструкциями. И вот уметь это использовать – совсем другой вопрос.

Автор: D_KEY 19.05.19, 17:01
Цитата Qraizer @
Что это такое, вполне себе чётко описано в определении

В каком?

Автор: Qraizer 19.05.19, 17:03
P.S. В статье как раз вот такая игра на смыслах понятий и происходит. Если намеренно, то автор троль, если нет, то просто нуб в ООП.

Добавлено
Цитата D_KEY @
В каком?
Хочешь, чтобы я процитировал классиков? А вот хрен, и сам сможешь. ООП является технологией, расширяющей рамки структурного подхода и избавленной от его недостатка невозможности его реализовать в полной мере на практике. Ни один язык структурного программирования не может предоставить программисту полный спектр нужных для этого грамматических конструкций, чему причиной является то, что для этого в общем случае потребуется бесконечно много типов грамматических конструкций. ООП эту проблему решает.
К примеру, на C, ты ограничен разбиением программы на единицы трансляции, взаимодействующие между собой через публичные имена, те в свою очередь на функции, взаимодействие между которыми осуществляется через параметры, и... и на этом всё. Сокрытие реализаций осуществляется на первом уровне через статические имена, на втором – тоже статические и локальные. Всё. Иерархия всего из двух уровней. Если исходная задача такова, что двух уровней её разбиения на подзадачи хватит, то структурный подход в C прекрасно справится с её представлением. Увы, 2 уровня уже давно не хватает, поэтому начинаются костыли в лице логического выделения уровней иерархии подзадач без отображения на структуру кода. В ООП понятие класса искаропки позволяет иметь бесконечное количество уровней. Другими словами, уже C с классами позволял отображать структуру исходной сложной задачи на иерархию подзадач явным образом и без костылей.

Автор: korvin 19.05.19, 18:14
Цитата Qraizer @
Ни один язык структурного программирования не может предоставить программисту полный спектр нужных для этого грамматических конструкций, чему причиной является то, что для этого в общем случае потребуется бесконечно много типов грамматических конструкций. ООП эту проблему решает.

В лиспах это делается довольно легко и непринуждённо.

Цитата Qraizer @
К примеру, на C

А, ты про эти языки…

Автор: D_KEY 19.05.19, 18:17
Цитата Qraizer @
Хочешь, чтобы я процитировал классиков?

Вроде как про определение(общепринятое и желательно формальное) ООП речь шла, а не про мнения.

Автор: korvin 19.05.19, 18:31
Раз уж холивары, то:

Цитата
In the article Is Software Engineering an Oxymoron?, Kay writes: "Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects." While this doesn't necessarily constrain the definition of OO in his mind, it is a key statement of philosophy. C++, of course, does early binding everywhere it can--up to the point of performing StaticDispatch as a default (you have to ask for DynamicDispatch with the "virtual" keyword when you want it. [and even that, as in many other languages like Java, is only single dynamic dispatch. If you want "late binding everywhere," you need a much more powerful dispatch system, e.g. CommonLispObjectSystem's generics]).


http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented

=)

Добавлено
А это так, развлечения ради:
http://lucacardelli.name/Papers/PrimObjImpSIPL.A4.pdf
http://lucacardelli.name/Papers/PrimObj1stOrder.A4.pdf

=)

Автор: OpenGL 20.05.19, 07:35
Цитата D_KEY @
Из раста вообще пока никто ничего еще не комуниздил. Рано.

Возможно, это как раз под его влиянием пытаются сделать.

Автор: applegame 20.05.19, 07:51
Цитата Qraizer @
Хочешь, чтобы я процитировал классиков?
Классики сами путаются в определениях.

Автор: Flex Ferrum 20.05.19, 10:11
Цитата korvin @
If you want "late binding everywhere," you need a much more powerful dispatch system, e.g. CommonLispObjectSystem's generics

Только вот это - не панацея и может иметь свои недостатки. Но тут уже начнётся холивар в стиле "статическая типизация vs динамическая типизация". К слову, C++ хорош именно тем, что позволяет ещё на этапе компиляции проверять большое количество констрейнтов, связанных с типами и связыванием, облегчая тем самым задачи рантайма. Впрочем, те, кто любят ловить на страницах undefined object'ы, на этот счёт другого мнения. :)

Автор: D_KEY 20.05.19, 10:32
Flex Ferrum, а ООП тут при чем?

Автор: Flex Ferrum 20.05.19, 10:33
Цитата D_KEY @
Flex Ferrum, а ООП тут при чем?

При том же, при чём цитата Корвина. :) Это не ко мне вопрос. :)

Автор: D_KEY 20.05.19, 10:35
Flex Ferrum, а ты как определяешь ООП?

Автор: Flex Ferrum 20.05.19, 10:38
Цитата D_KEY @
а ты как определяешь ООП?

Как подход к проектированию и декомпозиции программных систем. А на каком языке и как это будет реализовано - уже второй вопрос. То есть для меня дискуссия об ООП - это не дискуссия о языках, его так или иначе реализующих.

Добавлено
Популярная сейчас микросервисная архитектура - это то же ООП, вид в профиль.

Автор: Астарот 20.05.19, 11:45
Цитата Flex Ferrum @
Цитата D_KEY @
а ты как определяешь ООП?

Как подход к проектированию и декомпозиции программных систем. А на каком языке и как это будет реализовано - уже второй вопрос. То есть для меня дискуссия об ООП - это не дискуссия о языках, его так или иначе реализующих.

Добавлено
Популярная сейчас микросервисная архитектура - это то же ООП, вид в профиль.

Задам хитрый вопрос - исходя из того, что ты сказал, что будет НЕ являться ООП? :)

Автор: Flex Ferrum 20.05.19, 11:52
Цитата Астарот @
Задам хитрый вопрос - исходя из того, что ты сказал, что будет НЕ являться ООП?

То, что дизайнится без применения ОО-подхода. Очевидно же! :D

Автор: D_KEY 20.05.19, 11:58
Цитата Flex Ferrum @
Как подход к проектированию и декомпозиции программных систем.

который заключается в ...
В чем? :)

Добавлено
Цитата Flex Ferrum @
Популярная сейчас микросервисная архитектура - это то же ООП, вид в профиль.

А акторы?

Автор: applegame 20.05.19, 12:08
Цитата Астарот @
Задам хитрый вопрос - исходя из того, что ты сказал, что будет НЕ являться ООП?
Ответ очевиден: то что не использует ОО
Цитата Flex Ferrum @
подход к проектированию и декомпозиции программных систем.
:lol:

Типа ООП это как не ООП, но наоборот.

Автор: Flex Ferrum 20.05.19, 12:28
Цитата D_KEY @
А акторы?

Смоллтоковская парадигма же. :) Общая шина, сообщения, которыми обмениваются объекты. Ну! :D

Цитата D_KEY @
который заключается в ...
В чем?

Цитата
Object-oriented software construction is the building of software systems as
structured collections of possibly partial abstract data type implementations.

:D Спасибо старине Мейеру за определение. :)

Автор: Астарот 20.05.19, 12:38
Цитата Flex Ferrum @
То, что дизайнится без применения ОО-подхода. Очевидно же! :D

Это понятно. Но я б ответ без троллинга оценил :)

Добавлено
Цитата Flex Ferrum @
Смоллтоковская парадигма же. :) Общая шина, сообщения, которыми обмениваются объекты. Ну! :D

В смолтоке, как недавно выяснилось, не настоящие сообщения, а всего-то вызовы методов :D

Автор: D_KEY 20.05.19, 12:41
Цитата Flex Ferrum @
Цитата D_KEY @
который заключается в ...
В чем?

Цитата
Object-oriented software construction is the building of software systems as
structured collections of possibly partial abstract data type implementations.

А можно пример не ОО-системы?

Автор: Flex Ferrum 20.05.19, 13:46
Цитата Астарот @
Это понятно. Но я б ответ без троллинга оценил

Ну, без если троллинга - то ООП не будет являться то, что не соответствует этому определению:
Цитата
Object-oriented software construction is the building of software systems as
structured collections of possibly partial abstract data type implementations.

:)

Цитата D_KEY @
А можно пример не ОО-системы?

Нет. Потому что мне нужно вспоминать системы, построенные в соответствии с модульной, процедурной или функциональной парадигмой. А я таких сходу не назову. Да и не с ходу тоже. :)

Автор: Астарот 20.05.19, 13:49
Цитата Flex Ferrum @
Ну, без если троллинга - то ООП не будет являться то, что не соответствует этому определению:

Так я и хочу услышать, что ему не соответствует - на практике. Мне в голову как-то ничего не приходит, но тогдла получается, что все есть ООП, а это явно обесценивает сам термин. Или я не втуда думаю.

Добавлено
Цитата Flex Ferrum @
А я таких сходу не назову. Да и не с ходу тоже. :)

А, ок, спасибо.

Цитата Flex Ferrum @
построенные в соответствии с модульной, процедурной или функциональной парадигмой

Жопа в том, что та же функциональщина замечательно дружит с акторами, на которые понятие ООП замечательно ложится :D

Автор: Flex Ferrum 20.05.19, 13:56
Цитата Астарот @
Жопа в том, что та же функциональщина замечательно дружит с акторами, на которые понятие ООП замечательно ложится

Ты познаёшь дзен. Продолжай. :)

Автор: D_KEY 20.05.19, 13:58
Цитата Астарот @
Жопа в том, что та же функциональщина замечательно дружит с акторами, на которые понятие ООП замечательно ложится :D

А процедурная обычно вполне себе structured collections of possibly partial abstract data type implementations. Собственно, примерно так и возникла та ветка ООП, что от simula67, а не от smalltalk.

Автор: Flex Ferrum 20.05.19, 14:01
Цитата Астарот @
Так я и хочу услышать, что ему не соответствует - на практике.

На практике, скажем, какая-нибудь система управления гидронасосом не будет ОО ни разу. Потому что её дизайн - строго процедурный, и легко расписывается в виде алгоритма (а иначе - ой). Когда ты ставишь во главу угла алгоритм и делаешь процедурную декомпозицию - это тоже не ООП. Аналогично с чистой функциональщиной - ты дизайнишь "от фукнции" (желательно - кристально чистой :D ). Лично для меня ООП начинается тогда, когда дизайн системы - это граф взаимодействия абстрактных объектов посредством интерфейсов. Причём, замечу, характер взаимодействия и способ реализации этих объектов для меня на втором месте.

Добавлено
Цитата D_KEY @
А процедурная обычно вполне себе

Нет. Потому что ты идёшь от алгоритма (каким бы сложным он ни был). Начинаешь с main и спускаешься к деталям реализации конкретных процедур. Тут у тебя данные важны, но они не правят бал.

Автор: Астарот 20.05.19, 14:09
Цитата Flex Ferrum @
Аналогично с чистой функциональщиной - ты дизайнишь "от фукнции" (желательно - кристально чистой :D ).

А если эта функция завернута в актор? :)

Цитата Flex Ferrum @
Лично для меня ООП начинается тогда, когда дизайн системы - это граф взаимодействия абстрактных объектов посредством интерфейсов

Акторы кидающиеся друг в друга записочками попадают под это всецело, при этом внутри актора может быть как функциональщина, так и императивщина с классами, объектами и прочими падучими. И чо делать? :D

Автор: Flex Ferrum 20.05.19, 14:12
Цитата Астарот @
И чо делать?

Ты продолжаешь постигать дзен. Продолжай. :) Ведь не так важно, как реализован конкретный компонент (или фрагмент) системы внутри. :)

Автор: D_KEY 20.05.19, 14:14
Цитата Flex Ferrum @
Потому что ты идёшь от алгоритма (каким бы сложным он ни был). Начинаешь с main и спускаешься к деталям реализации конкретных процедур.

В теории возможно. Но алгоритм-то работает с данными.

Автор: Flex Ferrum 20.05.19, 14:16
Цитата D_KEY @
Но алгоритм-то работает с данными.

И чо? Не каждая работа с данными попадает под концепцию ОО-парадигмы. :) Процессор тоже работает с данными в регистрах и памяти. Мы же не будем натягивать на него ОО-принципы? :)

Автор: D_KEY 20.05.19, 14:18
Цитата Flex Ferrum @
Не каждая работа с данными попадает под концепцию ОО-парадигмы.

Так какая попадает, а какая нет?

Автор: Flex Ferrum 20.05.19, 14:21
Цитата D_KEY @
Так какая попадает, а какая нет?

Попадает та, где у тебя дизайн отталкивается от (чаще всего) абстрактных данных и логики их взаимодействия. Та, где у тебя есть компоненты и абстрактные интерфейсы для взаимодействия с ними.

Автор: D_KEY 20.05.19, 14:24
Это ОО код или процедурный?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int fd = /* socket, open, etc. */
    ...
    rc = write(fd, ...);
    ...

Автор: Flex Ferrum 20.05.19, 14:27
Эм... Чего-то я теперь не догоняю. Где я выше писал про код? Вроде бы речь шла о дизайне. Поэтому ответ на твой вопрос: ХЗ. Если это фрагмент метода Serialize какого-нибудь класса - то, скорее всего, ОО. Если фрагмент функции main на 100500 строк, которая сначала что-то прочитала, потом что-то записала - то процедурный.

Автор: Астарот 20.05.19, 14:35
Цитата D_KEY @
Это ОО код или процедурный?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int fd = /* socket, open, etc. */
    ...
    rc = write(fd, ...);
    ...

Ну, для начала - это код :D А код, в основном, он не ОО или какой-то еще, а говнокод или не говнокод :D

Автор: D_KEY 20.05.19, 14:36
Цитата Flex Ferrum @
Вроде бы речь шла о дизайне.

Ну так у нас вот такая простенькая система. Мы в зависимости от некоторых настроек создаем разные объекты, в которые можно "писать" и пишем в них определенные данные (например, получаемые от клиента из консоли).
Что нужно для того, чтоб наш дизайн был ОО?

Автор: Flex Ferrum 20.05.19, 14:41
Цитата D_KEY @
Что нужно для того, чтоб наш дизайн был ОО?

Нужны соответствующие абстракции. Абстракция для "настроек", абстракция для "клиентского ввода", абстракция для "хранилищ данных", абстракция для "персистентное хранилище". В процедурной декомпозиции будет иначе: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск". В функциональной... Похоже, без в функциональной монад не обойтись. :D

Автор: D_KEY 20.05.19, 14:44
Цитата Flex Ferrum @
Абстракция для "настроек", абстракция для "клиентского ввода", абстракция для "хранилищ данных", абстракция для "персистентное хранилище". В процедурной декомпозиции будет иначе: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск".

Мне кажется, что код при этом будет практически одинаковый.

Автор: Flex Ferrum 20.05.19, 14:45
Цитата D_KEY @
Мне кажется, что код при этом будет практически одинаковый.

Возможно. А возможно и нет.

Автор: JoeUser 20.05.19, 14:49
Цитата Flex Ferrum @
На практике, скажем, какая-нибудь система управления гидронасосом не будет ОО ни разу

А что скажешь по поводу ядра Люникса?

Автор: D_KEY 20.05.19, 14:51
Цитата Flex Ferrum @
Цитата D_KEY @
Мне кажется, что код при этом будет практически одинаковый.

Возможно. А возможно и нет.

А в ОО-системе не нужно будет делать это: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск"? :)
С другой стороны, в процедурных сиситемах точно так же широко применялись(применяются) и абстрактные данные(через теги и касты или через таблицы с указателями на функции, например) и полиморфизм(хотя бы через указатели на функции). И это так же закладывается на уровне дизайна.

Автор: Flex Ferrum 20.05.19, 14:53
Цитата D_KEY @
А в ОО-системе не нужно будет делать это: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск"?

Нужно. Но это будет частью реализации какой-либо абстракции. Например, сериализатора. Ещё раз. Всё зависит от того, от чего ты пляшешь при дизайне системы.

Добавлено
Цитата JoeUser @
А что скажешь по поводу ядра Люникса?

Ничего. Я его не изучал. :)

Автор: D_KEY 20.05.19, 14:57
Цитата Flex Ferrum @
Всё зависит от того, от чего ты пляшешь при дизайне системы.

Да от всего ты пляшешь на практике. Даже те абстракции, что ты выделил для примера, шли в том числе от того, что твоя система будет делать.

Автор: Flex Ferrum 20.05.19, 14:59
Цитата D_KEY @
Да от всего ты пляшешь на практике. Даже те абстракции, что ты выделил для примера, шли в том числе от того, что твоя система будет делать.

На практике для разных аспектов системы я применяю разные подходы в плане дизайна. Как-то так.

Добавлено
Вот ближе к практике. По ссылке из моей подписи можно попасть на проект Jinja2Cpp. В этом проекте есть интересная задачка - прозрачная работа (на уровне реализации) с std::string/std::wstring. Весьма нетривиальная, как оказалось, задачка.

Добавлено
Цитата Flex Ferrum @
На практике для разных аспектов системы я применяю разные подходы в плане дизайна. Как-то так.

Поэтому меня веселят статьи типа тех, что по ссылке топикстартера. Создаётся впечатление, что автор много лет мучился, раз за разом натягивая сов на глобус, просто потому, что его так научили и сказали: "Чуваг, только так правильно!", а потом он вдруг осознал! Бггг...

Автор: D_KEY 20.05.19, 15:18
Цитата Flex Ferrum @
Цитата D_KEY @
Да от всего ты пляшешь на практике. Даже те абстракции, что ты выделил для примера, шли в том числе от того, что твоя система будет делать.

На практике для разных аспектов системы я применяю разные подходы в плане дизайна. Как-то так.

Это понятно. Ты когда абстракции придумываешь, об операциях, которые они будут осуществлять(или над ними будут), обдумываешь?

Автор: Flex Ferrum 20.05.19, 15:20
Цитата D_KEY @
Ты когда абстракции придумываешь, об операциях, которые они будут осуществлять(или над ними будут), обдумываешь?

Да. Но я размышляю над этим в терминах контрактов, активно применяя SOLID.

Автор: D_KEY 20.05.19, 15:23
Цитата Flex Ferrum @
Да.

Тогда в чем разница?

Цитата
Но я размышляю над этим в терминах контрактов, активно применяя SOLID.

И что это меняет? :)

Автор: Flex Ferrum 20.05.19, 15:26
Цитата D_KEY @
И что это меняет?

Точку и угол зрения. При таком взгляде на дизайн возникают интересные констрейнты типа "принцип минимальных привилегий", "один класс - одна задача", "ответственность класса" и т. п.

Автор: D_KEY 20.05.19, 15:29
Цитата Flex Ferrum @
Цитата D_KEY @
И что это меняет?

Точку и угол зрения. При таком взгляде на дизайн возникают интересные констрейнты типа "принцип минимальных привилегий", "один класс - одна задача", "ответственность класса" и т. п.

Пока звучит как словоблудие :) Или вера.

Добавлено
Эти же вещи возникают при любом другом дизайне.

Автор: Flex Ferrum 20.05.19, 15:35
Цитата D_KEY @
Эти же вещи возникают при любом другом дизайне.

Нда? Можешь показать, какое они будут иметь отражение при процедурном дизайне? А при функциональном?

Автор: Wound 20.05.19, 15:38
А мне кажется ярые ООПшники немного начали бороться с самими собой, чтоб сделать идеальную ООП систему, хотя бы на бумаге, в книгах. И от этого начинается некая путаница.
Я вот как то про сервис локатор читал, читал, в терминах ООП, что мол де это антипаттерн, долой его и туда сюда, потом начал разбираться с этим более детально, в итоге он мне сильно начал напоминать паттерн абстрактная фабрика. Начал искать отличия, нашел - но эти отличия правда какие то расплывчатые у автора получились.
Потом когда SOLID начал более детально курить, прочитал статьи, посмотрел примеры, попробовал, потом почитал что люди пишут помешанные на ООП и понял что многие начинают жестко путаться в своей же терминологии. Например Инверсию зависимостей очень часто путают с Внедрением зависимостей. Начинаются бестолковые споры о том, кто должен выключать переключатель и в каком слое и т.п. И короче понял что всего надо в меру. Особенно эта проблема выражена у программистов C#/Java.

Автор: Flex Ferrum 20.05.19, 15:43
Цитата Wound @
И короче понял что всего надо в меру. Особенно эта проблема выражена у программистов C#/Java.

Вот!

Автор: Wound 20.05.19, 15:44
Цитата D_KEY @
Пока звучит как словоблудие Или вера.

Вообще то это целая уже научная отрасль. Просто на текущий момент ОО системы разрослись до таких масштабов, что их уже трудно поддерживать без SOLID. Особенно это касается всяких .NET проектов. Вот возьми какой нибудь EntityFramework, тебе там сразу какой нибудь MVC шаблон придется пилить. Делить все на слои, дальше как быть если с клиента что то надо будет передать на сервак, нужно предусмотреть чтоб все было дешево и быстро, вот тут всякие SOLID и начинают работать. А если ты пишешь:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int fd = /* socket, open, etc. */
    ...
    rc = write(fd, ...);
    ...

То тут конечно оно тебе ничем не поможет.

Автор: Астарот 20.05.19, 15:48
Цитата D_KEY @
Пока звучит как словоблудие :) Или вера.

У тебя пункт на "вере", обрати внимание.

Автор: Flex Ferrum 20.05.19, 15:50
Цитата Wound @
чтоб сделать идеальную ООП систему

ИМХО, идеальных - не существует. Есть реально работающие и теоретические. :D

Автор: D_KEY 20.05.19, 15:52
Цитата Wound @
Вообще то это целая уже научная отрасль.

Научным это будет тогда, когда будет формальное опредедение ООП.

Добавлено
Цитата Астарот @
У тебя пункт на "вере", обрати внимание.

Спасибо, я знаю :)

Добавлено
Цитата Flex Ferrum @
Нда? Можешь показать, какое они будут иметь отражение при процедурном дизайне? А при функциональном?

Пока ты не показал разницу между ОО и процедурным :)

Автор: Flex Ferrum 20.05.19, 15:54
Цитата D_KEY @
Пока ты не показал разницу между ОО и процедурным

Ты её не увидел (не захотел увидеть?). А это уже не мои проблемы. :) Но это был к тебе вопрос, на самом деле. Ты утверждаешь, что при альтернативных подходах это будет так же. Мне и интересно - как именно? Вот как реализуется "принцип минимальных привилегий" при процедурном подходе? А при функциональном?

Автор: D_KEY 20.05.19, 15:55
Цитата Wound @
Потом когда SOLID начал более детально курить

SOLID прекрасен. Сам использую и всем рекомендую. Только это все не приблежает нас к пониманию термина ООП.

Автор: Flex Ferrum 20.05.19, 15:55
Цитата D_KEY @
Только это все не приблежает нас к пониманию термина ООП.

Тебя. *Fixed.

Автор: Астарот 20.05.19, 15:57
Цитата Wound @
чтоб сделать идеальную ООП систему

В процесс создания идеальной ООП системы обязательно входит два пункта:
1. доказательство ООПшности
2. доказательство идеальности
:D

Автор: D_KEY 20.05.19, 15:57
Цитата Flex Ferrum @
Цитата D_KEY @
Пока ты не показал разницу между ОО и процедурным

Ты её не увидел (не захотел увидеть?).

А как тут можно понять? Ты ничего конкретного не сказал:
Цитата Flex Ferrum @
Цитата D_KEY @
И что это меняет?

Точку и угол зрения.

:)

И сразу пошел в сторону SOLID. Который тоже совершенно неформален.

Добавлено
Цитата Flex Ferrum @
Цитата D_KEY @
Только это все не приблежает нас к пониманию термина ООП.

Тебя. *Fixed.

Ну так расскажи :)

Автор: Flex Ferrum 20.05.19, 15:59
Цитата D_KEY @
А как тут можно понять? Ты ничего конкретного не сказал:

Если это троллинг, то очень грубый и толстый.
Цитата Flex Ferrum @
Нужны соответствующие абстракции. Абстракция для "настроек", абстракция для "клиентского ввода", абстракция для "хранилищ данных", абстракция для "персистентное хранилище". В процедурной декомпозиции будет иначе: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск". В функциональной... Похоже, без в функциональной монад не обойтись.


Добавлено
Цитата D_KEY @
И сразу пошел в сторону SOLID.

Формален/не формален - это фигня. Расскажи, как применяются принципы SOLID при процедурном подходе.

Автор: D_KEY 20.05.19, 16:08
Цитата Flex Ferrum @
Цитата Flex Ferrum @
Нужны соответствующие абстракции. Абстракция для "настроек", абстракция для "клиентского ввода", абстракция для "хранилищ данных", абстракция для "персистентное хранилище". В процедурной декомпозиции будет иначе: "Прочитали файл с настройками, получили клиентский ввод, проанализировали, определили тип создаваемой структуры, записали туда данные и выгрузили на диск". В функциональной... Похоже, без в функциональной монад не обойтись.

Я на это ответил. Потом ответил ты и т.д. В результате мы пришли лишь к тому, что я процитировал.
Еще раз. Чтобы определить абстракции, тебе придется определить операции. Чтобы спроектировать систему, теме придется сделать все тоже, что ты описал для процедурного стиля.

И вспоминаем, что начался этот пример с кода. Он написан процедурно. Но в нем есть абстракция "файла"(который может быть реальным файлом, сокетом, пайпом и т.п.), с операцией write.

Цитата
Формален/не формален - это фигня.

:lol:
На этом можно было бы закончить, но нет.

Цитата
Расскажи, как применяются принципы SOLID при процедурном подходе.

А какая разница между ОО и процедурным?

Автор: Flex Ferrum 20.05.19, 16:14
Цитата D_KEY @
А какая разница между ОО и процедурным?

Цитата D_KEY @
Еще раз. Чтобы определить абстракции, тебе придется определить операции. Чтобы спроектировать систему, теме придется сделать все тоже, что ты описал для процедурного стиля.

Нет. В процедурном стиле я сначала придумываю алгоритм, а потом подбираю нужные данные под него. Если вообще нужны. Конкретные свойства данных и т. п. тут не играют особой роли. Есть - и ладно. В ОО-стиле - наоборот. Конкретные алгоритмы продумываются после объектной декомпозиции. Соответственно, и подходы к реализации вроде бы одинаковых задач будут разные. Скажем, тебе нужно поддержать чтение разных типов конфигураций. В процедурном стиле ты воткнёшь if/else if и в каждой ветке вызовешь функцию чтения нужного формата файла и раскладывания по структурам. В объектом - у тебя скорее всего будет абстрактная фабрика, которая выплёвывает из себя интерфейс для чтения конфигурации. И уже в фабрике будет if/else if. Или реестр. Или ещё какой-либо способ диспетчеризации.

Добавлено
А абстрактная фабрика с интерфейсами в ОО-подходе у тебя появится для того, чтобы реализовать букву "D" из SOLID. Чтобы потом написать юнит-тесты, в которых можно подменять источники конфигурации (та самая "инверсия зависимостей"). В процедурном подходе ничего такого не понадобится. Шаг алгоритма пройден. Если успешно - идём дальше.

Автор: D_KEY 20.05.19, 16:17
Цитата Flex Ferrum @
В процедурном стиле я сначала придумываю алгоритм, а потом подбираю нужные данные под него.

Где ты такое видел вообще?

Автор: Flex Ferrum 20.05.19, 16:17
Цитата D_KEY @
Где ты такое видел вообще?

А в чём, по твоему, суть процедурного подхода? :D Алгоритмическая декомпозиция задачи.

Автор: D_KEY 20.05.19, 16:20
В разбиении программы на подпрограммы в рамках императивного подхода.

Автор: Flex Ferrum 20.05.19, 16:22
Цитата D_KEY @
В разбиении программы на подпрограммы в рамках императивного подхода.

Вот. Алгоритмическая декомпозиция. Про которую я и говорю. Тогда в чём вопрос?
Цитата D_KEY @
Где ты такое видел вообще?

Спор ради спора?

Автор: D_KEY 20.05.19, 16:25
Цитата Flex Ferrum @
Цитата D_KEY @
В разбиении программы на подпрограммы в рамках императивного подхода.

Вот. Алгоритмическая декомпозиция. Про которую я и говорю. Тогда в чём вопрос?

Отсюда не следует, что ты сначала обдумываешь алгоритм, потом подбираешь под него данные.

Автор: Flex Ferrum 20.05.19, 16:30
Цитата D_KEY @
Отсюда не следует, что ты сначала обдумываешь алгоритм, потом подбираешь под него данные.

Именно это отсюда и следует. Если под данными считать "абстракции". Алгоритмическая декомпозиция против объектной. Вроде азы же! :)

Автор: D_KEY 20.05.19, 16:34
Цитата Flex Ferrum @
Цитата D_KEY @
Отсюда не следует, что ты сначала обдумываешь алгоритм, потом подбираешь под него данные.

Именно это отсюда и следует.

Как?

Цитата
Алгоритмическая декомпозиция против объектной. Вроде азы же! :)

Эти азы расплывчаты и встречаются только в ОО литературе.

Автор: Wound 20.05.19, 16:46
Цитата D_KEY @
Еще раз. Чтобы определить абстракции, тебе придется определить операции. Чтобы спроектировать систему, теме придется сделать все тоже, что ты описал для процедурного стиля.

Так ты на абстракции смотришь через призму деталей, вот у тебя и не получается понять что к чему. Попробуй смотреть на абстракции не через призму деталей, а через призму абстракций.
Т.е. вот у тебя есть какой то интерфейс "Живое" существо, ты описываешь в нем то, что ему пресуще. Как ты это сделаешь в процедурном стиле, чтоб избежать дублирования кода в будущем, как ты будешь изменять поведение в зависимости от интерфейсов/классов(от конкретизации живого существа)? Как ты будешь такими объектами управлять? Как ты будешь инкапсулировать детали реализации? Вот при ОО подходе тут уже вырисовываются разные интерфейсы, без всяких деталей. А при процедурном как?

Автор: D_KEY 20.05.19, 16:52
Wound, речь про то, что такое ООП. Это все хорошо, что ты пишешь. Но не дает определение.

Автор: Wound 20.05.19, 16:55
Цитата D_KEY @
Wound, речь про то, что такое ООП. Это все хорошо, что ты пишешь. Но не дает определение.

Определение можешь посмотреть на вики. Чем оно тебя не устраивает?

Автор: D_KEY 20.05.19, 16:57
Цитата Wound @
Цитата D_KEY @
Wound, речь про то, что такое ООП. Это все хорошо, что ты пишешь. Но не дает определение.

Определение можешь посмотреть на вики. Чем оно тебя не устраивает?

Расплывчатостью. Сможешь посмотреть на систему и сказать, ОО она или нет? А другие "эксперты" согласятся с тобой?

Автор: Wound 20.05.19, 16:58
ООП по сути не панацея, а призвана всего лишь упростить процесс разработки и сопровождения ПО.

Конечно можно все это съэмулировать в процедурном стиле и в функциональном. Но сколько времени тебе на это понадобиться и как просто потом все это будет поддерживать? А тут тебе дают инструмент призванный съэкономить время, деньги и ресурсы. Плюс ты получаешь гибкую систему, которую можно расширять без переписывания и без гемороя в любую сторону.

Добавлено
Цитата D_KEY @
Сможешь посмотреть на систему и сказать, ОО она или нет? А другие "эксперты" согласятся с тобой?

Если она удовлетворяет основным принципам ООП, тогда можно сказать что это ООП система. Если нет - значит не судьба. :-?

Автор: D_KEY 20.05.19, 17:01
Цитата Wound @
Если она удовлетворяет основным принципам ООП

Разные люди разные принципы выделяют. И все эти принципы расплывчаты. Кто-то скажет, что система им удовлетворяет, а кто-то скажет, что нет.

Автор: Wound 20.05.19, 17:01
Цитата D_KEY @
А другие "эксперты" согласятся с тобой?

А что есть какой то другой способ определить ОО эта система или нет?

Добавлено
Цитата D_KEY @
Разные люди разные принципы выделяют. И все эти принципы расплывчаты. Кто-то скажет, что система им удовлетворяет, а кто-то скажет, что нет.

Приводи примеры. Я не встречал описание ОО принципов, отличных от тех, что написаны на вики.

Автор: D_KEY 20.05.19, 17:07
Цитата Wound @
Цитата D_KEY @
А другие "эксперты" согласятся с тобой?

А что есть какой то другой способ определить ОО эта система или нет?

Так я про это и говорю. Нет нормального способа.

Цитата
Цитата D_KEY @
Разные люди разные принципы выделяют. И все эти принципы расплывчаты. Кто-то скажет, что система им удовлетворяет, а кто-то скажет, что нет.

Приводи примеры.

Классический пример про принципы - одни считают, что ООП - это про "инкапсуляцию, наследование и полиморфизм", другие - что это про "все есть объекты, которые обмениваются между собой сообщениями", а третьи твердят про "абстрактные типы данных".
Пример систем. Хм. Ну вот скажи, STL - это ООП или нет?

Автор: Flex Ferrum 20.05.19, 17:11
Цитата D_KEY @
Как?

Смотри. В процедурном подходе первичен алгоритм. Ты придумываешь его шаг за шагом параллельно выбирая как и где ты будешь хранить промежуточные результаты. И у тебя появляется функция чтения конфигурации, которая просто читает файл и просто заполняет структуру с открытыми полями. Никакой инкапсуляции, абстракции и прочего. Имя файла на вход, структура на выход. Все, идём по алгоритму дальше.
В ОО-подходе у тебя взаимодействующие абстракции. У тебя, скажем, есть абстракция "конфигурация", у которой интерфейс иерархического хранилища. Есть фабрика, которая создаёт экземпляр этой абстракции. Конкретный экземпляр. На вход - имя файла (или поток, или абстракция DataSource), на выходе - интерфейс. Дальше, у тебя есть абстракция "источник пользовательского ввода". Есть абстракция "Парсер пользовательского ввода". Ты передашь в парсер интерфейс конфигуратора. У тебя есть абстракция "Процессор пользовательского ввода", который склеивает всё вместе. И так далее. И алгоритмическая часть уже будет иной: создать объекты и обеспечить их совместную работу для решения финальной задачи, а не чёткое описание алгоритма шаг за шагом.
Такая вот разница между применением процедурного подхода и ОО. В первом случае чёткий алгоритм. Во втором - набор взаимодействующих абстракций. Но оба решают одну задачу.

Автор: Wound 20.05.19, 17:16
Цитата D_KEY @
Так я про это и говорю. Нет нормального способа.

А чем тебя не устраивает тот, что на вики, я не понимаю? Чем этот способ не нормальный?

Цитата D_KEY @
Классический пример про принципы - одни считают, что ООП - это про "инкапсуляцию, наследование и полиморфизм", другие - что это про "все есть объекты, которые обмениваются между собой сообщениями", а третьи твердят про "абстрактные типы данных".

Это все одно и то же, просто сказано либо очень абстрактно либо конкретизировано. В вики например описывают 4 основных принципа "абстрагирование, инкапсуляция, наследование, полиморфизм".
В более ранних интерпетациях выделяли три последних принципа. Это все логично, ибо все развивается, потом появились конкретные методики, которые еще больше конкретизируют эти принципы своими принципами(тот же SOLID), со временем возможно еще что то добавится. Так вот к чему это все, а к тому что технологии развиваются, и конкретизируются определения различных систем и парадигм. Что то конкретизируется, что то отсеивается и т.д. На сегодняшний день можешь измерять ООпшность системы путем применения этих 4 принципов. Раньше возможно хватало 3 принципов, а еще раньше возможно хватало принципа "все есть объекты, которые обмениваются между собой сообщениями".

Вон даже планет в солнечной системе стало меньше, за последние 10 лет, а ты тут про какую то расплывчатость формулировок.

Добавлено
Цитата D_KEY @
Пример систем. Хм. Ну вот скажи, STL - это ООП или нет?

Нет.

Автор: D_KEY 20.05.19, 17:17
Flex, к тебе те же вопросы :)
Цитата D_KEY @
Ну вот скажи, STL - это ООП или нет?

Сможешь посмотреть на систему и сказать, ОО она или нет? А другие "эксперты" согласятся с тобой?

Автор: Flex Ferrum 20.05.19, 17:20
Цитата D_KEY @
Flex, к тебе те же вопросы :)
Цитата D_KEY @
Ну вот скажи, STL - это ООП или нет?

Сможешь посмотреть на систему и сказать, ОО она или нет? А другие "эксперты" согласятся с тобой?

STL только лишь в малой части ОО. В реализации стримов. Всё. Но к чему эти вопросы? Скажи, ты опять не понял разницу между ОО- и процелурным подходом?

Автор: D_KEY 20.05.19, 17:23
Цитата Flex Ferrum @
Смотри. В процедурном подходе первичен алгоритм. Ты придумываешь его шаг за шагом параллельно выбирая как и где ты будешь хранить промежуточные результаты. И у тебя появляется функция чтения конфигурации, которая просто читает файл и просто заполняет структуру с открытыми полями. Никакой инкапсуляции, абстракции и прочего. Имя файла на вход, структура на выход. Все, идём по алгоритму дальше.

Ок. Допустим. Твой взгляд на процедурное программирование я понял. Хотя STL, очевидно, делали не так ;)

Цитата
У тебя, скажем, есть абстракция "конфигурация", у которой интерфейс иерархического хранилища.

Мне ее еще надо придумать. Это происходит от того, что нужно сделать. В разных системах абстракции для "конфигурации" будут разными.
Исходя из чего придумывается интерфейсы абстракций?

Цитата
Есть фабрика, которая создаёт экземпляр этой абстракции.

В "процедурном" подходе у тебя точно так же могут выбираться разные реализации по каким-то параметрам.

Цитата
на выходе - интерфейс.

В моем примере есть идентификатор "файла", в который ты можешь писать, из которого ты можешь читать и пр. При этом это может быть и файл на диске и сокет и пайпа и хз что еще. Это процедурный стиль. Так проектировали еще до ООП.

Цитата
И алгоритмическая часть уже будет иной: создать объекты и обеспечить их совместную работу для решения финальной задачи, а не чёткое описание алгоритма шаг за шагом.

Так это и есть алгоритм шаг за шагом.

Добавлено
Цитата Flex Ferrum @
Скажи, ты опять не понял разницу между ОО- и процелурным подходом?

Твою точку зрения я понял. Но ты ее не обосновываешь, а постулируешь :)

Добавлено
Цитата Wound @
Это все одно и то же, просто сказано либо очень абстрактно либо конкретизировано.

Нет, это не одно и то же. И именно поэтому Алан Кей отказывал C++ в праве называться ОО-языком. Это его частное мнение. Определения-то четкого нет. Я уже не говорю формальное.

Цитата
Цитата D_KEY @
Пример систем. Хм. Ну вот скажи, STL - это ООП или нет?

Нет.

А что это? :)

Автор: Flex Ferrum 20.05.19, 17:31
Цитата D_KEY @
Мне ее еще надо придумать. Это происходит от того, что нужно сделать. В разных системах абстракции для "конфигурации" будут разными.
Исходя из чего придумывается интерфейсы абстракций?

Сами абстракции и их интерфейсы продумываются исходя из потребностей задачи. Исходной задачи, а не её алгоритм чешского представления.

Цитата D_KEY @
Так это и есть алгоритм шаг за шагом.

Нет. Если ты попробуешь реализовать первое и второе, то итоговое представление алгоритма у тебя будет разным. Во втором случае алгоритм будет сильно "рамазан" по коду.

Автор: D_KEY 20.05.19, 17:33
Цитата Flex Ferrum @
Сами абстракции и их интерфейсы продумываются исходя из потребностей задачи. Исходной задачи, а не её алгоритм чешского представления.

Так а с чего ты взял, что до ООП люди все строили от алгоритмического представления?

Цитата
Нет. Если ты попробуешь реализовать первое и второе, то итоговое представление алгоритма у тебя будет разным. Во втором случае алгоритм будет сильно "рамазан" по коду.

И что? От этого там не будет "процедур"? И что мешало в процедурном подходе так же декомпозировать?

Автор: Wound 20.05.19, 17:37
Цитата D_KEY @
Нет, это не одно и то же. И именно поэтому Алан Кей отказывал C++ в праве называться ОО-языком. Это его частное мнение. Определения-то четкого нет. Я уже не говорю формальное.

Ну а причем тут его частное мнение к общепризнанному мнению? Я уверен существуют ученные с мировым именем, которые не признают Теорию Большого Взрыва. Но она то не перестает быть от этого их частного мнения, основной теорией появления вселенной и всего остального.

Цитата D_KEY @
А что это? :)

Библиотека(набор) стандартных алгоритмов и классов дабы не писать велосипеды в каждой программе, облегчающая жизнь.

Автор: Flex Ferrum 20.05.19, 17:37
Цитата D_KEY @
И что? От этого там не будет "процедур"? И что мешало в процедурном подходе так же декомпозировать

Ничего. Кроме того, что это будет уже ОО- подход. :)

Цитата D_KEY @
Так а с чего ты взял, что до ООП люди все строили от алгоритмического представления?

Эм... Вроде такова история индустрии. Сначала компьютеры применяли для решения чётко формализованных алгоритмических задач. Не? Это потом, с увеличением мощностей и появлением ЯВУ начали говорить о более сложных/альтернативных подходах.

Автор: Qraizer 20.05.19, 17:45
D_KEY, если я (очередной раз) назову <stdio.h> имеющим объектную архитектуру, тебя это устроит?

Автор: D_KEY 20.05.19, 17:46
Цитата Qraizer @
D_KEY, если я (очередной раз) назову <stdio.h> имеющим объектную архитектуру, тебя это устроит?

Так замечательно. Осталось сформулировать четкие критерии :)

Добавлено
Цитата Flex Ferrum @
Цитата Qraizer @
D_KEY, если я (очередной раз) назову <stdio.h> имеющим объектную архитектуру, тебя это устроит?

И будешь прав. :)

Вот тут важный момент. Почему ты пишешь не "я тоже так считаю", а "будешь прав", как будто есть четкие критерии?

Добавлено
Цитата Flex Ferrum @
Цитата D_KEY @
Так а с чего ты взял, что до ООП люди все строили от алгоритмического представления?

Эм... Вроде такова история индустрии.

Когда появился stdio.h?

Автор: Flex Ferrum 20.05.19, 17:46
Цитата Qraizer @
D_KEY, если я (очередной раз) назову <stdio.h> имеющим объектную архитектуру, тебя это устроит?

И будешь прав. :)

Автор: Qraizer 20.05.19, 17:48
Цитата D_KEY @
Так замечательно. Осталось сформулировать четкие критерии
Т.е. ты не возражаешь против этого тезиса. Тогда следующий вопрос: когда он писался, кем-то, когда-то... он вообще думал о том, чтобы написать его в стиле ООП?

Автор: Wound 20.05.19, 17:49
D_KEY, Вообще да, если начать философствовать, то конечно ОО систему можно наковырять(разглядеть) и в сишной функции записи write(FILE*,...). Но какое это имеет отношение к реальным системам?

Автор: D_KEY 20.05.19, 17:49
Цитата Wound @
Ну а причем тут его частное мнение к общепризнанному мнению?

Что за общепризнанное мнение? Кто статистику подводил?

Автор: Flex Ferrum 20.05.19, 17:49
Цитата D_KEY @
Вот тут важный момент. Почему ты пишешь не "я тоже так считаю", а "будешь прав", как будто есть четкие критерии?

Потому что есть абстрактный тип данных (FILE) и набор операций с ним (интерфейс).

Автор: D_KEY 20.05.19, 17:50
Цитата Qraizer @
Тогда следующий вопрос: когда он писался, кем-то, когда-то... он вообще думал о том, чтобы написать его в стиле ООП?

Это ты Flex'а спроси. У него до ООП все алгоритмами мыслили.

Автор: Wound 20.05.19, 17:52
Цитата D_KEY @
Что за общепризнанное мнение? Кто статистику подводил?

Так ты ее и привел, указав только одного ученого. Видимо больше на ходу и не вспомнил. А так вроде как это стандартное определение, которое дается даже в ВУЗах, не?

Автор: D_KEY 20.05.19, 17:54
Цитата Wound @
Цитата D_KEY @
Что за общепризнанное мнение? Кто статистику подводил?

Так ты ее и привел, указав только одного ученого.

Считается, что это он придумал термин ООП.

Добавлено
Цитата Flex Ferrum @
Цитата D_KEY @
Вот тут важный момент. Почему ты пишешь не "я тоже так считаю", а "будешь прав", как будто есть четкие критерии?

Потому что есть абстрактный тип данных (FILE) и набор операций с ним (интерфейс).

Замечательно. Так вот так люди мыслили при проектировании систем и до моды на ООП.

Автор: Wound 20.05.19, 17:58
Цитата D_KEY @
Считается, что это он придумал термин ООП.

И чего? Я же выше уже писал:
Цитата Wound @
Это все одно и то же, просто сказано либо очень абстрактно либо конкретизировано. В вики например описывают 4 основных принципа "абстрагирование, инкапсуляция, наследование, полиморфизм".
В более ранних интерпетациях выделяли три последних принципа. Это все логично, ибо все развивается, потом появились конкретные методики, которые еще больше конкретизируют эти принципы своими принципами(тот же SOLID), со временем возможно еще что то добавится. Так вот к чему это все, а к тому что технологии развиваются, и конкретизируются определения различных систем и парадигм. Что то конкретизируется, что то отсеивается и т.д. На сегодняшний день можешь измерять ООпшность системы путем применения этих 4 принципов. Раньше возможно хватало 3 принципов, а еще раньше возможно хватало принципа "все есть объекты, которые обмениваются между собой сообщениями".

Вон даже планет в солнечной системе стало меньше, за последние 10 лет, а ты тут про какую то расплывчатость формулировок.

Страуструп тоже С++ изобрел, и тоже некоторые новые нововведения считает бредом. Но язык развивается уже без его участия напрямую, это диктуют ему современные реалии. Ровно то же самое и с ООП. Вот тогда в бородатом 85ом или когда там, было одно определение, а сегодня оно уже немного модернизировалось и стало таким, как есть. Это диктуют современные реалии. Иначе система отомрет, ей нужно изменяться и подстраиваться под текущии реалии. И со временем возможно она еще чем то пополнится, либо лишьнее уйдет. Этого уже будут требовать будущии реалии.

Автор: Qraizer 20.05.19, 18:00
Цитата Wound @
Вообще да, если начать философствовать, то конечно ОО систему можно наковырять(разглядеть) и в сишной функции записи write(FILE*,...). Но какое это имеет отношение к реальным системам?
Я это к тому, что тот, кто этот самый <stdio.h> придумывал, вообще не думал об ООП. Он просто спроектировал его так, чтобы было удобно и при этом работало. Как это позволил язык, так и выразил в коде. И тем не менее, это самая настоящая ОО библиотека. Абстракция FILE, приправленная интерфейсом из методов и констант.

Автор: Flex Ferrum 20.05.19, 18:01
D_KEY, ты же отдаёшь себе отчёт, что споришь с представлением об ООП, предложенным как раз таки Аланом Кеем?

Автор: Wound 20.05.19, 18:01
Цитата Qraizer @
Я это к тому, что тот, кто этот самый <stdio.h> придумывал, вообще ничего не думал об ООП.

Да то к D_KEY вопрос был, я там пока писал дополнение к своему посту, вы передо мной 2 поста накатали, я там уже поправил ))

Автор: D_KEY 20.05.19, 18:02
Цитата Wound @
Ровно то же самое и с ООП. Вот тогда в бородатом 85ом или когда там, было одно определение, а сегодня оно уже немного модернизировалось и стало таким, как есть. Это диктуют современные реалии. Иначе система отомрет, ей нужно изменяться и подстраиваться. И со временем возможно она еще чем то пополнится, либо лишьнее уйдет. Этого уже будут требовать будущии реалии.

Да не о том речь.

Нет единого, четкого, стандартного и тем более формального определения для ООП. Все что есть, это некий набор практик(довольно хороших) + лозунги и маркетинг.

Автор: Qraizer 20.05.19, 18:02
По сути, только лишь по коду ты просто не отличишь ООП от не ООП. ООП – это лишь набор спецификаций для проектирования систем. Если его формализовать, как раз и получится вон то расплывчатое и неточное. И не более.

Автор: Flex Ferrum 20.05.19, 18:03
Цитата D_KEY @
Так вот так люди мыслили при проектировании систем и до моды на ООП.

Не все и не всегда.

Автор: D_KEY 20.05.19, 18:03
Цитата Flex Ferrum @
D_KEY, ты же отдаёшь себе отчёт, что споришь с представлением об ООП

:facepalm: Я не спорю с представлением об ООП.

Добавлено
Цитата Flex Ferrum @
Цитата D_KEY @
Так вот так люди мыслили при проектировании систем и до моды на ООП.

Не все и не всегда.

Точно так же, как и многие якобы ОО-системы сейчас.

Добавлено
Цитата Qraizer @
ООП – это лишь набор спецификаций для проектирования систем.

Скорее практик, а не спецификаций.

Автор: Flex Ferrum 20.05.19, 18:07
Цитата D_KEY @
Все что есть, это некий набор практик(довольно хороших)

Нет, это не так. Но объяснять по третьему кругу человеку, для которого "лозунги и маркетинг" вплетаются в такого рода дискуссии смысла не вижу. А отсылать к Бочу или Мейеру - зачем? Оно ж лозунги и маркетинг. И статьи очередного неосилятора на хабре.

Автор: Qraizer 20.05.19, 18:08
Как структурный подход является лишь списком рекомендаций, позволяющий просто и с меньшим влиянием человеческого фактора писать сложные и масштабируемые программные комплексы, так и ООП суть просто набор рекомендаций для проектирования таких вот сложных и масштабируемых программных комплексов. Нынче туда всучивают инкапсуляцию, наследование и полиморфизм как киты ООП, без которых его как бы и нет. Тогда как в реальности они лишь средства для достижения тех целей, которые парадигма ООП призвана сделать достижимыми.

Автор: Flex Ferrum 20.05.19, 18:08
Цитата D_KEY @
Я не спорю с представлением об ООП.

Ты отрицаешь его наличие.

Автор: D_KEY 20.05.19, 18:10
Цитата Flex Ferrum @
А отсылать к Бочу или Мейеру - зачем?

Я читал, спасибо. Неплохое описание практик :)

Добавлено
Цитата Qraizer @
Как структурный подход является лишь списком рекомендаций, позволяющий просто и с меньшим влиянием человеческого фактора писать сложные и масштабируемые программные комплексы, так и ООП суть просто набор рекомендаций для проектирования таких вот сложных и масштабируемых программных комплексов.

Именно. Согласен.

Добавлено
Цитата Flex Ferrum @
И статьи очередного неосилятора на хабре.

Статья хреновая, кстати.

Автор: Flex Ferrum 20.05.19, 18:17
В таком случае процедурного, функционального, аспектного, событийного и прочих подходов тоже не существует, ибо всё это - лишь набор практик разной степени эффективности. <_<

Автор: D_KEY 20.05.19, 18:21
Цитата Flex Ferrum @
В таком случае процедурного

Разбиение программы на процедуры.

Цитата
функционального

Представление процесса вычисления в виде вычисления функций в математическом смысле. Хорошо формализовано.

Цитата
аспектного

Практически не применял и очень мало знаю.

Автор: Flex Ferrum 20.05.19, 19:35
Цитата D_KEY @
Разбиение программы на процедуры.

Можно делить, можно не делить. Простейшая декомпозиция, один из примитивных инструментов. Зачем отдельный подход для этого выделять? :)

Цитата D_KEY @
Представление процесса вычисления в виде вычисления функций в математическом смысле.

Если я переименую процедуры в функции - вроде то же самое получу. А ещё в Паскале функции были. Разве это повод для выделения отдельного, специального подхода? :D

На самом деле, не ясно, чем тебе тогда да хотя бы Кеевское определение ООП не устраивает. :D Выглядит как простая упёртость в стиле двойных стандартов. :) Ну или, проще говоря, жопа есть, а слова, получается, нету. Будем называть "жопу" как набор признаков: две булки, щель между ними, а в щели - анальный сфинктор. :)

Автор: Qraizer 20.05.19, 20:59
:lool:
Мда. Любая хрень с этими признаками безусловно будет жопой. Вот только жопа не обязательно обладает этими признаками. Иногда это завтра дидлайн.

Автор: Астарот 21.05.19, 06:49
Цитата D_KEY @
Представление процесса вычисления в виде вычисления функций в математическом смысле. Хорошо формализовано.

То есть нельзя программировать функционально не в математическом смысле? :D А что такое вообще "математический смысл"? Дай определение, будь ласка :)

Автор: applegame 21.05.19, 07:30
Вся наша жизнь в нашем же понимании - куча объектов взаимодействующих друг с другом. Поэтому не удивительно, что любое программирование в конечном итоге немного ООП, даже если вы на ассемблере тыкаете регистры процессора.

Лично я, в последнее время избегаю термина "ООП" в аргументации. По мне, разделение проходит по оси императивность/функциональность, так как именно на этой границе рвутся шаблоны из-за иммутабельности и (прости господи) чистоты функций.

Автор: Астарот 21.05.19, 07:32
Цитата applegame @
Вся наша жизнь в нашем же понимании - куча объектов взаимодействующих друг с другом. Поэтому не удивительно, что любое программирование в конечном итоге немного ООП, даже если вы на ассемблере тыкаете регистры процессора.

Наша жизнь с тем же успехом событийно-ориентирована :) Так что в топку это все, давайте писать код :D

Автор: Flex Ferrum 21.05.19, 07:36
Ну так ООП - это про дизайн, а не про императивщину/функциональщину. :)

Автор: Астарот 21.05.19, 07:40
Цитата Flex Ferrum @
Ну так ООП - это про дизайн, а не про императивщину/функциональщину. :)

Так и он про
Цитата applegame @
разделение проходит

И в чем-то прав, поскольку разделение, по крайней мере в мозгах программистов, нынче проходит именно тут.

Автор: Flex Ferrum 21.05.19, 08:27
Цитата Астарот @
И в чем-то прав, поскольку разделение, по крайней мере в мозгах программистов, нынче проходит именно тут.

Да. В этом он прав. Но ООП - оно ведь вообще не про это, если рассудить то. ООП про то, как дизайнить. А имплементить ты можешь хоть императивно, хоть функционально, хоть квадратно-гнездово на CSS... :D Поэтому и вопрос D_KEY'я (про кусок кода) немного, гм, странен.

Автор: D_KEY 21.05.19, 10:18
Цитата applegame @
Лично я, в последнее время избегаю термина "ООП" в аргументации. По мне, разделение проходит по оси императивность/функциональность, так как именно на этой границе рвутся шаблоны из-за иммутабельности и (прости господи) чистоты функций.

+1

Добавлено
Цитата Астарот @
А что такое вообще "математический смысл"? Дай определение, будь ласка :)

https://ru.m.wikipedia.org/wiki/Функция_(математика)

Добавлено
Цитата Flex Ferrum @
Если я переименую процедуры в функции - вроде то же самое получу. А ещё в Паскале функции были. Разве это повод для выделения отдельного, специального подхода? :D

Есть повод или нет, но разделение четкое.

Цитата
На самом деле, не ясно, чем тебе тогда да хотя бы Кеевское определение ООП не устраивает. :D

Тем, что в узком смысле под него не попадает почти ничего из существующих систем (а большинство языком не имеет поддержки ООП). А в широком - почти все из существующих :)
Бесполезное определение.

Цитата
Ну или, проще говоря, жопа есть, а слова, получается, нету. Будем называть "жопу" как набор признаков: две булки, щель между ними, а в щели - анальный сфинктор. :)

Так а что делать, если сторонники того, что у ООП есть четкое определение, вместо того, чтобы его озвучить, как раз занимаются перечислением признаков и еще учат, как дизайнить по ООП :-?

Добавлено
Цитата Flex Ferrum @
Поэтому и вопрос D_KEY'я (про кусок кода) немного, гм, странен.

Зависит от того, ради чего задается вопрос :)

Автор: Flex Ferrum 21.05.19, 10:39
Цитата D_KEY @
Так а что делать, если сторонники того, что у ООП есть четкое определение, вместо того, чтобы его озвучить

Озвучивал. Здесь: ООП - в топку! (сообщение #3799452)

Прекрасное определение. Если тебя оно не устраивает - :-? Значит, чего-то ты перестал понимать. Или не хочешь. Или толсто троллишь. Ещё раз (для тех, кто в танке). ООП - это не про написание кода. Это про его дизайн. Писать ты можешь хоть на ассемблере, хоть в машинных кодах с любой подходящей для этого парадигмой.

Автор: korvin 21.05.19, 10:39
Цитата Flex Ferrum @
Расскажи, как применяются принципы SOLID при процедурном подходе.

S — каждая процедура выполняет «что-то одно».
O — для любой процедуры можно написать другую, с такой же сигнатурой, выполняющую какой-то дополнительный код + код исходной процедуры. Также можно воспользоваться замыканиями, если язык позволяет.
L — такая расширенная процедура будет являться (с некоторыми оговорками, справедливыми, впрочем и для классов) подтипом оригинальной. Также можно воспользоваться замыканиями, если язык позволяет.
I — см. S, всё аналогично.
D — передача процедур/указателей-на-процедуры как параметров в другие процедуры.

Автор: Астарот 21.05.19, 10:49
Цитата Flex Ferrum @
хоть квадратно-гнездово на CSS... :D

Молчи! *** Даже не вздумай повторять! :D
M
Не надо так. Даже с благими намерениями.



Слово "смысл" там встречается четырежды, и ни разы не в твоем новоявленном "математическом смысле". Так что же это такое?

Автор: D_KEY 21.05.19, 10:56
Цитата Астарот @

Слово "смысл" там встречается четырежды, и ни разы не в твоем новоявленном "математическом смысле". Так что же это такое?

Чего? Я тебе дал ссылку на определение функции в математике. Это и есть "функция в математическом смысле".

Автор: Wound 21.05.19, 11:03
Цитата D_KEY @
Чего? Я тебе дал ссылку на определение функции в математике. Это и есть "функция в математическом смысле".

Довольно странно. Когда тебе дают определение на ООП в программировании, тебя это не устраивает почему то. А тут прям аргумент такой. Ссылку он дал. По твоей ссылке слишком расплывчатое определение. Не прокатывает оно.

Автор: Астарот 21.05.19, 11:04
Цитата D_KEY @
Чего? Я тебе дал ссылку на определение функции в математике. Это и есть "функция в математическом смысле".

Ты говорил про програмирование "в математическом смысле", а не про математику.

Автор: D_KEY 21.05.19, 11:14
Цитата Wound @
Когда тебе дают определение на ООП в программировании, тебя это не устраивает почему то

И я объяснил почему :)
Кроме того, вон у Флекса другое определение ;)

Добавлено
Цитата Астарот @
Ты говорил про програмирование "в математическом смысле"

Нет, я говорил про функции в математическом смысле. Возможно, коряво выразился.

Автор: OpenGL 21.05.19, 11:17
Цитата Flex Ferrum @
хоть квадратно-гнездово на CSS...

Цитата Астарот @
Молчи! *** Даже не вздумай повторять!

А вот после этого восклицания мне даже интересно стало, о чём речь идёт :D

Автор: D_KEY 21.05.19, 11:19
Цитата Flex Ferrum @
Цитата D_KEY @
Так а что делать, если сторонники того, что у ООП есть четкое определение, вместо того, чтобы его озвучить

Озвучивал. Здесь: ООП - в топку! (сообщение #3799452)

Прекрасное определение.

Давай чуть с другой стороны зайдем. Зачем нужно это определение, как и когда ты его используешь?

Автор: korvin 21.05.19, 11:22
Цитата
Object-oriented software construction is the building of software systems as
structured collections of possibly partial abstract data type implementations.


Т.е. если в системе, возможно есть (а возможно и нет?) АТД — это ООП? И почему, вдруг, структурированная коллекция. В сферическом ООП каждый объект живёт своей жизнью, какая тут структурированность? Или тут имеется в виду инкапсуляция (мол объекты взаимодействуют друг с другом только через интерфейсы)? Чем это тогда отличается от модульности?

Автор: Астарот 21.05.19, 11:32
Цитата D_KEY @
Нет, я говорил про функции в математическом смысле. Возможно, коряво выразился.

Я тебе напомню, что именно ты говорил:
Цитата Flex Ferrum @
В таком случае процедурного, функционального, аспектного, событийного и прочих подходов тоже не существует, ибо всё это - лишь набор практик разной степени эффективности. <_<


Цитата D_KEY @
Цитата
функционального

Представление процесса вычисления в виде вычисления функций в математическом смысле. Хорошо формализовано.



Цитата OpenGL @
А вот после этого восклицания мне даже интересно стало, о чём речь идёт :D

Смотри, какая наркомания https://habr.com/ru/post/267701/

Автор: D_KEY 21.05.19, 11:35
Цитата Астарот @
Цитата D_KEY @
Нет, я говорил про функции в математическом смысле. Возможно, коряво выразился.

Я тебе напомню, что именно ты говорил:
...
Цитата D_KEY @
Цитата
функционального

Представление процесса вычисления в виде вычисления функций в математическом смысле.

Т.е. "в математическом смысле" относится к функциям.

Автор: Астарот 21.05.19, 12:24
Цитата D_KEY @
Т.е. "в математическом смысле" относится к функциям.

Т.е. тебе сказали про функциональный подход в программировании, а ты зачем-то стал говорить про математические функции, и до сих пор не можешь пояснить, как одно связано с другим :)

Автор: D_KEY 21.05.19, 12:34
Цитата Астарот @
Цитата D_KEY @
Т.е. "в математическом смысле" относится к функциям.

Т.е. тебе сказали про функциональный подход в программировании, а ты зачем-то стал говорить про математические функции, и до сих пор не можешь пояснить, как одно связано с другим :)

Я не понимаю тебя.

Автор: Flex Ferrum 21.05.19, 12:35
Цитата D_KEY @
Давай чуть с другой стороны зайдем. Зачем нужно это определение, как и когда ты его используешь?

Какие-то новые странные вопросы. Определение нужно для того, чтобы описать границы термина. В данном случае ООП. Зачем нужно определение функционального или процедурного программирования? А само это определение я нигде и никак не использую, только вот в спорах типа этого. Когда мне нужно дизайнить очередную систему - я беру и дизайню согласно подходу, описываемому этим определением.

Цитата korvin @
Т.е. если в системе, возможно есть (а возможно и нет?) АТД — это ООП?

Нет. В программировании на ассемблере используются данные, размещённые в регистрах Означает ли, что программирование на ассемблере - априори ООП?

Цитата korvin @
И почему, вдруг, структурированная коллекция. В сферическом ООП каждый объект живёт своей жизнью, какая тут структурированность? Или тут имеется в виду инкапсуляция (мол объекты взаимодействуют друг с другом только через интерфейсы)? Чем это тогда отличается от модульности?

Я не знаю, что такое "сферический ООП". Я применяю конкретные методики для решения конкретных задач. :) Структурированный - это, очевидно, имеющий некую внутренню структуру, взаимосвязи. Дизайн системы направлен на решение конкретных задач. Поэтому скоуп задачи (требования и т. п.) задают архитектуру связей. Но узлами этой сети являются объекты. От модульности это отличается тем, что модуль - это (в моём и, вроде, традиционном понимании) единица логической компоновки некоего функционала, контейнер функций и (возможно) данных. Причём данные эти - глобальны для всего модуля. Это немного другой уровень. Объект в ООП (в моём и, вроде, традиционном понимании) - это отражение некоей сущности из предметной области задачи, обладающий определёнными свойствами и поведением. Это элемент логической структуры дизайна системы, а не структуры компоновки/деплоймента.

Автор: OpenGL 21.05.19, 12:36
Цитата Астарот @
Смотри, какая наркомания https://habr.com/ru/post/267701/

Забавно :)

Автор: Астарот 21.05.19, 12:38
Цитата D_KEY @
Я не понимаю тебя.

Что ж тут непонятного-то? :D Начинаешь ты с того, что от всех и каждого требуешь определения ООП, при этом отвечая на реплику Флекса про функциональный подход рожаешь в связи с ним некий "математический смысл", но когда уже тебя спрашивают, что же это должно обозначать начинаешь вертеться, давать малопонятные ссылки и вообще апеллировать к абстрактной математике, о которой никто ни до, ни после не говорил :D

Добавлено
Цитата Flex Ferrum @
Какие-то новые странные вопросы

По-моему ему наскучило общаццо с христанутыми в самой долгоживущей теме этого форума, но методы дискуссии остались те же :D

Автор: D_KEY 21.05.19, 12:42
Цитата Астарот @
рожаешь в связи с ним некий "математический смысл"

:facepalm:
Я просто пояснил, что термин "функция" берется из математики. Все.

Автор: Wound 21.05.19, 12:45
Цитата D_KEY @
И я объяснил почему

Где? Привел чувака, который не согласен с тем, что С++ считается ОО языком? Крутое объяснение. Больше объяснений от тебя не было, если не считать попытки сравнивать строки между собой.

Цитата D_KEY @

Кроме того, вон у Флекса другое определение

У него не другое определение, у него оно более общее и тоже правильное, без всяких деталей. Или ты как operator== работаешь? Строки не совпали, вернул false, я не понимаю ?
Все определения, которые ты тут приводил, якобы разные - не противоречат друг другу по смыслу.

Автор: Астарот 21.05.19, 12:45
Цитата D_KEY @
Я просто пояснил, что термин "функция" берется из математики. Все.

Уверен, тот, кто тебя спрашивал, что такое функция, остался твоим ответом доволен.

Автор: Flex Ferrum 21.05.19, 12:46
Цитата D_KEY @
Я просто пояснил, что термин "функция" берется из математики. Все.

Скажи, а если я напишу в коде:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    double sqr(double x) {return x * x;}

- это будет функциональным программированием? :D

Автор: Астарот 21.05.19, 12:47
Цитата Flex Ferrum @
Цитата D_KEY @
Я просто пояснил, что термин "функция" берется из математики. Все.

Скажи, а если я напишу в коде:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    double sqr(double x) {return x * x;}

- это будет функциональным программированием? :D

А если ты еще навесишь листенер на вызов функции, то вообще оно станет событийным :D

Автор: Flex Ferrum 21.05.19, 12:51
Цитата Астарот @
А если ты еще навесишь листенер на вызов функции, то вообще оно станет событийным

Правда? :D А ещё вот так вот можно:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void sqr(double x, callback cb)
    {
        cb(x * x);
    }

:D

Автор: Астарот 21.05.19, 12:54
Цитата Flex Ferrum @
Правда? :D А ещё вот так вот можно:

Ай-ай-ай, как не чисто! Что ж ты, гад, побочный эффект подсовываешь? :D

Автор: Flex Ferrum 21.05.19, 12:55
Цитата Астарот @
Ай-ай-ай, как не чисто! Что ж ты, гад, побочный эффект подсовываешь?

Это это, как её... Ну... Это, слово страшное... Манд... Монд... Во! Монада! :D

Автор: D_KEY 21.05.19, 12:55
Цитата Flex Ferrum @
Определение нужно для того, чтобы описать границы термина. В данном случае ООП

И насколько точно, на твой взгляд, эти границы определяет то определение, что ты привел? :)

Добавлено
Цитата Астарот @
Цитата D_KEY @
Я просто пояснил, что термин "функция" берется из математики. Все.

Уверен, тот, кто тебя спрашивал, что такое функция, остался твоим ответом доволен.

Так вот функциональное программирование и заключается в том, что ты строишь программу в виде вычисления вот таких вот функций.

Добавлено
Цитата Flex Ferrum @
это будет функциональным программированием? :D

Пока это просто определение функции.

Автор: Астарот 21.05.19, 13:05
Цитата Flex Ferrum @
Это это, как её... Ну... Это, слово страшное... Манд... Монд... Во! Монада! :D

Может хоть ты объяснишь что это такое? :D

Цитата D_KEY @
Так вот функциональное программирование и заключается в том, что ты строишь программу в виде вычисления вот таких вот функций.

Я бы сказал: "Спасибо, Кэп!", если бы спрашивал об этом.

Автор: D_KEY 21.05.19, 13:06
Цитата Астарот @
если бы спрашивал об этом.

Так о чем же ты спрашивал тогда?

Автор: Астарот 21.05.19, 13:10
Вообще забавно наблюдать, как в подобных спорах говорят о проектировании систем, а потом приводят строчку кода, и начинают рассуждать ООП это, или функциональщина :) При этом если-таки посмотреть на более-менее большую систему, то можно заметить, что в коде на java, в котором никуда не сбежать ни от классов, ни от интерфейсов, ни от наследования с полиморфизмом, тут и там встречается вполне себе функциональщина, типа стримов с лямбдами, или монад из vavr'а, а чуть в стороне, благодаря Spring, тут и там раскиданы bean post processor'ы, которые вполне себе аспекты, а то и вообще AspectJ найти можно. А если по соседству болтается что-нибудь типа кролика, а в коде висит листенер на очередь, то можно начинать рассматривать происходящее, как событийно ориентированную систему. И все это - один и тот же код :D

Автор: D_KEY 21.05.19, 13:11
Цитата Астарот @
Цитата Flex Ferrum @
Это это, как её... Ну... Это, слово страшное... Манд... Монд... Во! Монада! :D

Может хоть ты объяснишь что это такое? :D

Обсуждали уже. Можно вот тут посмотреть.

Автор: Астарот 21.05.19, 13:11
Цитата D_KEY @
Так о чем же ты спрашивал тогда?

Что такое "в математическом смысле" относительно функционального подхода. Дай, пожалуйста, четкое определение.

Автор: D_KEY 21.05.19, 13:11
Цитата Астарот @
Вообще забавно наблюдать, как в подобных спорах говорят о проектировании систем, а потом приводят строчку кода, и начинают рассуждать ООП это, или функциональщина :) При этом если-таки посмотреть на более-менее большую систему, то можно заметить, что в коде на java, в котором никуда не сбежать ни от классов, ни от интерфейсов, ни от наследования с полиморфизмом, тут и там встречается вполне себе функциональщина, типа стримов с лямбдами, или монад из vavr'а, а чуть в стороне, благодаря Spring, тут и там раскиданы bean post processor'ы, которые вполне себе аспекты, а то и вообще AspectJ найти можно. А если по соседству болтается что-нибудь типа кролика, а в коде висит листенер на очередь, то можно начинать рассматривать происходящее, как событийно ориентированную систему. И все это - один и тот же код :D

Согласен. Надо же.

Автор: Астарот 21.05.19, 13:13
Цитата D_KEY @
Обсуждали уже. Можно вот тут посмотреть.

Я еще тогда прочитал, но что такое монада - так и не понял :D Кстати, а что такое "do-нотация"? А то который раз слышу, но определения не знаю :D

Автор: D_KEY 21.05.19, 13:13
Цитата Астарот @
Цитата D_KEY @
Так о чем же ты спрашивал тогда?

Что такое "в математическом смысле" относительно функционального подхода. Дай, пожалуйста, четкое определение.

:facepalm: Еще раз. "В математическом смысле" относилось к "функциям". Т.е. эта часть фразы означает лишь то, что под "функцией" понимается то же, что в математике.

Автор: D_KEY 21.05.19, 13:16
Цитата Астарот @
Кстати, а что такое "do-нотация"?

Это синтаксический сахар для цепочки.
Вместо
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        main =
            putStrLn "What is your name?" >>
            getLine                       >>= \name ->
                putStrLn ("Nice to meet you, " ++ name ++ "!")

Пишем проще:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        main = do
            putStrLn "What is your name?"
            name <- getLine
            putStrLn ("Nice to meet you, " ++ name ++ "!")


Но это одно и то же.

Автор: Астарот 21.05.19, 13:16
Цитата D_KEY @
Согласен. Надо же.

Тогда с чем ты споришь? ООП - это не про код, это про твой взгляд на код. Взаимосвязь объектов может рассматриваться, как ООП, но никто не мешает этой совокупности объектов выступать в роли аспекта, а значит их же - не такие же объекты, а эти же! - можно рассматривать как часть аспектно-ориенированного кода. То есть то, о чем говорит Флекс - это все про дизайн, про подход, про взгляд на вещи.

Добавлено
Цитата D_KEY @
:facepalm: Еще раз. "В математическом смысле" относилось к "функциям". Т.е. эта часть фразы означает лишь то, что под "функцией" понимается то же, что в математике.

:facepalm: Если ты ищещь но никак не можешь найти, то подсказываю - без побочных эффектов. Что совершенно не мешает функциональному подходу работать с более-менее грязными функциями.

Автор: D_KEY 21.05.19, 13:18
Т.е. как если бы в том моем говнокоде на плюсах:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        auto io_main =
            putLine("What is your name?") >>
            getLine(unit{})               >>= [=](auto name) {
                return putLine("Nice to meet you, " + name + "!");
            };


Можно было бы написать примерно так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        auto io_main = do {
            putLine("What is your name?");
            name <- getLine(unit{});
            return putLine("Nice to meet you, " + name + "!");
        };

Но C++ ничего подобного не позволяет сделать, насколько я понимаю.

Автор: Астарот 21.05.19, 13:19
Цитата D_KEY @
Это синтаксический сахар для цепочки.

То есть f(a(b(),c())) - это тоже do-нотация?

Автор: D_KEY 21.05.19, 13:19
Цитата Астарот @
Тогда с чем ты споришь?

С наличием четкого и вменяемого определения ООП.

Автор: Астарот 21.05.19, 13:20
Цитата D_KEY @
в том моем говнокоде на плюсах

Очень похоже на перл, как по мне :D

Автор: korvin 21.05.19, 13:21
Цитата Flex Ferrum @
Нет.

Так в той же цитате написано, что да.

Цитата Flex Ferrum @
Структурированный - это, очевидно, имеющий некую внутренню структуру, взаимосвязи.

Как это всё относится к ООП? Если программа не в ООП-стиле, то она априори не сруктурирована?

Автор: Астарот 21.05.19, 13:21
Цитата D_KEY @
С наличием четкого и вменяемого определения ООП.

Так как это про подход, то таких определений может быть множество, и каждое из них будет в равной мере правильным и не правильным. Правильным в той части которая соответствует подходу того, кто дает определение, и не правильной для всех у кого подход отличается.

Автор: D_KEY 21.05.19, 13:34
Цитата Астарот @
Так как это про подход, то таких определений может быть множество, и каждое из них будет в равной мере правильным и не правильным. Правильным в той части которая соответствует подходу того, кто дает определение, и не правильной для всех у кого подход отличается.

Так я примерно это и говорил :) Набор практик. Но это же и означает, что четкого определения нет. Но некоторые вот считают, что знают истину.

Автор: Wound 21.05.19, 13:44
Цитата D_KEY @
С наличием четкого и вменяемого определения ООП.

Давай зайдем с другой стороны. Вот нонче приобрела популярность некая технология. Основные принципы которой - все есть объекты(ну или почти все), выделение общего в интерфейсы, наследование свойств и поведения - чтобы не дублировать код, инкапсуляция деталей, что бы тот кто это использовал не думал о том, как это устроено внутри и т.д. И вот такой подход начинает применяться везде и всюду. Как ты предлагаешь поступить ? Везде писать я использую вот это и портянку такую, или как?
Я так понимаю тебя не интересует как оно есть на самом деле на практике, тебя интересует чисто философская сторона вопроса. Мол де. Вот смотрите, у меня есть инструкция mov, принимает два аргумента, куда и откуда, mov - это у нас интерфейс, откуда - объект и куда - объект. censored, да тут же ООП. Че в ассемблере ООП? Очень расплывчатая формулировка, ниче не понять. Так что ли?

Автор: Астарот 21.05.19, 13:48
Цитата D_KEY @
Но это же и означает, что четкого определения нет.

Это значит, что четких определений много. Это примерно, как с термином "человек" - четкого определения дать не получится, однако это вовсе не значит, что мы не знаем, что такое человек.

Автор: Wound 21.05.19, 13:49
Цитата D_KEY @
Набор практик.

Вообще то это парадигма, а не набор практик.

Автор: Астарот 21.05.19, 13:56
Цитата D_KEY @
Но некоторые вот считают, что знают истину.

Ну, да. Ты, например :)

Автор: Qraizer 21.05.19, 13:56
Цитата D_KEY @
Но C++ ничего подобного не позволяет сделать, насколько я понимаю.
Не понял...
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    auto io_main = []() {
            putLine("What is your name?");
            auto name = getLine(unit{});
            return putLine("Nice to meet you, " + name + "!");
        }();

Автор: D_KEY 21.05.19, 14:01
Цитата Qraizer @
Цитата D_KEY @
Но C++ ничего подобного не позволяет сделать, насколько я понимаю.
Не понял...
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    auto io_main = []() {
            putLine("What is your name?");
            auto name = getLine(unit{});
            return putLine("Nice to meet you, " + name + "!");
        }();

Для монад. Сходи по ссылке, если время есть. Я там для иллюстрации накидал реализацию монад на крестах.

Добавлено
Начало где-то тут

Добавлено
Про IO

Добавлено
Цитата Qraizer @
Не понял...

Нужно перегрузить оператор ';'(если бы он был).

Автор: D_KEY 21.05.19, 15:31
Цитата D_KEY @
Цитата Qraizer @
Не понял...

Нужно перегрузить оператор ';'(если бы он был).

И еще нужен сахар для того, чтобы писать в духе:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    value <- func();
    // use value

А получалось:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    func() >>= [](auto value) {
    // use value
    }

Автор: Qraizer 21.05.19, 16:46
D_KEY, зачем это всё? Что не так? Объясни Астарот-у, почему это важно. По-твоему что, есть разница между Плюсовым a=b и Паскальным a:=b, что ли?

Автор: korvin 21.05.19, 16:56
Цитата Qraizer @
По-твоему что, есть разница между Плюсовым a=b и Паскальным a:=b, что ли?

Это тут при чём?

Автор: D_KEY 21.05.19, 17:04
Цитата Qraizer @
D_KEY, зачем это всё?

Тот мой код? Исключительно для иллюстрации.

Цитата
Что не так?

С чем?

Цитата
Объясни Астарот-у, почему это важно.

Он спросил про монады и do-нотацию. Что именно ты имеешь в виду?

Цитата
По-твоему что, есть разница между Плюсовым a=b и Паскальным a:=b, что ли?

Нет. Тут суть в том, что ты уходишь от разрушающего присваивания и передаешь значение по цепочке следующей функции.

Добавлено
Если что, я не предлагаю так писать на плюсах :lol:

Автор: Flex Ferrum 21.05.19, 17:06
Цитата D_KEY @
Цитата Flex Ferrum @
Определение нужно для того, чтобы описать границы термина. В данном случае ООП

И насколько точно, на твой взгляд, эти границы определяет то определение, что ты привел? :)

Вполне чётко. Ровно в той же степени, в какой определение функционального подхода описывает его границы. Данное определение даёт понять, с чем именно и как оперирует ОО- парадигма. :)

Добавлено
Цитата D_KEY @
Добавлено
Цитата Flex Ferrum @
это будет функциональным программированием? :D

Пока это просто определение функции.

Если это - всего лишь определение функции, но ещё не функциональный подход, то как (по твоему мнению) две приведённые тобою строчки кода могут относиться к ООП? Тут либо трусы снять, либо крестик надеть. Иначе никак. :)

Автор: D_KEY 21.05.19, 17:11
Цитата Flex Ferrum @
то как (по твоему мнению) две приведённые тобою строчки кода могут относиться к ООП?

Я и не утверждал, что они относятся.

Автор: Flex Ferrum 21.05.19, 17:12
Цитата korvin @
Цитата Flex Ferrum @
Нет.

Так в той же цитате написано, что да.

Цитата Flex Ferrum @
Структурированный - это, очевидно, имеющий некую внутренню структуру, взаимосвязи.

Как это всё относится к ООП? Если программа не в ООП-стиле, то она априори не сруктурирована?

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

Автор: D_KEY 21.05.19, 17:13
Цитата Flex Ferrum @
Данное определение даёт понять, с чем именно и как оперирует ОО- парадигма. :)

А дает ли оно понять, является ли некая система ОО?

Автор: Flex Ferrum 21.05.19, 17:13
Цитата D_KEY @
Цитата Flex Ferrum @
то как (по твоему мнению) две приведённые тобою строчки кода могут относиться к ООП?

Я и не утверждал, что они относятся.

Но задавая вопрос ты предполагал, что ответ может быть утвердительным, так? Если нет, то в чём был смысл вопроса?

Добавлено
Цитата D_KEY @
Цитата Flex Ferrum @
Данное определение даёт понять, с чем именно и как оперирует ОО- парадигма. :)

А дает ли оно понять, является ли некая система ОО?

Да.

Добавлено
С поправкой: дизайн системы.

Автор: D_KEY 21.05.19, 17:15
Цитата Flex Ferrum @
Но задавая вопрос ты предполагал, что ответ может быть утвердительным, так?

Конечно. Я же спрашиваю мнение людей, они бывают разными.

Цитата
Если нет, то в чём был смысл вопроса?

Уточнить позицию участников.

Цитата
Да.

Сможешь рассказать на примере stdio.h почему является и на примере STL, почему нет?

Автор: Астарот 21.05.19, 17:22
А чё сразу я?! :D

Автор: korvin 21.05.19, 18:16
Цитата Flex Ferrum @
Но может лучше тратить время более конструктивно?

Да, например, не писать пространную воду, выдавая её за что-то осмысленное.

Автор: Fester 22.05.19, 06:02
Цитата Астарот @
А чё сразу я?!

Это старая добрая традиция - все темы сводятся либо к бабам, либо к Астароту :)

Автор: Qraizer 22.05.19, 11:25
Цитата D_KEY @
Нет. Тут суть в том, что ты уходишь от разрушающего присваивания и передаешь значение по цепочке следующей функции.
А его там и не было. Там была инициализация. Не веришь, добавь const.
D_KEY, если ты действительно хочешь объяснить кому-либо что-либо, делай это правильно, и не намёками.

Добавлено
Цитата D_KEY @
Для монад. Сходи по ссылке, если время есть. Я там для иллюстрации накидал реализацию монад на крестах.
Примерами сыт не будешь. Объяснять разницу между монадами и лямбдами на примерах всё равно что между интерфейсами и абстрактными классами.

Автор: D_KEY 22.05.19, 11:33
Цитата Qraizer @
Цитата D_KEY @
Нет. Тут суть в том, что ты уходишь от разрушающего присваивания и передаешь значение по цепочке следующей функции.
А его там и не было.

Где там? Я про общую ситуацию.

Цитата
D_KEY, если ты действительно хочешь объяснить кому-либо что-либо, делай это правильно, и не намёками.

А ты задай вопрос нормально :)

Цитата
Объяснять разницу между монадами и лямбдами на примерах

О какой разнице между монадами и лямбдами идет речь?

Автор: applegame 23.05.19, 09:52
Цитата Астарот @
Я еще тогда прочитал, но что такое монада - так и не понял Кстати, а что такое "do-нотация"? А то который раз слышу, но определения не знаю
Дело в том, что в "настоящих" функциональных языках вроде х-я нет встроенной возможности вызывать функции последовательно друг за другом. Так как тотально отсутствуют языковые конструкции вроде циклов, блоков и т.п. А в реальной жизни время имеет очень важную роль, а последовательность операций следующих друг за другом во времени, мягко говоря, обычнейшее дело. В х-е же есть только вызовы функций которые могут вызывать другие функции, полиморфизм, паттерн-матчинг и прочие list comprehensions. Это еще усугублено тотальной ленивостью: пока результат не нужен функция выполняться не будет. Тогда ФП-фаги придумали костыль (они это считают наоборот величайшим благом) - do-нотацию, которая представляет из себя языковую конструкцию оборачивающую все говно в монаду и позволяющую таки просто тупо написать список операций и они, о бозе!, будут выполнены в том порядке в котором написаны в исходном коде.
Механизм примитивен: функция, результат которой является аргументом другой функции физически должна быть вычислена раньше, чем эта самая другая функция. Вот do-нотация и превращает список операций в кучу функций, результаты которых являются аргументами других функций, результаты которых являются аргументами других функций... Все это является одним из видов монад.

Любой нормальный язык дает возможность все это сделать без специальных do-нотаций. В сиобразных языках достаточно поставить точку с запятой, вот тебе и последовательность операций. Так сказать, неявная do-нотация.
В этом плане erlang представляет из себя некий компромисс: это иммутабельный ФЯ с возможностью писать грязные функции и написанные друг за другом вызовы функций будут вызваны именно в том порядке в котором они написаны, такая же неявная do-нотация.

Автор: Flex Ferrum 23.05.19, 10:15
Цитата applegame @
Любой нормальный язык дает возможность все это сделать без специальных do-нотаций. В сиобразных языках достаточно поставить точку с запятой, вот тебе и последовательность операций. Так сказать, неявная do-нотация.

Именно поэтому меня веселят любые попытки притащить монады в императивные языки. :)

Автор: D_KEY 23.05.19, 11:02
Цитата applegame @
Любой нормальный язык дает возможность все это сделать без специальных do-нотаций. В сиобразных языках достаточно поставить точку с запятой, вот тебе и последовательность операций. Так сказать, неявная do-нотация.

Но только для одного вида монад. В haskell ты можешь использовать do-нотацию для работы со списками, Maybe(опциональные значения) и любыми другими монадами, не только IO.

Добавлено
Цитата Flex Ferrum @
любые попытки притащить монады в императивные языки. :)

А разве есть такие попытки?

Автор: Астарот 23.05.19, 11:19
Цитата applegame @
Цитата Астарот @
Я еще тогда прочитал, но что такое монада - так и не понял Кстати, а что такое "do-нотация"? А то который раз слышу, но определения не знаю
Дело в том, что в "настоящих" функциональных языках вроде х-я нет встроенной возможности вызывать функции последовательно друг за другом. Так как тотально отсутствуют языковые конструкции вроде циклов, блоков и т.п. А в реальной жизни время имеет очень важную роль, а последовательность операций следующих друг за другом во времени, мягко говоря, обычнейшее дело. В х-е же есть только вызовы функций которые могут вызывать другие функции, полиморфизм, паттерн-матчинг и прочие list comprehensions. Это еще усугублено тотальной ленивостью: пока результат не нужен функция выполняться не будет. Тогда ФП-фаги придумали костыль (они это считают наоборот величайшим благом) - do-нотацию, которая представляет из себя языковую конструкцию оборачивающую все говно в монаду и позволяющую таки просто тупо написать список операций и они, о бозе!, будут выполнены в том порядке в котором написаны в исходном коде.
Механизм примитивен: функция, результат которой является аргументом другой функции физически должна быть вычислена раньше, чем эта самая другая функция. Вот do-нотация и превращает список операций в кучу функций, результаты которых являются аргументами других функций, результаты которых являются аргументами других функций... Все это является одним из видов монад.

Любой нормальный язык дает возможность все это сделать без специальных do-нотаций. В сиобразных языках достаточно поставить точку с запятой, вот тебе и последовательность операций. Так сказать, неявная do-нотация.
В этом плане erlang представляет из себя некий компромисс: это иммутабельный ФЯ с возможностью писать грязные функции и написанные друг за другом вызовы функций будут вызваны именно в том порядке в котором они написаны, такая же неявная do-нотация.

Доходчиво! Спасибо!

Добавлено
Цитата Flex Ferrum @
Именно поэтому меня веселят любые попытки притащить монады в императивные языки. :)

Цитата D_KEY @
А разве есть такие попытки?

Монады Try и Either в ту же жабу вполне себе притащили, и ничего, удобненько.

Автор: D_KEY 23.05.19, 11:24
Цитата Астарот @
Доходчиво!

Но не совсем верно, посмотри мой коммент выше.

Добавлено
Цитата Астарот @
Монады Try и Either в ту же жабу вполне себе притащили, и ничего, удобненько.

Скорее притащили типы.

Автор: Астарот 23.05.19, 11:26
Цитата D_KEY @
Скорее притащили типы.

Они там вроде и без того были :scratch:

Автор: D_KEY 23.05.19, 11:28
Цитата Астарот @
Цитата D_KEY @
Скорее притащили типы.

Они там вроде и без того были :scratch:

Хм. Тогда что ты имеешь в виду, может я просто не в курсе?

Автор: Астарот 23.05.19, 11:30
Цитата D_KEY @
Хм. Тогда что ты имеешь в виду, может я просто не в курсе?

Я про это, хотя, наверное, это только по названию монады :) https://www.vavr.io/vavr-docs/#_try

Добавлено
Кстати, кажется ныне почившего Армстронга, как-то спросили можно ли в erlang ждать монад, на что тот ответил в том духе, что монада - эта такая херня, которую придумали из-за того, что некоторые языки настолько упороты по математичности, чистоте, и прочей академичности, что писать на них практически невозможно, поэтому и пришлось приволочь туда эту хрень, которая привносит в ФП тонкую нотку императивщины, и что эрлангу, который изначально проектировался, как практичный язык оно в принципе нафиг не нужно :)

Автор: D_KEY 23.05.19, 11:44
Цитата Астарот @
Кстати, кажется ныне почившего Армстронга, как-то спросили можно ли в erlang ждать монад, на что тот ответил в том духе, что монада - эта такая херня, которую придумали из-за того, что некоторые языки настолько упороты по математичности, чистоте, и прочей академичности, что писать на них практически невозможно, поэтому и пришлось приволочь туда эту хрень, которая привносит в ФП тонкую нотку императивщины, и что эрлангу, который изначально проектировался, как практичный язык оно в принципе нафиг не нужно :)

Ну норм ответ :)

Автор: Qraizer 23.05.19, 11:51
Цитата Flex Ferrum @
Именно поэтому меня веселят любые попытки притащить монады в императивные языки.
Я так и не понял, на кой хрен кому-либо может пригодиться в Плюсовом коде переделать Плюсовый синтаксис в Хаскельный. Это же не ленность... блин, уже ж и она в Плюсах есть...

Автор: Астарот 23.05.19, 11:51
Ошибся чутка, это был не Армстронг :)
http://erlang.org/pipermail/erlang-questio...rch/042557.html

Автор: D_KEY 23.05.19, 12:41
Цитата Qraizer @
Я так и не понял, на кой хрен кому-либо может пригодиться в Плюсовом коде переделать Плюсовый синтаксис в Хаскельный.

А кто об этом говорил-то?
И да, монады - это не про синтаксис. Про синтаксис - это do-нотация.

Автор: applegame 23.05.19, 12:42
Цитата Flex Ferrum @
Именно поэтому меня веселят любые попытки притащить монады в императивные языки.
И не только в императивные. В эликсире тоже есть страстные любители тащить монады везде куда дотянутся шаловливые ручонки. Но надо признать, что кое-какие монады и правда пригождаются, но я считаю, что лучше ими не злоупотреблять.

Добавлено
Цитата Астарот @
Кстати, кажется ныне почившего Армстронга, как-то спросили можно ли в erlang ждать монад, на что тот ответил в том духе, что монада - эта такая херня, которую придумали из-за того, что некоторые языки настолько упороты по математичности, чистоте, и прочей академичности, что писать на них практически невозможно, поэтому и пришлось приволочь туда эту хрень, которая привносит в ФП тонкую нотку императивщины, и что эрлангу, который изначально проектировался, как практичный язык оно в принципе нафиг не нужно.
Полностью совпадает с моим мнением. Эрланг (а для меня лично эликсир) - это ФЯ с человеческим лицом и монады в нем особо не нужны, так кое-где немножко синтаксис подсластить.

Автор: Астарот 23.05.19, 13:03
Цитата applegame @
Эрланг (а для меня лично эликсир)

Чем вообще хорош эликсир, кстати говоря? Сахару в нем много, но есть что-то что действительно упрощает жизнь, а не просто слегка сокращает код?

Автор: D_KEY 23.05.19, 13:20
Цитата applegame @
Вот do-нотация и превращает список операций в кучу функций, результаты которых являются аргументами других функций, результаты которых являются аргументами других функций... Все это является одним из видов монад

Не так. do-нотация это сахар над монадами. Т.е. она применима к любым видам монад.

Автор: korvin 23.05.19, 16:20
Астарот, например:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    doSomething()
    .then(result => doSomethingElse(result))
    .then(newResult => doThirdThing(newResult))
    .then(finalResult => {
      console.log(`Got the final result: ${finalResult}`);
    })

https://developer.mozilla.org/en-US/docs/We.../Using_promises

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    do
      result <- doSomething
      newResult <- doSomethingElse result
      finalResult <- doThirdThing newResult
      putStrLn $ "Got the final result: " ++ finalResult

Автор: Астарот 23.05.19, 17:09
Выглядит, как те же яйца, просто в профиль. А киллер-фича какая-нибудь есть? За пример спасибо :yes:

Автор: Астарот 24.05.19, 07:34
Хаскель это просто и понятно, говорили они :D
D7UF4_yW4AAP8e_.jpg_large.jpg (, : 397)

Автор: applegame 24.05.19, 07:34
Цитата Астарот @
Чем вообще хорош эликсир, кстати говоря? Сахару в нем много, но есть что-то что действительно упрощает жизнь, а не просто слегка сокращает код?
Уши эрланга торчат из эликсира повсеместно. Из того что упрощает жизнь: метапрограммирование, адекватный синтаксис, более вменяемая стандартная либа. Меня лично еще напрягает в эрланге невозможность ребиндить переменные.

Автор: JoeUser 24.05.19, 18:18
ООП - прекрасный инструмент в соответствующих условиях и ... руках. Ну все же отлично понимают, что это не панацея?! Если речь идет, к примеру, о программировании какой-либо логической матрицы с 256 выходами и 1024 состояниями (ну очень разреженная матрица), разумнее просто исполнить CASE вариант алгоритма?

Автор: amk 25.05.19, 04:54
Цитата JoeUser @
Если речь идет, к примеру, о программировании какой-либо логической матрицы с 256 выходами и 1024 состояниями
Не уверен, что понял, что ты имеешь в виду под понятием "логическая матрица" (я привык, что под этим понимают микросхему, физически реализующую ДНФ, да, матрицы соединений там как правило очень разреженные). Но ещё более непонятно, каким боком к ним ООП.

Но должен заметить, что ООП прекрасно укладывается в концепцию CASE-систем.

Автор: D_KEY 25.05.19, 13:54
JoeUser, а ты как определяешь ООП?

Автор: korvin 27.05.19, 07:39
Цитата Астарот @
Выглядит, как те же яйца, просто в профиль.

А это и есть те же яйца. Только в статике.

Цитата Астарот @
А киллер-фича какая-нибудь есть?

Какая киллер-фича у интерфейса Collection? Или у интерфейса Iterable?

Цитата Астарот @
Хаскель это просто и понятно, говорили они

А что тут сложного? =)

Моноид — это тройка:
– множество
– бинарная ассоциативная операция над элементами этого множества и возвращающая в качестве результата элемент этого же множества
– нейтральный элемент по отношению к это операции

Пример 1:
– Целые числа
– (+)
– 0

Пример 2:
– Целые числа
– (*)
– 1

Пример 3:
– Строки
– конкатенация
– пустая строка

Пример 4:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    data OrderStat = OS {
        quantity  :: Int,
        totalCost :: Double
    }
     
    instance Monoid OrderStat where
        mempty = OS 0 0.0
        mappend (OS q1 tc1) (OS q2 tc2) = OS (q1 + q2) (tc1 + tc2)


Моноиды удобны для свёрток (в т.ч. параллельных)

Функтор — это, упрощённо, отображение одного множества на другое. Эндофунктор — это функтор, который отображает множество на само себя. Например тип Список является функтором, отображением — функция map (или её "функторный" вариант: fmap):

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    class Functor f where
        fmap :: (a -> b) -> f a -> f b
     
    instance Functor [] where
        fmap f xs = map f xs


Т.е. можно считать, что эндофунктор — это такой контейнерный тип, у которого есть операция map, применяющая к содержимому контейнера некоторую операцию, но сохраняющая сам контейнер.

Моноид в категории эндофункторов:
– множество функций m a -> m b
– композиция функций bind :: (m a -> m b) -> (m b -> m c) -> (m a -> m c)
– функция id :: a -> a (id x = x) — нейтральный элемент

Автор: Астарот 27.05.19, 07:43
Цитата korvin @
А что тут сложного? =)

Держите наркомана! :D

Цитата korvin @
Т.е. можно считать, что эндофунктор — это такой контейнерный тип, у которого есть операция map, применяющаяся к содержимому контейнера некоторую операцию, но сохраняющая сам контейнер.

Во! Можно же понятным языком :D

Там народ угорел, вроде бы даже на фронтенд хаскель тянут. Ну, чисто культ карго, как по мне...

Добавлено
Цитата korvin @
Какая киллер-фича у интерфейса Collection? Или у интерфейса Iterable?

Я спрашивал про киллер-фичу Эликсира против Эрланга. Ну, типа Котлин против Джавы. У Котлина есть парочка фич тянущих на киллер, типа функций-расширений, корутин и делегатов. Думал может у Эликсира что-то такое найдется.

Автор: korvin 27.05.19, 09:54
Цитата Астарот @
Я спрашивал про киллер-фичу Эликсира против Эрланга.

А. Но это шло в твоём же ответе про do-нотацию, как можно было понять, что вопрос про Эликсир?

Добавлено
Цитата Астарот @
Там народ угорел, вроде бы даже на фронтенд хаскель тянут. Ну, чисто культ карго, как по мне...

Как и JS на бэкенде… =)

Автор: Qraizer 27.05.19, 11:29
Цитата korvin @
Моноид — это тройка:
– множество
– бинарная ассоциативная операция над элементами этого множества и возвращающая в качестве результата элемент этого же множества
– нейтральный элемент по отношению к это операции
Ты сейчас процитировал определение абелевой группы. Почти, про обратный элемент промолчал.

Добавлено
А, не, не обязательно абелевой.

Автор: D_KEY 27.05.19, 14:11
Qraizer, моноиды - это понятие из математики, если что.

Автор: JoeUser 02.06.19, 17:08
Цитата amk @
Но ещё более непонятно, каким боком к ним ООП.

Классическая программа осуществляет свое функционирование путем вычислений и переходов, зашитых в программном коде исполняемого файла. По большому счету можно описать вектор N-обработчиков в виде указателей на функции и логическую M-матрицу (матрицу переходов), которую можно грузить как данные. И вся эта кухня будет работать гораздо быстрее реализации в виде ООП. Но только для своей ниши!!! Где данных относительно мало, а алгоритм последовательности их обработки достаточно сложен. Некое недалекое подобие шитого кода.

Цитата D_KEY @
JoeUser, а ты как определяешь ООП?

Если речь идет о "программировании", то тут классика:
- Инкапсуляция
- Наследование
- Полиморфизм
Если речь идет о "проектировании", то понятие ... самоопределимое :-? - проектирование, в котором основная идея - моделирование функционала, как группы взаимодействующих объектов.

Автор: amk 02.06.19, 17:26
Цитата JoeUser @
По большому счету можно описать вектор N-обработчиков в виде указателей на функции и логическую M-матрицу (матрицу переходов), которую можно грузить как данные.
Тогда возникает другой вопрос: где здесь "логические матрицы"?
Цитата JoeUser @
Некое недалекое подобие шитого кода.
Шитый код и есть. Только косвенный шитый код.

Подобный формат имеют метафайлы Windows (wmf, emf), и некоторые другие файлы.
Но использовать адреса переходов (ШК) в хранимых вне программы данных непрактично - такие адреса при любом изменении программы становятся неактуальными, и приходится воспринимать их просто как коды. А коды удобнее брать по порядку, тогда их можно использовать как индексы в таблице переходов (КШК, байт-код).
С кодами работают большинство интерпретаторов.
Ещё быстрее работает, если использовать не таблицу функций, а засунуть все обработчики в switch внутри цикла. В таком варианте получается на один переход меньше - не надо возвращаться из функции.

ООП сильно выигрывает, когда надо работать с множеством однотипных объектов - не приходится каждый раз проверять какого конкретно типа объект в обработке.

Автор: JoeUser 02.06.19, 23:31
Цитата amk @
Тогда возникает другой вопрос: где здесь "логические матрицы"?

Сорь, с терминологией напутал - матрицы переходов.
Цитата amk @
Но использовать адреса переходов (ШК) в хранимых вне программы данных непрактично - такие адреса при любом изменении программы становятся неактуальными

А вот тут как программу писать. Мы же не сами адреса храним, а индексы подпрограмм, в которых, собственно, адреса. Если я не ошибаюсь, это подход Форта?

Автор: JoeUser 03.06.19, 16:55
Цитата amk @
ООП сильно выигрывает, когда надо работать с множеством однотипных объектов - не приходится каждый раз проверять какого конкретно типа объект в обработке.

В случаем с использованием виртуальных функций (сиречь - полиморфизмом), как раз приходится выбирать сперва нужную часть VMT, и только потом нужный адрес функции в ней. Qraizer, хелп - тону!!!

Автор: Qraizer 04.06.19, 13:03
Я командировке :(

Автор: JoeUser 04.06.19, 14:53
Цитата Qraizer @
Я командировке

Ну тогда жду (ждем).

Автор: Wound 04.06.19, 15:06
Цитата JoeUser @
Ну тогда жду (ждем).

Так а че, погуглить не? :huh:
https://ravesli.com/urok-167-virtualnye-tablitsy/
https://rsdn.org/article/devtools/CppPerformance.xml#EKSBG

Автор: JoeUser 05.06.19, 17:35
Цитата Wound @
Так а че, погуглить не?

Гуглить умею. Честное слово. Честное студенческое слово!
Но эти стопицот многобукв Qraizer может выразить двумя-тремя предложениями, я знаю.
И как бы это не смешно звучало - к нему мне доверия на порядок больше, чем к непонятным авторам.

Автор: amk 06.06.19, 00:30
Цитата JoeUser @
Если я не ошибаюсь, это подход Форта?

Ошибаешься. Форт (FORTH) вообще не хранит вне оперативки двоичный код (только исходники, только хардкор). Благо компиляция в шитый код происходит на порядки быстрее, чем в любом другом интерпретаторе.
Хотя есть интерпретаторы, позволяющие записать на диск образ памяти. В самой программе шитый код, как правило, представляет собой просто последовательность абсолютных адресов исполняемых частей статей (так в форте называются определяемые пользователем слова). Для слов, определяемых в машинном коде, там просто находится процедура, выполняющая нужные действия. У слов, определяемых через двоеточие там находится вызов подпрограммы, запускающей интерпретацию шитого кода. Это так называемый прямой шитый код.
Другой разновидностью шитого кода является подпрограммный шитый код, в котором вместе с адресами записываются и команды вызова подпрограмм. Занимая немного больше места, такой шитый код выполняется немного быстрее, так как не использует цикла интерпретации. Использовался в некоторых интерпретаторах для 8-разрядного i8080 и его аналогов. Давал почти трёхкратный прирост скорости, за счёт полуторакратного раздувания кода.
Третий, самый редкий вариант, - использование косвенного шитого кода, когда пишутся индексы (номера) статей. Этот вариант иногда позволяет сократить размер занимаемой памяти, при этом незначительно замедляется цикл интерпретации, и существенно усложняется компиляция. На практике имеет смысл только для очень простых программ, когда номер статьи помещается в один байт (для переменных тоже заводятся статьи), и для 32-разрядных интерпретаторов, когда вместо 4-байтного адреса можно хранить 2-байтный индекс.

Добавлено
Цитата JoeUser @
как раз приходится выбирать сперва нужную часть VMT, и только потом нужный адрес функции в ней
На современных процессорах (а также не очень старых) это делается двумя обращениями в память, без нарушения конвейера выполнения. А для проверки типа нужно не меньшее число обращений в память и по крайней мере одно рвущее работу конвейера сравнение (а может и больше). Для ускорения работы процедурные реализации полиморфизма, как правило, используют некоторое подобие VMT.

Автор: JoeUser 06.06.19, 03:18
amk, спасибо за инфу!!! Особенно про Форт. Если бы не его "польская нотация", наверное я был бы его фанатом. Красивый подход в плане организации. Но писать "задом на перед" ... ну не могу себя уговорить :) Смотрел как-то на его последователя - язык Фактор, та же хрень - интересно, но уговорить себя "перестроиться" не получается :)

Автор: Wound 06.06.19, 07:24
Цитата JoeUser @
И как бы это не смешно звучало - к нему мне доверия на порядок больше, чем к непонятным авторам.

Действительно смешно. То ты пишешь что никому не веришь, и даже в сторону Майерса камни кидаешь, то полагаешься целиком и полностью на ответ Qraizer:-?
Можно ведь в конце концов прочесть несколько источников. По тем ссылкам нет чего то заумного, просто описывается общий механизм работы дин. полиморфизма в С++, который можно прочесть практически в любой, более менее продвинутой книге по С++.

Автор: OpenGL 06.06.19, 07:26
Цитата JoeUser @
В случаем с использованием виртуальных функций (сиречь - полиморфизмом), как раз приходится выбирать сперва нужную часть VMT, и только потом нужный адрес функции в ней.

Нет. У тебя просто есть структура с адресами методов, и просто вызывается метод по данному адресу. Может ты это и имеешь ввиду под "выбирать" - хз, но amk говорил о том, что этим выбором занимаешься не ты => меньше шансов ошибиться.

Автор: JoeUser 06.06.19, 07:32
Wound, давай договоримся - не будем обсуждать САМОГО МЕНЯ :lol:
Давай сосредоточимся на теме топика, это будет гораздо полезнее.

Добавлено
Цитата Wound @
и даже в сторону Майерса камни кидаешь

Дай пожалуйста пруф!!!
Скрытый текст
Я не думаю, что я такой смелый. :blink:

Автор: Wound 06.06.19, 07:47
Цитата JoeUser @
Дай пожалуйста пруф!!!

Да пожалуйста, держи:
Цитата JoeUser @
Философское отступление. Несколько лет назад у меня спала "пелена из глаз". До этого, в течении многого времени, я считал себя заядлым агностиком. Многие вааще не понимали о чем речь. Но пришло осознание - я не агностик или атеист, я - неверующий. Даже религия тут не при чем! Я не верю ваще, ни во что. Полностью. Я пытаюсь воспроизвести и оценить. Гадил я с Пизанской башни на аксиомы "аксакалов". Но ... приду и проверю

... это я кидаю камень в сторону Меерса

Есть "логика", есть высказывания Меерса, есть куча методик шкальных оценок достоверности. Ну и есть чуйка))) Поверил во "фьючерсы" - это не смертельно! Возьми вычлени репрезентативную выборку результатов синтетических тестов на своих данных - и ты поймешь. Нужно ли слепо идти за Мейерсом, или эффективнее просто прислушиваться, приглядоваться, записывать ходы... E2-E4?

Автор: applegame 06.06.19, 08:35
Цитата JoeUser @
Wound, давай договоримся - не будем обсуждать САМОГО МЕНЯ
Нет уж, давай обсудим. :lol:
То ты гадишь на аксиомы "аксакалов", то доверяешь им :)

Автор: JoeUser 06.06.19, 08:47
applegame, блин!!! >:(

Добавлено
А всегда тебя щетал полезным - а оно вот как!!! :-?

Добавлено
Цитата applegame @
То ты гадишь на аксиомы "аксакалов", то доверяешь им

Никогда такого не делал !!! >:(
Никогда не гадил! Вообще никогда!!!
Какал - это да, но это физиология.
А что попадал, так это стечение обстоятельств.
Ящетаю .

Автор: applegame 06.06.19, 09:24
Цитата JoeUser @
А всегда тебя щетал полезным - а оно вот как!!!
Я крайне вреден, реальность сурова. :D
Цитата JoeUser @
Никогда такого не делал !!!
Никогда такого не было и вот опять. :lol: Киля все уже нашел.

Автор: JoeUser 06.06.19, 11:15
applegame, Эпл, на все твои инсинуации отвечу - я всегда буду смешнее тебя, ибо я - Петросян, патамучта!!!

Автор: Qraizer 06.06.19, 14:48
Цитата JoeUser @
Ну тогда жду (ждем).
Что ты собственно, хотел узнать-то? Бо ничего не понятно...

Автор: D_KEY 06.06.19, 17:27
Я так понял, что JoeUser хотел узнать у тебя про механизм виртуальных вызовов. И твой авторитет для него абсолютен, не смотря на все то, что он говорил в своей мировоззренческой теме :)

Автор: OpenGL 07.06.19, 05:09
Не совсем понятно, что в нём может быть непонятного. Разве что в виртуальном множественном наследовании, но и при нём, если понимать, что это такое, механизм будет более-менее ясен :-?

Автор: Qraizer 07.06.19, 10:52
Ну, у JoeUser-а там большой пост. Я его не осилил тогда. Сейчас вот перечитал в спокойной обстановке и всё равно не понял, в чём вопрос.

Добавлено
Если всё же по реализации полиморфизма, то да, описать несложно. Типичный подход, который любому C программеру первым придёт в голову: массив указателей на функции, индексируемый уникальным для класса значением, подготавливаемым в его конструкторе и хранимым в скрытом поле класса (+ индекс самого метода, известного компилятору по его имени). На деле принцип может немного отличаться. В поле класса может храниться готовый поинтер, VMT может быть не строго массивом итп, но это уже детали.
Интереснее порассуждать, как реализуется множественная диспетчеризация в языках с её поддержкой. Там всё куда сильнее закручено. C++ к таковым не относится, так что подглядеть некуда.

Автор: JoeUser 07.06.19, 11:28
Цитата D_KEY @
И твой авторитет для него абсолютен, не смотря на все то, что он говорил в своей мировоззренческой теме

Ну таки да ... В теме по Цэ++ Qraizer у меня в авторитетах :lol: и не безосновательно.
И еще я знаю, что он в компьютерных игрушках в теме. Но тут уж без меня, игры в некомпьютерную жысть мне вполне хватает.

А по теме ...

Да, если взять Пасквиль - там все просто и очевидно с VMT. А вот с Сями не факт. Множественное наследование - не просто. А виртуальное наследование по логике понятно, а по реализации - туман. Вот именно про это я и хотел услышать от Qraizer'а.

Добавлено
Цитата Qraizer @
Сейчас вот перечитал в спокойной обстановке и всё равно не понял, в чём вопрос.

Забей. Если не понял, значит оно не важно.

Добавлено
Цитата Qraizer @
Что ты собственно, хотел узнать-то? Бо ничего не понятно...

Хотел услышать твою "версию" построения VMT.

Автор: Wound 07.06.19, 12:25
Цитата JoeUser @
А вот с Сями не факт

В Сях тоже все очевидно. Там нет ни VMT, ни наследования. :rolleyes:

Автор: OpenGL 07.06.19, 12:28
Цитата JoeUser @
А виртуальное наследование по логике понятно, а по реализации - туман.

А что там туманного? Просто в лоб хранить указатель на виртуальную базу.

Автор: Qraizer 05.09.19, 11:44
Ржал бы в голос, если б не спящие человеки рядом.
Мнение: объектно-ориентированное программирование — катастрофа на триллион долларов

Автор: JoeUser 05.09.19, 14:33
Цитата Qraizer @
Ржал бы в голос, если б не спящие человеки рядом.

Процитируй плс, что именно тебя пробило на хи-хи? :-?

Автор: Qraizer 05.09.19, 16:49
Всю статью процитировать?

Автор: JoeUser 05.09.19, 16:51
Цитата Qraizer @
Всю статью процитировать?

Нет, только избранное, самое-самое.

Автор: Qraizer 05.09.19, 17:47
Та там всё избранное. Ну реально же.

Добавлено
Вот хоть первая цитата, от которой выбежал на улицу поржать, до этого удавалось сдерживаться.
Цитата
ООП-код является недетерминированным. В отличие от функционального программирования, нет гарантий в получении одинакового вывода при одинаковых входных данных. Это делает анализ программы очень сложным. В качестве упрощённого примера: вывод 2 + 2 или calculator.Add(2, 2) в основном равен четырём, но иногда он может становиться равным трём, пяти и даже 1004. Зависимости объекта Calculator могут изменить результат вычисления трудно уловимым, но основательным способом.

Автор: applegame 05.09.19, 20:39
Статья бредовая, практически полностью. Но прямо вот ржать... думаю Qraizer несколько преувеличивает свою реакцию.

Автор: JoeUser 06.09.19, 04:06
Странно, а ведь в статье очень много высказываний действительно именитых персонажей в проектировании и программинге.
Или их уже можно считать неосиляторами и сбитыми летчиками?

Добавлено
Цитата Qraizer @
Цитата
ООП-код является недетерминированным.

А вот это я действительно не могу понять. Он может быть недетерминированным в одном случае, если в "недрах" Calculator ввести левые дополнения, а потом их не учитывать. Типа перевести состояние объекта в "3-ичное исчисление", а потом трактовать результат как 10-ричный, ну или вообще какие-то случайные величины. Но и в этом случае нельзя говорить о ООП-коде, а речь идет о недетерминированных результатах. Но это же возможный косяк программера, а не ООП.

Автор: OpenGL 06.09.19, 04:27
Цитата JoeUser @
Или их уже можно считать неосиляторами и сбитыми летчиками?

Как минимум тут уже обсуждали неосиляторство Линуса в плюсах :)

Автор: Астарот 06.09.19, 05:56
Цитата OpenGL @
Как минимум тут уже обсуждали неосиляторство Линуса в плюсах

И как, посрамили этого недоучку? :D

Автор: OpenGL 06.09.19, 06:24
Цитата Астарот @
И как, посрамили этого недоучку?

"Посрамили" в моём понимании подразумевает участие того, кого срамят, так что нет :no-sad:

Автор: Астарот 06.09.19, 06:26
Цитата OpenGL @
"Посрамили" в моём понимании подразумевает участие того, кого срамят, так что нет

Что, даже заочно не доказали, что он ничего не умеет, ничего не знает, и вообще неудачник? Странно... :D

Автор: applegame 06.09.19, 07:02
Цитата JoeUser @
Или их уже можно считать неосиляторами и сбитыми летчиками?
Цитаты могут быть коряво переведены, вырваны из контекста, могут быть шутками, ну и слова Ленина о цитатах в интернете никто не отменял.

Добавлено
Цитата OpenGL @
Как минимум тут уже обсуждали неосиляторство Линуса в плюсах
Не думаю, что Линус неосилятор. Что в этих плюсах такого, чтобы их неосилить? Скорее он нежелает их осиливать, вероятно религия не позволяет, ибо Линус, как ни крути, слегонца упорот. А может и не слегонца. Несмотря на упоротость (а скорее всего благодаря ей) Линус оказался весьма одаренным товарищем. Он еще в школе лабал на Sinclair QL мама не горюй, пока вы, в лучшем случае, ссались в пеленки.

Автор: Астарот 06.09.19, 07:09
Цитата applegame @
Статья бредовая, практически полностью. Но прямо вот ржать..

Ну, вообще что еще остается, если чел на полном серьезе заявляет, что в фп 2+2 всегда 4, а в ооп иногда даже 5? :D

Добавлено
Цитата applegame @
Не думаю, что Линус неосилятор. Что в этих плюсах такого, чтобы их неосилить? Скорее он нежелает их осиливать, вероятно религия не позволяет, ибо Линус, как ни крути, слегонца упорот. А может и не слегонца.

Думаю он прекрасно все осилил, понял, что оно ему не нужно, и на этом все закончилось. С когнитивными способностями у него все в порядке, поэтому говорить, что он что-то не осилил эт довольно смело.

Автор: OpenGL 06.09.19, 07:11
Цитата applegame @
Что в этих плюсах такого, чтобы их неосилить?

В данном случае "не осилил" означает "не научился пользоваться", а не "слишком тупой, чтобы научиться", разумеется, т.е. просто констатация фактов без причины оного.

Автор: Астарот 06.09.19, 07:15
Цитата OpenGL @
В данном случае "не осилил" означает "не научился пользоваться", а не "слишком тупой, чтобы научиться", разумеется, т.е. просто констатация фактов без причины оного.

Как насчет "научился но не захотел использовать"? :)

Автор: applegame 06.09.19, 07:17
Цитата OpenGL @
В данном случае "не осилил" означает "не научился пользоваться", а не "слишком тупой, чтобы научиться", разумеется, т.е. просто констатация фактов без причины оного.
"Не осилил" во всех смыслах означает, что пытался осилить, но не шмогла. Так же и гики обзывают друг-друга неосиляторами, намекая на то, что обзываемый хает сабж, только лишь потому, что ума не хватило освоить, а честно признаться в этом не позволяет гордость.
А многие плюсовики искренне считают, что их язык - это нечто доступное только особо талантливым чувакам, вроде них самих :)

Автор: OpenGL 06.09.19, 07:48
Цитата applegame @
"Не осилил" во всех смыслах означает, что пытался осилить, но не шмогла.

Ну значит не у всех :)

Добавлено
Цитата Астарот @
Как насчет "научился но не захотел использовать"?

Это обсуждали уже - тогда бы на вопрос "почему не плюсы" был бы дан совершенно другой ответ.

Автор: Астарот 06.09.19, 08:07
Цитата OpenGL @
Это обсуждали уже - тогда бы на вопрос "почему не плюсы" был бы дан совершенно другой ответ.

Если честно, то вопрос "почему вы используете А, а не Б?" в общем случае входит в топ самых тупых вопросов.

Автор: OpenGL 06.09.19, 08:22
Если А и Б в целом +- эквивалентны (git vs mercurial, vs code vs vim, блондинки vs брюнетки), то да. Если же вопрос звучит "Почему не Б, как более подходящей для задачи", да ещё если объективно Б покрывает абсолютно все возможности А и добавляет 100500 удобных плюшек, нужных в любом проекте сложнее helloworld-а, то вопрос более чем логичен.

Автор: Астарот 06.09.19, 08:26
Цитата OpenGL @
Если А и Б в целом +- эквивалентны (git vs mercurial, vs code vs vim, блондинки vs брюнетки), то да. Если же вопрос звучит "Почему не Б, как более подходящей для задачи", да ещё если объективно Б покрывает абсолютно все возможности А и добавляет 100500 удобных плюшек, нужных в любом проекте сложнее helloworld-а, то вопрос более чем логичен.

Все эти вопросы из серии "Почему ты женился на Маше, а не на Свете? Света тоже красивая, и борщи варит лучше Маши!". Но любовь случилась с Машей, а не со Светой, и перечисление кулинарных способностей Светы сделать с этим ничего не сможет. Поэтому в конечном итоге идиота, который перечислив несомненные достоинства Светланы сделает вывод, что женится нужно было именно на ней, можно только послать нахер, все остальное будет не конструктивно.

Автор: OpenGL 06.09.19, 11:43
M
Перенёс обсуждение C vs C++ сюда

Автор: Qraizer 06.09.19, 13:09
Цитата Астарот @
Поэтому в конечном итоге идиота, который перечислив несомненные достоинства Светланы сделает вывод, что женится нужно было именно на ней, можно только послать нахер, все остальное будет не конструктивно.
Ты должен помнить, что, выступая против сентенций Линуса, я вменил ему совсем не это. Он привёл аргументы против Плюсов, которые ровно так же применимы и к Сям. Об чём предпочёл умолчать. Из чего можно сделать два вывода: либо он просто не понял, о чём высказывается (почему бы и не "не осилил" в конце концов), ибо лично я не могу себе представить, что бы профессиональному разработчику, успешно решающему подобные проблемы в C, могло б помешать использовать те же подходы в C++, либо он лукавит, имея в виду совсем не то, что сказал, умолчав об истинных причинах. Ни то, ни другое не говорит в его пользу.

Автор: Астарот 06.09.19, 13:31
Цитата Qraizer @
Ты должен помнить, что, выступая против сентенций Линуса, я вменил ему совсем не это. Он привёл аргументы против Плюсов, которые ровно так же применимы и к Сям. Об чём предпочёл умолчать. Из чего можно сделать два вывода: либо он просто не понял, о чём высказывается (почему бы и не "не осилил" в конце концов), ибо лично я не могу себе представить, что бы профессиональному разработчику, успешно решающему подобные проблемы в C, могло б помешать использовать те же подходы в C++, либо он лукавит, имея в виду совсем не то, что сказал, умолчав об истинных причинах.

Если честно, то лично мне сугубо фиолетово на чем разрабатывает Линус. Нет, серьезно, какое мое собачье дело? Он выбрал инструмент, он этим инструментом сделал то, что я не смогу сделать хоть на этом, хоть на любом другом - значит его выбор был верен. У него есть результат. Поэтому правильный ответ на вопрос "почему не плюсы?", как я уже сказал, должен звучать примерно, как "идите в жопу". Собственно именно это он и пытался сказать приводя зачем-то какие-то аргументы. Возможно потому, что не знает замечательного ответа ПАТАМУШТА. Ну, в смысле ПАТАМУШТАИДИТЕВЖОПУ, да.

Автор: Qraizer 06.09.19, 13:59
Цитата applegame @
Но прямо вот ржать... думаю Qraizer несколько преувеличивает свою реакцию.
Та ладно. Он даже цитаты "переврал", оторвав от контекста в лучших традициях жёлтых троллей. Ну серьёзно же.
Цитата
Плохие никогда не успевают учиться, они просто нажимают кнопки на клавиатуре как сумасшедшие. Нравится вам это или нет, но вы будете работать с такими людьми. И, к сожалению, ООП не имеет достаточных ограничений, которые бы помешали плохим программистам нанести слишком большой ущерб.
Электродрель является плохим инструментом, не имеющим достаточных ограничений на причинение большого ущерба? Стоит ли её заменять на ручную?
Цитата
На самом деле, чем меньше у программистов выбора, тем более устойчивым становится их код.
и тем менее продуктивной становится его работа. И устойчивость тут не причём, самый устойчивый код пишут создают инструменты автогеренации.
Цитата
ООП предоставляет разработчикам слишком много инструментов и вариантов, не налагая правильных ограничений.
Абсолютная чушь. В любой ОСи её API без ограничений позволяет писать зловредные программы, API с ограничениями не позволяет писать любые приложения. Это справедливые тезисы, но внезапно из этого ничего не следует. Задачи "дать возможность писать любые приложения" и "не дать писать зловредные" противоречивы и не могут быть удовлетворены одновременно. Более того, одно и то же приложение сможет быть и полезным, и зловредным. Эти характеристики не зависят от приложений, они зависят от их пользователей.
Цитата
Erlang — это ООП в чистом виде. В отличие от других популярных языков, он сосредоточен на основной идее ООП — обмен сообщениями. В Erlang объекты взаимодействуют, передавая между собой неизменяемые сообщения
Внезапно ООП именно так и выглядит везде. Если автор не осилил подход ООП, то тот же Линус его уволил бы и не поморщился, и неважно, что писал бы он при этом на чистых Сях. Впрочем, о чём это я... какие нахрен Си рядом с автором.
Цитата
Что делает кодовую базу сложной? Есть много вещей, на которые следует обратить внимание. На мой взгляд, главными причинами являются: общее изменяемое состояние, ошибочные абстракции и низкое отношение сигнал/шум (бойлерплейт). Все они распространены в ООП.
Наконец-то спалился вчистую. Дальше можно уже не цитировать. Бойлеплейт необходим всегда, в любой абстракции, и его высокий процент о чём-то да и говорит. Конечно, и о хреновом проектировании тоже, но внезапно не всегда. Так же как "лучше день потерять, потом за пять минут долететь" плохой аргумент в разовом применении, однако в долгосрочной перспективе он оправдан. Ошибочные абстракции являются результатом неверного проектирования, и пофик, какую парадигму потом использовать для реализации. И наконец, в ООП нет разделяемых состояний, их нет даже в процедурном. Как после этого его можно серьёзно читать дальше, а?
Что там дальше... Инкапсуляция, которая как раз лишает проект разделяемых состояний и которой он так и не научился пользоваться? Заставляющая плохих программистов программировать строго в рамках обмена сообщениями? Напрочь опровергая его собственные тезисы касательно ООП? Рассуждения о наследование, которое чётко показывает, что автор даже не курсе теории ОП как дисциплине, вследствие чего понятия ковариантности, контрвариантности и инвариантности вгоняют его в ступор? Полиморфизм, который он внезапно функционально практикует на всю катушку? Человек не смог научиться мыслить по Дейкстра, коли не осилил простейший патерн проектирования сверху вниз. Т.е. он слился уже на школьной программе, и при этом он – смотрим наверх – senior full-stack-разработчик. Естественно, иммутабельная функциональщина для него единственный выход, иначе он голый король. И безработный.

Автор: Астарот 06.09.19, 14:04
Цитата Qraizer @
Внезапно ООП именно так и выглядит везде.

Ээээ? :huh: Где в java обмен сообщениями?

Автор: Qraizer 06.09.19, 14:07
Цитата Астарот @
Поэтому правильный ответ на вопрос "почему не плюсы?", как я уже сказал, должен звучать примерно, как "идите в жопу".
Если б он так сказал, я б только кивнул в ответ. Но он сказал не это, и при этом абсолютную хрень. Так что если кто вдруг решил, что он ниасилил, то он вполне имеет право так о нём думать.

Добавлено
Цитата Астарот @
Где в java обмен сообщениями?
Вызовы методов.

Автор: Астарот 06.09.19, 14:14
Цитата Qraizer @
Если б он так сказал, я б только кивнул в ответ.

Да он, наверное, и говорил. Много раз. Но достоянием общественности стал тот вариант, где он понял, что вопрошающие непосылаемы и попытался дать им то, чего они хотят.

Цитата Qraizer @
Вызовы методов.

Но вызов метода это не посыл сообщения.

Автор: OpenGL 06.09.19, 14:17
Цитата Астарот @
Если честно, то лично мне сугубо фиолетово на чем разрабатывает Линус.

Тебе да. Но другим разработчикам линукса может быть отнюдь не фиолетово по понятной причине, и они, разумеется, заслуживают более развёрнутого ответа, чем посылание в задницу.

Добавлено
К тому же ты подменяешь вопросы. Разговор о том, что линус не осилил плюсы, а не о том, есть кому-то из тут присутствующих дело до того, на чём он разрабатывает.

Автор: Астарот 06.09.19, 14:18
Цитата OpenGL @
и они, разумеется, заслуживают более развёрнутого ответа, чем посылание в задницу.

Как я уже сказал, я не уверен, что более развернутый ответ в принципе возможен :-?

Добавлено
Цитата OpenGL @
К тому же ты подменяешь вопросы

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

Автор: D_KEY 06.09.19, 15:10
Цитата OpenGL @
Но другим разработчикам линукса может быть отнюдь не фиолетово по понятной причине, и они, разумеется, заслуживают более развёрнутого ответа, чем посылание в задницу.

Почему?

Автор: JoeUser 06.09.19, 15:30
Цитата Qraizer @
Вызовы методов.

В голом С++ нормальной реализации этой идиомы нету.
Именно поэтому для реализации "сигнал-слот" Qt запилило свой moc.
И это, я считаю - костыльное решение! В идеале было бы неплохо
дать возможность структуре-классу генерить сообщение, самому
уметь подписываться, иметь вектор подписчиков, возможность
бродкаста ... Но, коль и многопоточность в С++ не реализуется
самим языком, а его внешней, пусть и стандартной, но либой ...
грузите методы бочками!

Хотя бы такой параллелизм запилили, как в Ada.

Автор: OpenGL 06.09.19, 15:47
Цитата Астарот @
Как я уже сказал, я не уверен, что более развернутый ответ в принципе возможен

Вообще-то тут в теме как минимум два таких приводили.

Цитата D_KEY @
Почему?

Что "почему"? Почему разработчикам линукса не фиолетово, на чём линукс разрабатывается? :lol:

Автор: Qraizer 06.09.19, 19:00
Цитата JoeUser @
В голом С++ нормальной реализации этой идиомы нету.
Именно поэтому для реализации "сигнал-слот" Qt запилило свой moc.
Мне кажется, вы не понимаете, что такое обмен сообщениями в ОП. В ОП вообще ничего нет, кроме объектов, которые взаимодействуют посредством обмена сообщениями. Именно это и реализуют экземпляры классов посредством вызова методов в ООП.
А то, что вы, ну вот сейчас конкретно ты, JoeUser, считаешь за обмен сообщениями, это не те сообщения, и не те обмены между объектами. Широковещательный, групповой итп обмены – это уже не принцип, а паттерн.

Автор: korvin 06.09.19, 20:01
Цитата Qraizer @
что такое обмен сообщениями в ОП

А что такое обмен сообщениями в ОП?

Автор: D_KEY 06.09.19, 20:18
Цитата OpenGL @
Цитата D_KEY @
Почему?

Что "почему"? Почему разработчикам линукса не фиолетово, на чём линукс разрабатывается? :lol:

Нет, почему они заслуживают более развернутого ответа, чем посылания в задницу?

Добавлено
Цитата Qraizer @
Именно это и реализуют экземпляры классов посредством вызова методов в ООП.

Таки не совсем. Вызов метода - это реакция на прием сообщения :)

Автор: korvin 06.09.19, 20:24
Цитата Qraizer @
Вызовы методов.

Не совсем. В случае чистого обмена сообщениями

1) мы можем послать любому объекту любое сообщение. В динамически-типизированных языках так и есть, но в статически-типизированных мы хотим-таки некоторый контроль со стороны системы типов, поэтому классы (часто) являются типами, вводятся интерфейсы и т.п. Только (в случае Java) это реализовано криво: явный implements интерфейсов, в итоге интерфейсы превратились там в некие самостоятельные сущности с кучей религии проектирования вокруг них, их правильного дизайна и применения. Смешение в одну кашу типизации и ООП привело к куче костылей, паттернов и прочего ненужного бойлерплейта. Между тем, всё правильно сделали в OCaml.

2) из первого вытекает второе: в ООП-системе не может быть null/nil в том виде в котором он есть в Java: некая спец.сущность, имеющая любой объектный тип, соответственно позволяющая системе типов успешно валидировать вызов метода к такой сущности и приводить к NPE (NullPointerException (Java), NullDereferenceException (C#), etc) в рантайме. Т.е., вкратце: в динамических языках должен быть объект nil (так и есть, например в Ruby, SmallTalk, etc. И ему можно добавить методов), в статических — его не должно быть вообще (use option/Maybe/so-on), или он не должен входить в тип, т.е. быть спец-сущностью поверх объектов (как ? в Kotlin, например, или Swift).

В Java этого нет, поэтому невозможно её систему виртуальных методов назвать объектной. Ещё немного портят картину всякие «спец.фичи» Java-объектов, типа возможность использовать любой объект как lock. Но это уже совсем Java-специфичное дерьмо.

Автор: Астарот 06.09.19, 21:29
Цитата Qraizer @
Мне кажется, вы не понимаете, что такое обмен сообщениями в ОП. В ОП вообще ничего нет, кроме объектов, которые взаимодействуют посредством обмена сообщениями. Именно это и реализуют экземпляры классов посредством вызова методов в ООП.
А то, что вы, ну вот сейчас конкретно ты, JoeUser, считаешь за обмен сообщениями, это не те сообщения, и не те обмены между объектами. Широковещательный, групповой итп обмены – это уже не принцип, а паттерн

Так как в изначальной статье была, кажется, отсылка к эрлангу и его сообщениям, то не понимаешь как раз ты. Подробно опишу уже завтра, спатки пора.

Автор: applegame 06.09.19, 22:15
Цитата Астарот @
Так как в изначальной статье была, кажется, отсылка к эрлангу и его сообщениям, то не понимаешь как раз ты. Подробно опишу уже завтра, спатки пора.
Если отбросить в сторону аснхронность, то какая принципиальная разницf между отправкой сообщения и вызовом функции? В эрланге, чтобы отправить сообщение, надо вызвать функцию :lol:

Автор: Астарот 07.09.19, 06:46
Цитата applegame @
В эрланге, чтобы отправить сообщение, надо вызвать функцию

Вообще-то '!' это оператор :)

Цитата applegame @
то какая принципиальная разницf между отправкой сообщения и вызовом функции?

Принципиальная :) Ну, если не доходить до абсурда, при котором посылка сообщения - это еще и работа с регистрами процессора, конечно. По сути вызов метода (крайзер сказал все же про метод, а не про функцию) это переход к некоему алгоритму обработки, который должен обработать входные параметры, и что-то да вернуть, хотя бы void. Этот алгоритм еще и должен принадлежать некоему объекту, раз уж речь о методе. Сообщение же это просто абстрактный набор неких данных, семантика которых при передаче сообщения совершенно не важна. Из того же эрланга:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Expr1 ! Expr2

Expr1 отправлено процессу Expr2. Что там находится в Expr1 совершенно не важно. Что с этим сделает Expr2 тоже совершенно не важно. Нет даже гарантий, что Expr2 существует. А если существует, то нет гарантий, что Expr1 будет когда-то прочитано. А если быдет прочитан, то нет гарантий, что не будет отброшен. А если будет обработан, то нет гарантий, что это выльется в вызов каких-то функций. И процесс, который отправил сообщение ничего не ждет, как при вызове метода, ничего не пишет на стек, живет себе дальше. Вообще если приземленно, то аналогия будет примерно такой: вызов метода - это письмо, в котором Петя говорит Васе, что нужно сделать. А посылка сообщения тогда - это почта, которая это письмо доставляет от Пете к Васе в запечатанном конверте, и чья ответственность ограничивается только доставкой, при этом находится вне сферы влияния и Пети, и Васи.

Автор: applegame 07.09.19, 07:00
Цитата Астарот @
Вообще-то '!' это оператор
Ну это на самом низком уровне. Голый процесс вряд-ли можно назвать объектом. А вот gen_server уже вполне, а там для отправки уже нужно делать call или cast. call так вообще очень сильно похож на обычный вызов метода объекта.
Цитата Астарот @
Expr1 отправлено процессу Expr2. Что там находится в Expr1 совершенно не важно. Что с этим сделает Expr2 тоже совершенно не важно. Нет даже гарантий, что Expr2 существует. А если существует, то нет гарантий, что Expr1 будет когда-то прочитано. А если быдет прочитан, то нет гарантий, что не будет отброшен. А если будет обработан, то нет гарантий, что это выльется в вызов каких-то функций. И процесс, который отправил сообщение ничего не ждет, как при вызове метода, ничего не пишет на стек, живет себе дальше. Вообще если приземленно, то аналогия будет примерно такой: вызов метода - это письмо, в котором Петя говорит Васе, что нужно сделать. А посылка сообщения тогда - это почта, которая это письмо доставляет от Пете к Васе в запечатанном конверте, и чья ответственность ограничивается только доставкой, при этом находится вне сферы влияния и Пети, и Васи.
Это все детали реализации. Говорят в Smalltalk то что внешне выглядит как отправка сообщений внутри сделано обычными вызовами. :)

Походу эта дискуссия скоро перейдет в плоскость философии.

Автор: Астарот 07.09.19, 07:16
Цитата applegame @
Ну это на самом низком уровне. Голый процесс вряд-ли можно назвать объектом. А вот gen_server уже вполне

Это такой же низкий уровень, как и вызов метода какого-то объекта - есть объект, вызвали метод. Есть процесс - послали сообщение. И вызов метода, и посыл сообщения - это средства языка :-? А gen_server это здоровенный кусок кода, который кто-то написал за нас, и там может быть все, что угодно. В жабе - как обратный пример! - воодушевившись примером эрланга сваяли некую Akka, где попытались повторить его акторную модель. Но не будем же мы говорить после этого, что в java есть посылка сообщений? :-? Получилось у них, насколько я знаю, не очень, если что...

Цитата applegame @
а там для отправки уже нужно делать call или cast

Только синхронная посылка сообщений там сделана, само-собой, через посылку двух асинхронных :)

Цитата applegame @
call так вообще очень сильно похож на обычный вызов метода объекта.

Именно, что только похож, поскольку под капотом это все то же асинхронное сообщение, и подразумеваемый контракт, что ответное сообщение, которое будет когда-то послано, будет содержать id переданный в запросе, и только благодаря этому id процесс ждущий ответ сможет этот ответ отличить от всех других сообщений. Сравни с адресом возврата на стеке :)

Цитата applegame @
Это все детали реализации.

Это основа на которой все работает, и от нее никуда не деться. Сделать похоже на синхронный вызов - да, можно, но чуть ковырнуть, и уже все совсем не так :)

Цитата applegame @
Говорят в Smalltalk то что внешне выглядит как отправка сообщений внутри сделано обычными вызовами.

На хабре об это кучу копий сломали, и если я все понял правильно, то смоллтоке все же именно вызовы методов.

Добавлено
Цитата applegame @
Походу эта дискуссия скоро перейдет в плоскость философии.

Может оно и не плохо? :D

Автор: D_KEY 07.09.19, 07:40
Цитата applegame @
Это все детали реализации. Говорят в Smalltalk то что внешне выглядит как отправка сообщений внутри сделано обычными вызовами. :)

Вот как раз то, как реализована посылка/обработка сообщений - действительно деталь реализации. Но во многих языках торчит уже реализация - вызов методов. Т.е. ты не сможешь реализовать в рамках стандарта крестовое ООП иначе, например.

Автор: Qraizer 07.09.19, 11:54
Цитата Астарот @
Так как в изначальной статье была, кажется, отсылка к эрлангу и его сообщениям, то не понимаешь как раз ты.
Отсылка в статье конкретно к Эрлангу не имеет отношения к общему принципу взаимодействия объектов. Как объектная модель Плюсов является лишь одной из возможных, так и Эрланг реализует механизм одним из возможных способов. Фуллстекщик по ходу просто проникся идеей Эрганга и вполне имел на это право, мне вон тоже объектная модель Плюсов гораздо симпатичнее Дельфёвой, ВБшной или там Джавной, но вот зачем он распространил одну из возможных реализаций на всю парадигму, это надо у него спросить.

Автор: JoeUser 07.09.19, 15:51
Цитата Qraizer @
Отсылка в статье конкретно к Эрлангу не имеет отношения к общему принципу взаимодействия объектов.

"Остап Ибрагимович, Вы же знаете как я Вас уважаю..." (С)

Qraizer, но ты неправ! Если "создатель" термина ООП критикует некоторые из его "инкарнаций" идеологии (его идеологии!!!) ООП, то он имеет на это полное право. Не нравится - форкай! Только не называй это уже ООП, называй, к примеру, ООПQ. Никто и лишнего слова не скажет!

Ну а по поводу "обмена сообщений" ... Ну для механизма исключений таки ввели ключевое слово "throw". Замечу, не функцию, не метод - а именно ключевое слово. Это собственность ЯП. Все зависимости и инварианты на столе.

Хотите изначального ООП в разрезе изначальных пожелалок автора сей идеомы - реализуйте в языке! Сделайте ключевыми словами, к примеру, "send", "listen", "subscribe", "unsubscribe" &etc. Обеспечьте функционал, и только тогда поговорим о чистом ООП без личных форков. И да ... ИМХО.

Автор: D_KEY 07.09.19, 16:10
Цитата JoeUser @
Если "создатель" термина ООП

На самом деле это спорный вопрос. C++ вдохновлялся языком simula 67(в том году и появился). Алан Кэй не имеет к нему никакого отношения.

Добавлено
Цитата
Первым языком программирования, в котором были предложены основные понятия, впоследствии сложившиеся в парадигму, была Симула, но термин «объектная ориентированность» не использовался в контексте использования этого языка. В момент его появления в 1967 году в нём были предложены революционные идеи: объекты, классы, виртуальные методы и др.

Автор: JoeUser 07.09.19, 16:19
Цитата D_KEY @
На самом деле это спорный вопрос. C++ вдохновлялся языком simula

C++ - это не ООП!
Мы говорим о идиоме, отвязанной от реализации.
Просто когда возникла такая идея.

Автор: D_KEY 07.09.19, 18:46
Цитата JoeUser @
Мы говорим о идиоме, отвязанной от реализации.
Просто когда возникла такая идея.

Я и говорю, что это спорно. Симула многими считается первым языком с поддержкой ООП, при этом Кэй не имеет к нему никакого отношения. То, что он придумал термин, не делает его создателем концепции, которая тогда, судя по всему, витала в воздухе. Его взгляд, соответственно, лишь один из возможных.
Про C++ я упомянул лишь в контексте, в котором было написано мною процитированное.

Автор: Qraizer 08.09.19, 16:20
Цитата JoeUser @
Если "создатель" термина ООП критикует некоторые из его "инкарнаций" идеологии (его идеологии!!!) ООП, то он имеет на это полное право. Не нравится - форкай! Только не называй это уже ООП, называй, к примеру, ООПQ. Никто и лишнего слова не скажет!
А я разве не сказал, что наш доблестный фуллстековый функциональник перевирает цитаты, выдёргивая их из контекста? Он критиковал-то не языковые ООП-архитектуры, а неправильное их пользование программерами. Собственно, функциональный фуллстекщик как раз на сие и напоролся, так что цитата ровно о нём самом, но он при этом умудрился перевернуть её на 180°.

Автор: korvin 13.09.19, 20:43
Цитата applegame @
то какая принципиальная разница между отправкой сообщения и вызовом функции?

Ну, некоторая есть: сообщение — тоже объект, и объект, которому передано сообщение может по-разному реагировать на «неподдерживаемое сообщение». В случае с вызовом методов и VMT ты не можешь вызвать произвольный метод на любом объекте. Реакция на неподдерживаемое сообщение может быть разной, например, знакомый рассказывал, что в одном проекте возможность перехвата и обработки неподдерживаемого сообщения в Ruby использовалась для динамического формирования config-объекта, который фактически читал свои «свойства» из файла.

Цитата applegame @
Говорят в Smalltalk то что внешне выглядит как отправка сообщений внутри сделано обычными вызовами.

Не совсем. Там есть один «метод» — dispatch, остальное ООП реализовано через сообщения поверх него.

Добавлено
Вот тут чуть подробней про разницу сообщений и методов. По сути это разница между динамической и статической типизацией.

Автор: applegame 13.09.19, 21:47
Цитата korvin @
Вот тут чуть подробней про разницу сообщений и методов. По сути это разница между динамической и статической типизацией.
В D тоже есть возможность создать объект для которого можно вызвать любой метод. :) Правда все разруливается в compile-time.
Но можно взять Ruby, Там тоже можно любой метод для объекта вызвать и объект может сам решать, что ему делать с этим методом. И это уже в run-time. ЕМНИП даже похапе и жабаскрипт так умеют. Тоже мне киллер-фича. :lol:
Так что неубедительно.

Автор: korvin 13.09.19, 22:13
Цитата applegame @
В D тоже есть возможность создать объект для которого можно вызвать любой метод. :) Правда все разруливается в compile-time.

Каким образом это может разруливаться в compile-time, если сообщение можно сформировать в runtime?

Цитата applegame @
Но можно взять Ruby, Там тоже можно любой метод для объекта вызвать и объект может сам решать, что ему делать с этим методом. И это уже в run-time. ЕМНИП даже похапе и жабаскрипт так умеют. Тоже мне киллер-фича. :lol:
Так что неубедительно.

Это и есть отправка сообщения, а не вызов метода. Практически все динамически-типизированные языки реализуют message-passing, а не virtual-method-invocation. Разница в том, что первое реализуется рантаймом, второе — компилятором. Есть, конечно и смешанные варианты: статически-типизированные языки с рефлексией (та же Java), но делается это всё там через адовую жопу.

Автор: applegame 14.09.19, 05:36
Цитата korvin @
Каким образом это может разруливаться в compile-time, если сообщение можно сформировать в runtime?
Ну язык-то ститически типизирован. Там все известно в compile-time. Ну и кто вообще сказал, что методы должны быть разные? Пусть будет один единственный метод (например, send) принимающий строку. Все. Получай произвольные сообщения, и принимай решения в зависимости от этих сообщений. Напомню, что динамический тип данных - это суть алгебраический тип данных, который поддерживается очень многими статически типизированными языками, включая C++ (Boost.Variant) и D (std.variant).
Цитата korvin @
Это и есть отправка сообщения, а не вызов метода.
По сути вызывается определенный метод-диспетчер, которому передается название вызываемого метода и его аргументы. То есть это все равно что вызвать dispatch(string name, string param). То есть в конечном итоге - это все равно вызов метода.

Автор: D_KEY 14.09.19, 06:47
Цитата applegame @
Напомню, что динамический тип данных - это суть алгебраический тип данных

Что ты имеешь в виду?

Автор: applegame 14.09.19, 08:08
Цитата D_KEY @
Что ты имеешь в виду?

Что именно тебе не понятно в этом предложении?

Автор: D_KEY 14.09.19, 08:09
Цитата applegame @
Цитата D_KEY @
Что ты имеешь в виду?

Что именно тебе не понятно в этом предложении?

Просто это или неверно, или ты не раскрыл мысль.

Автор: applegame 14.09.19, 09:56
Цитата D_KEY @
Просто это или неверно, или ты не раскрыл мысль.
Что тут неверного? В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком.
Допустим в Erlang мы можем отправить сообщение, которое может иметь один из конечного числа типов. Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме):
https://run.dlang.io/is/trH1nw
Скрытый текст

Зацените, насколько метапрограмминг в D мощнее и удобнее плюсового.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    import std.stdio;
    import std.variant;
     
    alias Message = Algebraic!(string, int, This[]);
     
    auto send(T, M)(T obj, M message) { return obj.dispatch(Message(message)); }
    auto send(T, MS...)(T obj, MS messages) if(MS.length > 1) {
        Message[] msg;
        foreach(m; messages) msg ~= Message(m);
        obj.send(msg);
    }
     
    class Foo {
        void dispatch(Message msg) {
            msg.visit!(
                (string x) => writefln("string: %s", x),
                (int x) => writefln("integer: %s", x),
                x => writefln("unsupported: %s", x)
            );
        }
    }
     
    void main() {
        Foo foo = new Foo;
        foo.send("hello");
        foo.send(123);
        foo.send("hello", 123);
    }

Правда, подозреваю, что korvin скажет, что я реализовал message-passing поверх обычных методов. :)

Автор: D_KEY 14.09.19, 10:06
Цитата applegame @
В любом динамически типизированном языке переменную можно представить как переменную алгебраического типа, состоящего из конечного числа типов поддерживаемых этим языком.

Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты).
Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем?

Добавлено
Цитата applegame @
Аналогично, мы можем в том же D создать аналогичный алгебраический тип и передавать объекту сообщения этого типа (вся диспечеризация в рантайме)

Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные?

Автор: applegame 14.09.19, 10:14
Цитата D_KEY @
Эм. Нет. Тип может быть создан во время выполнения, например. Или типа вообще может не быть как сущности в языке(типа у нас есть только объекты).
Не знаю, что ты подразумеваешь под алгебраическим типом данных, но я использую классическое определение - тип-сумма из типов-произведений, имеющая набор конструкторов, селекторов, частей и предикатов. А ты о чем?
Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее.
Можно для облегчения взаимопонимания сузить термин "алгебраический тип" до "tagged union".

Добавлено
Цитата D_KEY @
Не понял, к чему тут твой пример? Где разные объекты и где разная реакция на разные сообщения, в том числе и неизвестные?
Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения. Там по ссылке, в левом верхнем углу есть кнопка Run, покажет реакцию объекта на разные сообщения.

Автор: D_KEY 14.09.19, 10:37
Цитата applegame @
Я рассуждаю в более узком смысле. Имеются в виду типы встроенные в язык. Допустим любая переменная в erlang имеет алгебраический тип состоящий из следующих типов: атом, функция, список, целое и так далее.

Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним.

Цитата
Объект foo, которому мы посылаем разные сообщения (в функции main) и он по разному реагирует на эти сообщения.

А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть?
Кстати, ты слышал про метод doesNotUnderstand в smalltalk?

Автор: applegame 14.09.19, 12:33
Цитата D_KEY @
Мне кажется, тебя просто сбивает с толку pattern matching. Но фиг с ним.
Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется.
Цитата D_KEY @
А где имена сообщений-то? Мы же про ООП говорим? Диспетчеризация не по имени разве должна быть?
Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще. Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений.

Автор: D_KEY 14.09.19, 12:52
Цитата applegame @
Причем тут pattern matching? Я о нем вообше не думал, замени erlang на JavaScript или PHP смысл не поменяется.

Тогда я совсем не понимаю, при чем тут алгебраические типы данных :)

Цитата
Ну добавь в сообщение строку с именем, будет тебе имя сообщения. Это не принципиально вообще.

Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?

Цитата
Даже в определении ООП Алана Кея, ЕМНИП, нет ничего об именах сообщений.

Так а что идентифицирует сообщение?

Автор: applegame 14.09.19, 12:58
Цитата D_KEY @
Тогда я совсем не понимаю, при чем тут алгебраические типы данных
Ладно, забей, так как у нас некие разногласия в вопросе имен сообщений.
Цитата D_KEY @
Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?
В в SmallTalk так, да. Но как я понял это не обязательно.
Кстати, а можно ли в SmallTalk при отправке сообщения выбрать его имя динамически в рантайме? А то у меня закралось смутное сомнение, что нельзя :)
Цитата D_KEY @
Так а что идентифицирует сообщение?
Его содержимое, вестимо. Почему идентификатор сообщения не может быть его частью? Он не только может, он и есть часть сообщения. :)

Автор: Qraizer 14.09.19, 13:45
Цитата D_KEY @
Так деспетчеризация же по имени идти должна, как не принципиально? Дальше идет поиск метода(сам объект/класс и далее по предкам). Нет?
В TurboVision у сообщений не было адресатов. Там все объекты объединялись в единую иерархию (это совсем не та иерархия, которая определяет отношения наследования), а события просто кидались в неё, и обрабатывал их тот, кто хотел. Может быть и никто. Может быть и многие.

Автор: JoeUser 11.10.19, 18:43
Цитата Qraizer @
В TurboVision у сообщений не было адресатов.

Кстати да ... Я знаю, что уже давно ведется критика IP v.4 ... типа прямого соединения, бродкастов и мальтикастов недостаточно (или не так они реализованы). Ну екарный бабай!!!!1111 В языках а-ля более-менее высокого уровня - нет четкой позиции (сказать "парадигмы") и ее реализации - "А КАК ПРАВИЛЬНО". Как "более ВЫГОДНО по ресурсам, по скорости". Или я отстал от жысти?!

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)