LINUX.ORG.RU
ФорумTalks

О вреде ООП надо говорить! Это - слишком важная тема, чтобы отмалчиваться.

 


3

2

Здравия всем!

Я редко пишу на этом форуме, никого здесь не знаю… Но всё-таки решил попробовать. Удалят - и ладно.

Хочу лишь обратиться к молодому поколению программистов: в университете вам будут впаривать ООП - не ведитесь. Я много лет жизни потерял пытаясь понять что это за зверь. Это настоящая религия. Тебя убеждают что это хорошо, а когда ты понимаешь что это плохо - тебе говорят: ну ты просто ещё не знаешь паттернов, 5 принципов дяди Боба и т.д.

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

Есть много статей, разбирающих по косточкам различные аспекты ООП. Это тяжелое чтиво и мало кто из студентов сможет понять о чём речь. Тут сессии, курсовые, языки, вечеринки. Не до философии. Но всё сводится именно к философии:

информация ничего не значит без контекста.

В классическом примере ООП используется для пользовательского интерфейса. ООП объект хочет быть самостоятельным, «знать» как себя отобразить. Но это зависит от размера экрана, а если вывод в документ PDF, то предпочтительнее вектор, а не растр и так далее. Рано или поздно работа с ООП постоянно натыкается на конфликт: как передать контекст объекту.

Об этом много сказано, есть много примеров и разборов. Я уверен что студентам некогда читать длинные статьи где много буков. Они легко гуглятся и вот одна из наиболее кратких со ссылками на более подробные https://habr.com/ru/post/451982/

В идеале, хочу создать новую статью, ещё короче но с конкретными примерами. Просто реально трудно общаться с ООП-зомбированными людьми. Их так учили 5 лет и они даже не допускают мысли что их разводили все эти годы…

Перемещено xaizek из development

Ответ на: комментарий от Shadow

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

Посмотри на сишные GTK приложения. Нет классического ООП. Код читается и пишется проще. Тех же Qt с из крестами намного мудренее, код читается хуже.

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

anonymous
()
Ответ на: комментарий от fpastush

IMHO на самом деле тесты заставляют в неявном виде продумывать архитектуру. Но т.к. в неявном - далеко не всех. Половина все равно фигню напишет. А кто не напишет - может и без тестов код клепать, если держит в голове «как бы я для этого писал тест».

А про ООП - аффтор[ка] похоже не в курсе, что никто не запрещает рисовать data flow для классов. И предлагает делать его ВМЕСТО классов. Вангую ограничения самообразования.

Vit ★★★★★
()
Ответ на: комментарий от fernandos

Ну есть, к примеру, рвотное. Оно не полезно и его дают именно чтобы вызвать реакцию. А в китайской или ещё какой-то там восточной медицине есть идея «излечения через обострение». Или ещё есть гомеопатия.

den73 ★★★★★
()
Ответ на: комментарий от svyatozar

А что не так?

То, что ООП там тоже есть. С дескрипторами и коллбеками.

три разных сервиса (ALSA, JACK, PulseAudio) запущенные параллельно

И совсем непонятно, какое это отношение имеет к объектной архитектуре той же VFS в ядре.

hobbit ★★★★★
()
Ответ на: комментарий от svyatozar

я просто не знаю как здесь вставить цитату…

Рукалицо. Ты когда сообщение пишешь у тебя под полем ввода написано:

Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown или LORCODE.

ya-betmen ★★★★★
()
Ответ на: комментарий от svyatozar

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

den73 ★★★★★
()

Кстати, о каком ООП речь? Наследственность, изменчивость, естественный отбор или обмен сообщениями, позднее связывание и что там ещё было третье? Или не было?

den73 ★★★★★
()
Ответ на: комментарий от anonymous

Я у него в игноре, он эпично сделает вид, что ничего не увидел :)

Oberstserj ★★
()
Ответ на: комментарий от anonymous

Вот, кстате, GTK ООП пронизан. Он же основан на GObject, который в Сишечку ооп просто пропихивает. Единственно, что там не так это С++ и то для этого Vala был придуман. ну и биндинги для С++

fpastush
()

Я много лет жизни потерял пытаясь понять что это за зверь

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

ООП однозначно переоценено, но при избирательном использовании делает код несравнимо чище чем было бы без него.

WitcherGeralt ★★
()
Ответ на: комментарий от byko3y

Ты, как мой батя: «цель жизни политиков — сделать нам на зло, чтобы нам хуже жить было».

Вот батя в детстве меня дрючил, чтобы я писал красиво — прошло эн лет, а я уже года два кроме подписи ничего не писал от руки. И какой был смысл?

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

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

Мания величия вдобавок? Любопытный случай

Crocodoom ★★★★★
()
Ответ на: комментарий от anonymous

Посмотри на сишные GTK приложения. Нет классического ООП.

Я не знаю, насколько оно там классическое, но оно однозначно есть. Кстати, ТС мой коварный вопрос, относится ли GTK к раздутым из-за ООП проектам, благоразумно не заметил, видимо, начал о чём-то догадываться. :)

Тех же Qt с из крестами намного мудренее, код читается хуже.

Субъективное.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от svyatozar

А это еще не кровавый ынтырпрайз, чувак, ты походу жизни не видел

fpastush
()
Ответ на: комментарий от WitcherGeralt

ООП однозначно переоценено, но при избирательном использовании делает код несравнимо чище чем было бы без него.

Пожалуй, самый взвешенный тезис в теме.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от svyatozar

Так вот, TDD вполне конкретно, а не абстрактно, препятствует здоровому рефакторингу.

это как заявлять, что строителям леса вокруг здания мешают

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

EugeneBas ★★
()
Ответ на: комментарий от byko3y

Один говори - «Говно!», остальные доказывают, что всё норм. В процессе иногда всплывает что-нибудь интересное

Всплывает говно!

В квотезы!

hobbit ★★★★★
()
Ответ на: комментарий от Pinkbyte

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

WitcherGeralt ★★
()
Ответ на: комментарий от hobbit

Да за державу обидно, я подобных чудиков постоянно вижу, на собеседования приходят постоянно, минимум 5 лет стажа, а думают, что знают все.

fpastush
()
Ответ на: комментарий от no-such-file

Да, но без ООП никакой большой системы не будет вообще.

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

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

Kogrom
()
Последнее исправление: Kogrom (всего исправлений: 1)
Ответ на: комментарий от svyatozar

Это ж Go, его вообще сделали для того чтобы все по-быстрому и чтоб потом быстро. Там то и ООП нге стали вводить чтоб людей не отпугнуть. Хотя язык очень хорош!

fpastush
()
Ответ на: комментарий от Djanik

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

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Меня устраивает любой подход, если он применяется адекватно. Там где ООП ради ООП(серьезно, в одном проекте я видел промежуточный класс, у которого не было НИЧЕГО, кроме потомков, которые от него наследуются. И так было в коде лет 5, потому что «ну может когда-нибудь будем расширять эту абстракцию»), густо замешанное на глобальных переменных с лямбдами только что это круто и модно - вот от этого тянет блевать.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от hobbit

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

fpastush
()
Ответ на: комментарий от hobbit

То, что ООП там тоже есть. С дескрипторами и коллбеками.

А где вообще нет декрипторов и коллбеков??

И совсем непонятно, какое это отношение имеет к объектной архитектуре той же VFS в ядре.

«One of the first virtual file system mechanisms on Unix-like systems was introduced by Sun Microsystems in SunOS 2.0 in 1985.» - ну тут как бы ясно откуда ноги растут…

svyatozar ★★
() автор топика
Ответ на: комментарий от WitcherGeralt

Знать и использовать разные вещи.

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

Djanik
()
Ответ на: комментарий от anonymous

Что-то ты гонишь. Я до сих пор пишу процедурами, но для формы у меня объект, на который мапится структура данных.

Я посмотрел сейчас gtk hello world - да это хтонь какая-то. wxWidgets c++ hello world намного проще для чтения.

Shadow ★★★★★
()
Ответ на: комментарий от Pinkbyte

серьезно, в одном проекте я видел промежуточный класс, у которого не было НИЧЕГО, кроме потомков, которые от него наследуются

У меня встречется такое:

template <typename T, unsigned N>
struct maker : maker<T, N - 1> {};
template <typename T>
struct maker<T, 0> {};
anonymous
()
Ответ на: комментарий от svyatozar

А где вообще нет декрипторов и коллбеков??

В нормальном, отрефакторином коде, а пока будет индусстриальное программирование, нам это не светит. Про коллбеки и замену его паттерном Observer не слышал ?

fpastush
()
Ответ на: комментарий от anonymous

ты еще не видел, что с метаклассами в питоне вытворяют

fpastush
()
Ответ на: комментарий от WitcherGeralt

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

fernandos ★★★
()
Ответ на: комментарий от Djanik

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

никогда и нигде не использовала

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

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от qaqa

никакой разницы между функцией и объектом в определенном смысле нет.

Расскажи это фанатам функциональных языков программирования :-) Удалённо, конечно. Не в баре…

Отличие объекта в том что, он может иметь контекст, который иначе надо передавать в функцию параметром.

То что ты называешь контекст - это состояние машины. А то что я называю контекст - это состояние внешнего мира. Проблема объекта в том, что он «знает как себя отрисовать», но при этом ему надо передать информацию о внешнем мире. Что в принципе противоречие.

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

svyatozar ★★
() автор топика

Данные важнее, чем код

По моему опыту, самая серьёзная проблема ООП заключается в том, что оно мотивирует игнорировать архитектуру модели данных и применять бестолковый паттерн сохранения всего в объекты

Почему в голове автора нельзя одновременно НЕ_игнорировать архитектуру модели данных и при этом хранить всё в объектах без потери производительности при кодировании и не создавая бестолковых вещей?

Мотивирование к сложности

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

Если мыслить в категориях абстрактных классов и объектов, то грандиозность и сложность абстракций сверху ничем не ограничивается

Головой она ограничивается, временем и ресурсами.

Это никак не мешает мне создать абстракцию для сущностей предметной области которые объединяют общие свойства. Например, у всех моих сущностей есть ID и UUID, почему я не могу сделать абстракцию и наследование? Это автоматом создаст FizzBuzz Enterprise Edition или чёрную дыру или вызовет сатану? Нет.

Повсюду графы

ООП-проекты обычно выглядят не как качественно спроектированные хранилища данных, а как огромные спагетти-графы объектов, указывающих друг на друга, и методы, получающие огромные списки аргументов.

Я использую ORM для простоты работы с хранилищем и никогда не передаю в методы никакие аргументы кроме классов объектов над которыми нужно выполнить работу. То, что иногда вложенность может быть огромной - вполне решаемо, как минимум в Java и не вызывает проблем.

Задачи поперечных срезов

Вообще не понимаю о чём говорит автор, в моём манямирке class Monster вообще не знает никаких особых методов взаимодействия с другими классами. Для этого у меня есть сервисы.

Шизофреническая инкапсуляция объектов

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

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

На одинаковые данные можно смотреть по-разному

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

Создай ещё один сервис или метод в существующем сервисе с отличной обработкой тех же данных. В чём проблема?

Низкая производительность

Ой всё. Пока никто не подтвердил, что производительность твоего ПО низкая - её достаточно.

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от fernandos

Пока Линус твердо стоит на ногах, он от сишечки не откажется(там можно свое ООП, низкоуровневое). Пюсы отсек, вот rust пытаются пропихнуть, пока сопротивляется

fpastush
()
Ответ на: комментарий от fernandos

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

WitcherGeralt ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.