LINUX.ORG.RU
ФорумTalks

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

 


3

2

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

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

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

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

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

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

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

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

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

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

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

То что ты называешь контекст - это состояние машины.

Разупоритесь, юноша. Я такого не говорил.

Проблема объекта в том, что он «знает как себя отрисовать»

У объекта нет никаких проблем. Проблемы в вашей голове.

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

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

но при этом ему надо передать информацию о внешнем мире. Что в принципе противоречие.

Задача ООпринципа в абстракции построить кучу когерентных объектов с low coupling и high cohession (плохо на русский переводится), а не один большой объект, который и является противоречием для большой системы

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

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

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

Ну и что? Есть ещё event loop. Есть polling. Всё это нужно и полезно.

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

В первый раз ты ошибся с неизвестностью ООП в момент начала разработки ядра

Опять же, не ошибся.

теперь пытаешься что-то доказать цитатой, не имеющей никакого отношения к теме

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

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

Там последовательность другая. Сначала делают фигнятесты вместо того что предполагалось, а потом фигню под фигнятесты.

проработка архитектуры в неявном виде => проблемы, если нет привычки все недостающее в уме прокручивать.

На подавляющем большинстве задач прописывание и проверка data flow избавляет от кучи приключений.

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

low coupling и high cohession (плохо на русский переводится)

Таки скажи, если перевести на русский, получиться противоречие.

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

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

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

ядра начиналась как вполне несложный проект

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

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

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

Более простой пример извращения в программировании - TDD

На самом деле, сам Кент Бек в своей книжке говорит, что не уверен, что его методика приемлема везде. Кроме того, у него были удобные инструменты для такого стиля разработки. И с этими инструментами всё выглядит заманчиво. Но я, например, не видел таких удобных инструментов для C++.

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

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

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

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

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

Но тезис был другой, как минимум ты выразил мысль неточно

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

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

Расскажи это фанатам функциональных языков программирования :-)

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

В чистом ООП, все эти переменные надо будет передать в конструктор класса.

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

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

на момент старта разработки ядра ООП было хорошо известно.

А на g++ без слёз смотреть нельзя было, и ваще он был текстовым препроцессором. Не на лиспе жи было minix переписывать.

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

И как можно тупее.

global в питоне - наше всё. Естественно, с умом.

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

В функциональных языках есть понятие замыкания.

Вспомнил замыкания JS как лайфхак для локального контекста - вздрогнул.

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

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

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

Kogrom
()
Ответ на: комментарий от system-root

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

Это ж надо две мысли в голове держать, или блокнотик завести если память подводит. Трындец как сложно.

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

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

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

Сколько нужно тестов для проверки корректности работы этой функции?

3*мощность(континуум)

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

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

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

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

Вы же почему-то подумали

Потому что:

слишком старый проект

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

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

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

Ну так не пейте токсические спирты включая этанол.

Ты скачешь с темы на тему быстрее, чем самая популярная в борделе шалава по херам…

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

Держать в голове «чтобы можно было написать тест если понадобится» - достаточно. Покрытие от задач зависит. У меня есть библиотеки, где без 99-100% покрытия себе дороже. И есть приложения где совсем по вершкам.

Но как в том числе бизнес аналитик - клянусь, что всё нужно начинать с датафлоу.

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

Например:

  • По таймеру (эвент) с частотой килогерц читаем из порта - плохо.
  • Поток данных из порта (с частотой килогерц) - хорошо.
Vit ★★★★★
()
Ответ на: комментарий от qaqa

Если не надо валидировать параметры

Ок, можно предположить, что некое внешнее устройство ограничивает ввод нулей или отрицательных параметров. Но, например, проверка на ввод 1, 2, 10 явно должна быть внутри функции.

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

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

Проект: создание операционной системы, как думаете, проще его писать для поддержки железа типа 386 процессора или <имя любого современного десктопного процессора>?

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

fernandos ★★★
()
Ответ на: комментарий от qaqa
// исправление бага #122
if (a==1 && b==2 && c == 2)  return "равнобедренный";
// исправление бага #221
if (a==2 && b==2 && c == 1)  return "равнобедренный";
// исправление бага #322
if (a==3 && b==2 && c == 2)  return "равнобедренный";
// ну вы поняли, как устроена промышленная разработка ПО.

if (a==b && b==c && a==c) return "равносторонний" else  return "разносторонний";
anonymous
()
Ответ на: комментарий от Vit

По таймеру (эвент) с частотой килогерц читаем из порта - плохо.

Кажется, я испорчен хорошим образованием - такая лажа в голову придти не может.

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

А вот не помню. Тыкал Objective-C только в контексте WindowMaker-а. Не думаю, что в gcc был готов.
И в школе я много слышал про c++ (90-92 гг), а про Objective-C - ничего.

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

сможет ли она его сварить?

А зачем собаке варить пиво? Миллионы людей пользуются компьютером и не могут его ни собрать ни починить. И это люди из ит-области.

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

Собаку можно научить…

А человека? Или это завуалированное сравнение человка с собакой?

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

Ок, логика ясна.

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

Вопрос про ядро изначально неверно стоял, отчего и ответ звучит неубедительно. Тут скорее встаёт ответный вопрос: а точно ли в ядре нужно ООП?

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

при этом ему надо передать информацию о внешнем мире.

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

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

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

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

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

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

от заучивания до действительного понимания есть несколько ступеней.

«Если крякает, как утка, плавает как утка, то это утка». Если собака приносит пиво, когда просишь, то не все ли равно, умеет она варить или нет?

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

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

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

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

А ОО-идеи рождались не в научной, а в инженерной среде.

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

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

Один генеративный (property-based) тест.

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

эволюция ушла в другую сторону

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

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

Ну потратил ты 10 лет на прохождения этих ступеней для понимания. А завтра все уже пишут на раст++, где твои знания нафиг не нужны.

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

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

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

Просто добавится ещё один язык к 5-7 другим (от уровня «хорошо знаю» до уровня «могу с гуглом нахерачить»). Язык после пары-тройки ступеней не так уж важен.

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

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

Старинный фармакалогический справочник

Препараты не из одного только спирта:

Spiritus vini 95°.
Spiritus vini 90°.
Spiritus vini 70°.
Spiritus vini 40°.

Обладает антимикробным, наркотическим и местным раздражающим действием.

Слабые растворы (1–2%) несколько усиливают действие пепсина.

vM ★★
()

Всякая технология, стиль программирования - хороши на своём месте.

До 3 версии в php небыло толкового ООП. Причины: не хотели удлинять время сборки скриптов. Но я всё равно умудрялся писать в стиле ооп используя case swith. И я рад что оно там появилось.

Да наследование «КАК ПРАВИЛО!!! с исключениями» приносит трудно находимые ошибки, и можно его избежать, так пускай оно всё таки будет.

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

s-warus ★★★
()
Ответ на: комментарий от Kogrom

Шутка на

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

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

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