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, если актуально

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


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

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

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

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

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

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

Все это круто, но в реальности несколько сложнее.


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


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


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


Короче, ООП в реальных проектах не совсем по учебнику. И смешано с другими парадигмами, в частности с ФП.


Хотя, конечно, наверное ещё и от области зависит, я со своей колокольни смотрю.

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

Изоляция логики, понятно, везде есть. Этого и пытаются достичь


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


Наследование сейчас стараются минимизировать и пользоваться композицией.


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


Своим постом я лишь попытался донести, что конкретно в ООП есть важные аспекты. Они дают плюсы и минусы. ООП — это не про классы или public/private

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

С этим я не спорю.


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


Хотя, конечно, инкапсуляция не про геттеры и сеттеры - с этим я полностью согласен.


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

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

Триггернуло именно непонимание, что ООП не в сеттерах и геттерах.


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

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества