Интересное мнение про ООП - страница 2

 
Mikhail Mishanin:

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

Ведь что получается, ООП по большей части для читаемости и командного программирования, т.е. для больших проектов. Эксперт торгующий символом к графику которого он прикреплен с контролем максимального риска от баланса/средств по счёту ну никак не назовешь большим проектом - значит достаточно и выгоднее по памяти/скорости - процедурное программирование.

Вопросы:

- минусы/плюсы ООП(как императивное) из личного опыта

- минусы/плюсы ФП(как декларативное) из личного опыта.

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

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

Хорошая черта любого кода - максимально короткие функции. Пусть лучше их будет больше

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

Поскольку мы работаем с типо хранилищем "классом" то можно четко заранее предопределить все переменные задать им определенный тип....

удобно для создание внешних API. При работе можно работать с ссылкой на класс (8байт) - очень часто используется.

Пример: Всякие линкованные списки узлов и прочее.


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

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

На самом деле это довольно удобно.

При этом остаётся свойство полного разворачивания кода т.к. по факту мы четко знаем какая функция у нас получена - что скорее всего будет быстрее при вычислении чем ООП. Можно организовывать довольно хитрые перебросы вычислений с одной функции внутрь другой - также функция полностью запоминает окружения вызванных переменных прошлой функции - что очень круто (хотя по факту это лишь сохранения объявленных переменных из внешней области видимости). ФП же можно задать адрес функции  и сохранить её в массив подобно классу - хотя особо не пригождается.

Простота написания кода для отложенных действий, всяких асинхронных функций, параллельных расчетов

 

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

Собираю/обучаю нейронные сети своей переменной(эволюционируют) структуры. И для них очень выходит критичным что откуда не возьмись полезет "мусор" в значениях.

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

Как максимально избежать "мусора"(недетерминированности) в ООП?

 
Mikhail Mishanin:

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

Собираю/обучаю нейронные сети своей переменной(эволюционируют) структуры. И для них очень выходит критичным что откуда не возьмись полезет "мусор" в значениях.

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

Как максимально избежать "мусора"(недетерминированности) в ООП?

Там в статье в обще как то странно, человек явно забыл указать тип переменной const, вроде у него там js тогда хотя бы readonly. После чего пишет что мол у него ошибка когда объект который не должен менять размер (быть константой), почему-то не константа ..... и на основании этого делает выводы что в ООП велика вероятность ошибки )))

В общем ООП позволяет контролировать области переменных. ФП же задумана как передача переменных из функции, т.е. тип уже по умолчанию должен быть нами определён т.к. их скорее всего мало. А если что можно на ходу саму эту функцию расширить.

Т.е. в ООП изначального контроля больше

 
Mikhail Mishanin:

Вот так вот, всегда подозревал)

https://proglib.io/p/obektno-orientirovannoe-programmirovanie-samaya-bolshaya-oshibka-kompyuternyh-nauk-2021-01-23

Не понятно, кто такие "статьи" пишет, пустословие, общие фразы, смысла минимум.

" Код в целом был запутанным и беспорядочным – то, что на сленге называется «спагетти» " - из-за плохих программистов в Toyota будем считать, что в ООП код запутанный.

" Встроенные фичи ООП только добавляют путаницы. " - ну и логика, возможность использования фичей добавляют путаницу в код, при постоянном увеличение количества фичей ООП(C#) будет уже невозможно написать простой код. Да уж.

"В большинстве объектно-ориентированных языков данные передаются по ссылке, то есть разные участки программы могут иметь дело с одной и той же структурой данных – и менять ее. Это превращает программу в один большой сгусток глобального состояния и противоречит первоначальной идее ООП " - А private, protected?

"... Если эта цитата вам не нравится, то это потому, что недетерминированность в целом никуда не годится." - ну да, непредсказуемые функции GetMicrosecondCount, MathRand, CoptBuffer, все сетевые функции и другие надо выкинуть, там ведь результат зависит от внешнего состояния. Ужас.

Ладно, хватит, тут всё ясно.

 
Mikhail Mishanin:

Вот так вот, всегда подозревал)

https://proglib.io/p/obektno-orientirovannoe-programmirovanie-samaya-bolshaya-oshibka-kompyuternyh-nauk-2021-01-23

Там большая часть аргументов высосана из пальцев. Некоторые эксперименты "доказывающие" не состоятельность ООП вообще некорректны. В нормальных ООП языках sum(int a, int b) всегда будет чистой, даже если писать бред вроде а += b внутри. Опять-таки, если объект выделяется на кучи внутри метода, то он всегда защищен, т.к. ссылка на него есть только у метода его вызвавшего. Меняй его хоть до потери пульса. Есть ссылочные и значимые типы. Никто не мешает в ООП языках писать чистые функции без побочных эффектов. Стандартные математические функции например такие. Да, иногда без разделяемых ресурсов не обойтись, но для этого есть удобные потокобезопасные коллекции и много чего еще. В конце концов любой чистый ФП будет неизбежно взаимодействовать с IO, BD, сетевыми запросами и много еще чем, откуда и прорвутся демоны изменяемости. 

 

Странная статья....

Количество обладает свойством переходить в качество. 

Когда раций много, может возникнуть электромагнитная не совместимость и они перестанут работать.

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

В функциях наличие обратных связей к тому же приведет. Гистерезис шутка еще та)

Понимание задач, и их правильная постановка ... )))) 

 
Alexandr Andreev:

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

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

На самом деле это довольно удобно.

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

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

 
Vasiliy Sokolov:

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

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

)  можно и на ассемблере. Вопрос в том где проще.

И не надо меня ставить в ту или другую сторону.... я не приверженец чего то одного

 

Странная статья. ООП ничем от процедурного стиля в худшую сторону не отличается, т.к. в нём по умолчанию можно сделать всё в процедурном стиле, а наоборот нельзя без страшного раздувания кода, т.е. ООП это "надстройка над", а не принципиально другой стиль.

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

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

 
Mikhail Mishanin:

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

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


Начал его писать в ФП, когда еще не понимал, что мне в итоге нужно будет смотреть.

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


Код очень простой и короткий (описание). Если его напишите на ФП, будет интересно сравнить.

Причина обращения: