323

ООП сейчас не все используют

Случайно наткнулся на такой комментарий

ООП сейчас не все используют

И прямо полыхнуло.


Где в трёх принципах ООП (наследование, инкапсуляция, полиморфизм) есть что-то про сеттеры, геттеры и деструкторы?


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


Сейчас в трёх китах ООП логика такая:

1. инкапсуляция — это объединение данных (называемых полями или атрибутами) и функций для работы с ними (называемых методами),

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

3. полиморфизм — это возможность взаимозаменять объекты в рамках иерархии.


Давайте на примере. У нас собака - это сложная такая штука. Но всю сложность на себя берёт программист, который реализовал класс Собака. У нас есть поля (например, количество лап), есть методы (например, бежать). Вы можете сказать собака.бежать(), при этом внутреннее устройство собаки вас не интересует - в этом смысл инкапсуляции. Некоторые ошибочно говорят про "сокрытие" и начинают про private-public-protected, но этого не требуется. Поэтому, например, в python нет сокрытия, а инкапсуляция всё ещё есть.


Дальше. Мы создали Собаку. Теперь хотим Чихуахуа. Чтобы не переписывать общие места, у нас есть наследование. Мы создаём Чихуахуа(Собака), то есть наследуемся от неё. Теперь мы можем переписать только отличающиеся места (например, изменить метод Бежать так, чтобы Чихуахуа ещё противно шкрябала когтями).


И третье - полиморфизм. Это когда мы можем сделать много собак, и для каждой собаки вызвать метод собака.бежать(). В зависимости от типа собаки (Собака или Чихуахуа) у нас будет вызван нужный метод бежать. То есть на питоне


# создадим пару очаровательных собак
dog_party = [ Dog(), Сhihuahua() ]
# пройдёмся циклом по всем собакам
for dog in dog_party:
.  # у каждой собаки вызовем свой метод бежать
dog.run()
И тогда все собаки из dog_party побегут как умеют. Такие дела.


PS: некоторые относят к китам ООП ещё и абстракцию "для выделения в моделируемом предмете важного для решения конкретной задачи по предмету" (вики). Тут у меня вопрос. Вообще всё программирование состоит в выделении важного и игнорировании неважного независимо от парадигмы. Причём тут ООП? А если мы говорим о выделении сущности собаки в виде полей, то это свойство называется инкапсуляция.


В телеграмм-канале devfm разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

Программирование на python

937 постов11.9K подписчиков

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Вы смотрите срез комментариев. Показать все
3
Автор поста оценил этот комментарий

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


Ну и много ты сейчас видел кода, в котором вот такие объекты типа собак? Тем более кода, где эти собаки бывают разных пород, чтобы применялся полиморфизм?

раскрыть ветку (32)
7
Автор поста оценил этот комментарий

В питоне нет сокрытия. Всякие нижние подчёркивания — это договорённости, которые ничего не скрывают. При этом в питоне ООП есть, верно?


Сейчас стараются избегать наследования, заменяя его на композицию. А вот полиморфизм то повсеместно. Например, функция len работает в зависимости от объекта, в которому она применяется. И так почти со всеми магическими методами.


Дальше, в gamedev всё тоже на этом. Я выделяю юнитов и кликаю бежать. Каждый юнит бежит особым образом.

раскрыть ветку (14)
5
Автор поста оценил этот комментарий

Что питон, что си++/ява слишком узко трактуют изначальные принципы. Реакция на события и взаимодействие событиями первичны (а вовсе не частная реализация на таблицах указателей), так что в этом смысле SmallTalk/Objective-C/Self бОлее ООП системы, чем обсуждаемые.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Безусловно соглашусь. Но  индустрия отошла от изначального понимания - это факт. Поэтому сошлись на трёх китах и ладно.


Например, почему HTML - это не язык программирования? Я знаю, что это язык разметки. Но что такое язык программирования? Вот тут и начинаются терминологические замуты. Кто-то скажет, что HTML - не тьюринг полный. Тут совсем прикол, т.к. много ЯП не тьюринг полные. Кто-то вспомнит про ветвления. Но в декларативных языках тоже может не быть ветвлений.


Короче, терминологические споры могут быть злом. Определите понятие "понятие", как это бесило в философии

2
Автор поста оценил этот комментарий

В питоне нет сокрытия. Всякие нижние подчёркивания — это договорённости

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

При этом в питоне ООП есть, верно?

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

Например, функция len работает в зависимости от объекта, в которому она применяется.

Ты сейчас имел в виду именно свободную функцию? Не метод? Функцию, которая по разному работает, когда в неё передают объекты разных типов? Тогда это совсем не ООП, а в лучшем случае параметрический полиморфизм.

Дальше, в gamedev всё тоже на этом.

Ааа, ты геймдевом занимаешься? Это многое объясняет, конечно. Наверное там действительно есть такой код.


Ты слышал про ECS? В Unity вроде в полный рост практикуется. В Питоне в геймдеве этот подход не используют?

раскрыть ветку (9)
0
Автор поста оценил этот комментарий

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

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

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

Питон - мультипарадигменный. Там можно как угодно писать.

Ты сейчас имел в виду именно свободную функцию? Не метод? Функцию, которая по разному работает, когда в неё передают объекты разных типов? Тогда это совсем не ООП, а в лучшем случае параметрический полиморфизм.

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


Или что я могу любой класса превратить в iterable тип, и внешний код сможет for obj in my_class делать.


Ладно, прикладной пример из недавнего. Есть группа проектов студентов, в каждом должны быть формальные файлы с фиксированными именами. Штука в том, что в некоторых проектах имена отличаются (условно, два варианта есть). Так вот, чем в код тащить if project_type == 1 делаем то-то, я делаю два класса-обработчика - Handler1 и Handler2. Метод process наследуется у BaseHandler и не трогается, а вот список файлов вынесен в поле Handler1 и Handler2.

Ты слышал про ECS? В Unity вроде в полный рост практикуется. В Питоне в геймдеве этот подход не используют?

Не, я не про gamedev, вспомнил просто оттуда пример. Про ECS не знал, почитаю, спасибо https://habr.com/ru/company/mygames/blog/590953/

раскрыть ветку (8)
1
Автор поста оценил этот комментарий

Утверждаю, что определение "инкапсуляция - это сокрытие данных" неверное

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

Питон - мультипарадигменный. Там можно как угодно писать.

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

Да, len - параметрический полиморфизм, но полиморфизм же.

Ну так в ООП не любой полиморфизм, а полиморфизм подтипов. Так что с моей точки зрения функция len - не очень пример для ООП.

Метод process наследуется у BaseHandler и не трогается, а вот список файлов вынесен в поле Handler1 и Handler2.

А как ты принимаешь решение каким хендлером обрабатывать проект?

раскрыть ветку (7)
0
Автор поста оценил этот комментарий

Но если ты это выдашь случайному программисту, то он мягко говоря офигеет от удивления ))) . И соответсвенно, рассчитывать, что когда ты говоришь инкапсуляция, он думает о чём-то отлчичном от сокрытия - нельзя.
Когда разработчик на вопрос "что такое инкапсуляция" говорит "это private-public-protected", то я расстраиваюсь. С этого и родился пост — когда человек говорит, что нет геттеров — значит, не ООП.

Если без ООП, то тогда уверждение что ООП в основном не используется, вполне может быть верным ))
Опять же, не спорю. И с len соглашусь, да


А как ты принимаешь решение каким хендлером обрабатывать проект?
Снаружи, т.е. указано во входном файле. Студент1 — тип1. Гипотетически, можно флагом при обработке указывать. Но там многостадийная система, поэтому проще при инициализации экземпляра класса сказать тип и забыть про него. В целом, ничего не мешает в конструкторе запомнить переменную и в зависимости от неё что-то заполнить. Ну да — в разработке всегда больше одного варианта
раскрыть ветку (6)
2
Автор поста оценил этот комментарий

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

То есть у тебя где-то в фабричном методе код типа


var handler ;

if student.type == 1 then hander = new Handler1()

else if student.type == 2 then hander = new Hander2()


Так выходит?

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Да, вроде того. А потом все hander сохраняются в списке объектов для дальнейшей обработки

раскрыть ветку (4)
1
Автор поста оценил этот комментарий

Да, вроде того. А потом все hander сохраняются в списке объектов для дальнейшей обработки

А как ты для себя решил, что вот этот подход лучше, чем такое же ветвление, но в методе класса handler? Чем один if лучше чем другой?

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Потому что это переписывалось, и там if был в каждом месте обработки файлов, и вот это был ад.


В целом, никто не мешает if поместить в конструктор и заполнить нужный список файлов. Но подход с разными классами более расширяемый. Например, я могу переопределить метод "обработать" так, чтобы у Hander1 что-то дополнительное делалось, например, что-то туда копировалось. На практике - у типа 1 надо автоматом закрыть issue, если прошли тесты, а у типа 2 не надо. Вот появилось разное поведение. И оно не ползёт по коду в виде портянки if. Выбор if только при конструировании hander, а потом работает нужная сущность

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

На практике - у типа 1 надо автоматом закрыть issue, если прошли тесты, а у типа 2 не надо. Вот появилось разное поведение. И оно не ползёт по коду в виде портянки if.

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


Но ты выбрал иф при конструировании хендлеров. Вот интересно чем ты руководствовался.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Ээ, в питоне что, все свойства публичные? Пиздец помойка, а не язык
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Угу, всё публичное. Можно через подчёркивание _name сделать рекомендацию "не лезь туда" или через __name слегка осложнить использование переменной.


А так динамически делай что хочешь

1
Автор поста оценил этот комментарий

автотесты. DTO и бизнес объекты. У меня этих собак полный фреймворк, а ещё птиц, рыбок и <австралия_наследуемое>. И каждый третий джун норовит написать свою гиену не наследуясь от кошек.

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

автотесты.

Ты пишешь автотесты?

DTO и бизнес объекты.

И используешь полиморфизм в ДТО?

У меня этих собак полный фреймворк, а ещё птиц, рыбок и <австралия_наследуемое>

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

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

да, пишу автотесты и участвую в развитии АТ-фреймворка.


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

У меня до пизды классов из трёх-пяти полей и этак пяти методов, потому что с точки зрения бизнеса всё довольно просто, список систематически проверяемых значений небольшой, часть полей проверяется в 70 тестах и идёт в DTO, часть в 7 и проверяется непосредственно в тесте. А ещё для некоторых проверок я в очень упрощённом виде копирую полноценную работу приложения, например чтобы свериться что разрабы считают надбавку за сверхурочные по правильной формуле.


Ну и отдельные сто грамм про DTO. DTO - охуенная тема. В API тестах пишешь хороший годный DTO, может даже нагло копируешь у разрабов. Ответы с бэка в него парсятся просто отлично, пихать весь DTO в асёршен вместо построчной проверки по полям волшебно. Переиспользовать его для создания более сложных объектов и передачи части полей сразу в другой объект куда удобней чем ковырять построчно или писать методы-уродцы на 3-5 параметров. Потом берёшь и цепляешь API-репо как зависимость к UI. Этот же DTO используешь для парса объектов с UI, потому что это тот же бизнес-объект, просто представленный в ином формате. У тебя везде одинаковый объект для работы с некой бизнес-сущностью, даже полный дегенерат не сможет забыть проверить поле или заполнить его неправильно, потому что или получит эксепшеном в консоль, или будет трахаться с падающим асёршеном на дебаге. Если заказчик и как следствие приложение отказались от поля, поменяли формат, нассали в тапки, всё чинится в одном месте, а не во всех автотестах.


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

...и объяснять джунам что такое виверровые.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

отличный коммент, спасибо

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

на самом деле матов многовато, можно было и чище написать. но настроение было что-то не очень.

1
Автор поста оценил этот комментарий
простите, а у человека разве есть инстинкты?
раскрыть ветку (11)
1
Автор поста оценил этот комментарий

простите, а у человека разве есть инстинкты?

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

раскрыть ветку (10)
1
Автор поста оценил этот комментарий

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

Это устаревшее понятие, которое в силу появления более детальной типизации уже плохо подходит для описаний. Тот же биолог может сказать что крик младенца это инстинктивное поведение, но! И вот это "но" потребует более узкого понятия.

0
Автор поста оценил этот комментарий
у людей нет инстинктов. если большинство людей невежды, что же теперь, всем опускаться до их уровня?
раскрыть ветку (8)
2
Автор поста оценил этот комментарий

у людей нет инстинктов.

Зависит от того, что понимать под инстинктами

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

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

раскрыть ветку (7)
Автор поста оценил этот комментарий
слово инстинкт не совсем профессиональный жаргон. есть слово рефлекс, например, такое же распространённое.
только люди, владеющие неверной информацией зачастую уверены в ее справедливости и готовы доказывать с пеной у рта, что «вообще-то инстинкты у человека есть, вон младенцев грудью кормят, а мужики могут изменять, им же надо. природа!» только у людей нет инстинктов, поэтому это не природа, а оправдания. и если назвать вещи другими словами, которые приближены, но ошибочны, то это ведёт к масштабным проблемам
раскрыть ветку (6)
1
Автор поста оценил этот комментарий

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

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

только у людей нет инстинктов, поэтому это не природа, а оправдания

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

раскрыть ветку (4)
0
Автор поста оценил этот комментарий
господь!
это как называть врача санитаром, программиста учителем информатики, а волка собакой. это разные вещи. если масса неверно употребляет слово, это не делает эту ситуацию нормой. люди полвека лет говорили, что кофе - оно, и только через полвека в правилах появились поправки. но черт бы с этим кофе. здесь речь идёт о разных понятиях, которые не стоит смешивать.
именно для этого рефлекс и инстинкт назвали по-разному, чтобы обозначить разные явления. именно для этого появлялись слова, чтобы люди лучше понимали друг друга, чтобы общаться было проще, чтобы каждое понятие имело свой набор звуков. поэтому инстинкты в разговорном языке обозначают то же, что и в учебнике биологии. а вы говорите о рефлексах
раскрыть ветку (3)
2
Автор поста оценил этот комментарий

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

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

раскрыть ветку (2)
0
Автор поста оценил этот комментарий
под обычным человеком, видимо, подразумевается человек необразованный
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

Если под образованностью понимать знание биологической терминологии, то да )) . Но тогда надо объявить необразованными тех, кто не считает себя костистыми рыбами ))

0
Автор поста оценил этот комментарий

эм, лады, у людей нет инстинктивного поведения. Даже предположим что крик младенца это рефлекс, а не инстинкт. У человеческих детёнышей(и других приматов) наблюдаются признаки стадного поведения. Это сложная последовательность безусловных реакций, паттерн из нескольких вызываемых друг за другом рефлексов, с некоторой вариативностью. На этом этапе рассмотрения оно инстинкт.
Но его нет у орангутангов, плюс впоследствии оно может быть замещено осознанной обработкой события, что уже выводит из под термина инстинкта.
Так что у человека есть варианты поведения которые можно назвать инстинктивным, но лучше использовать более узкие понятия. Инстинкт это не ошибка, это недостаточно узкое в нынешней типизации понятие.

Тут штука ещё в том что "как-бы инстинктов" у человека по пальцам пересчитать , и вот стереотипы ни в один инстинкт не попадают.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества