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
Автор поста оценил этот комментарий

Инкапсуляция позволяет также скрыть от прямого доступа информацию обьекта

к примеру - сделали

const dog = new Dog();

//dog.run() мы не вызывали.
и напрямую делаем
dog.speed = 30;

Это норма? то есть собака бежать даже не начинала - а скорость ее уже 30 км/ч

Я python не шарю - но судя по спичу - инкапсуляции в нем нет.

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

private методы и поля есть в python?

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

Нет. Есть только договоренность, которая показывает "это поле типа приватное", но доступ всё равно есть

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

ну значит и инкапсуляции в нем нет!

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

Общеизвестно, что в питоне есть ООП. Значит, должны быть три базовых принципа ООП - инкапсуляция, наследование и полиморфизм. И они есть.


Можно зайти с другой стороны. Если я буду работать только с public полями и методами, от этого пропадёт инкапсуляция? Ну, тоже не пропадёт. Значит, инкапсуляция - оно не про сокрытие.


Но мне не трудно оставить вас при своём мнении :)

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

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


А если это еще и не обычный сайт а например управление цехом на заводе? А если управление космическим кораблем? Атомной электростанцией?

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

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


И да, софт может убивать, как в той истории про рентген-аппарат https://habr.com/ru/company/pvs-studio/blog/307788/


От того, что у вас есть private, ситуация кардинально не меняется. Можно в неправильном порядке вызывать методы. Подавать неверные аргументы. Изменение поля напрямую только один из примеров неправильного кода, и что он должен доказать?

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

Кардинально все меняется! Нужно правильно софт писать и будет все ок! Никакой неправильпый порядок не помешает! Валидируем данные, паттерн State и State Machine еще почитай  - и все ок

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

Тогда и dog.speed ничего не сломает)

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

Как это? Все сломает! У нее сразу скорость будет 30км/ч вместо ожидаемых 0.

Все, гонка выиграна

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

Не пойму я твоей логики. Давай на примере. Пусть собаку по документации надо использовать так:

dog = Dog(legs=4, name="vasya")
dog.move_to("start")
dog.run()  # тут внутри меняем self.speed
dog.move_to("home")

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


Ты утверждаешь, что порядок вызова можно проверять. Ну да. Тогда можно также проверять, что до run скорость была 0.


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

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

Можно написать даже


dog = cat


И что?)


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

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

что за пример - dog = cat? при чем это вообще

я навел конкретный пример - собака не начинала даже бежать - а скорость уже равна 30, координаты собаки тожде не менялись, и т.д.


ограничение тоже важно! то что вы рассказываете - это просто архитектурное решение!

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

dog = cat - это пример присвоения кошки в собаку. Ровно как dog.speed = 30 - мы можем запрограммировать что угодно. В каких-то языках нам типизация что-то запрещает, в каких-то - наличие private. А в каких-то таких ЯП ограничений нет или меньше.


В С++ я могу сделать speed как public, и тогда я тоже смогу изменить скорость в любой момент. Бизнес-логика выходит за рамки обсуждаемого)

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

Можно писать что угодно - вопрос - зачем нужна инкапсуляция?

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

Чтобы объединить данные и методы для управления ими. Это куда удобнее, чем везде передавать структуру

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

То есть все методы которые работают с полями обьекта и есть инкапсуляция?

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

Инкапсуляция - это объединение данных и методов для работы с этими данными. То есть да, поля и методы - это и есть инкапсуляция


Сокрытие - это техническая деталь реализации инкапсуляции, которой может и не быть

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества