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

Вроде всю жизнь было 4 основных принципа ООП? - Абстракция, инкапсуляция, наследование, полиморфизм.

Инкапсуляция - именно что сокрытие. Сокрытие внутреннего состояния, предоставление публичного набора методов.

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

Пост не читали? Абстракцию добавили как четвёртый принцип относительно недавно (меньше 10 лет), и я удивляюсь до сих пор.

Про инкапсуляцию в посте

Некоторые ошибочно говорят про "сокрытие" и начинают про private-public-protected, но этого не требуется. Поэтому, например, в python нет сокрытия, а инкапсуляция всё ещё есть.


Про абстракцию

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

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

Эм. Какие меньше 10 лет?)))) Я когда начинал изучать, лет 15 назад, уже была одним из принципов.

Про сокрытие. В питоне вообще невозможно скрыть внутреннее состояние объекта?

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

Меня в 2010 году учили, что ООП стоит на 3 китах, а абстракция была основным инструментом в любой парадигме. Даже переменная сама по себе абстракция.


Нет, нельзя скрыть. Можно с помощью _name заявить, что name — внутреннее поле не для использования снаружи, с помощью __name изменить порядок доступа (но залезть всё равно нужно, просто синтаксис становится кривым), вроде с помощью костыля переопределить метода доступа к аттрибуту и создать ещё больший барьер для доступа — но полностью скрыть нельзя

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

Странно... Точно помню что меня учили именно 4 принципам ООП. Питон вообще не знаю, не думал что там так устроено и этот аспект оставлен на ответственность разработчика.

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

Разве ты не согласен, что абстракция в программировании везде? Ты абстрагируешь какой-то алгоритм в функции, ты абстрагируешься от машинных кодов всякими компиляторами. Это везде в профессии и к ООП не относится


Прикол в том, что в питоне нет сокрытия, но при этом есть ООП. Значит, сокрытие не часть ООП. Более того, можно сокрытие сделать на чистом Си (в заголовочном файле определив структуру Точка с координатами X, Y - в этом случае в файле реализации получить доступ к координатам нельзя, но можно использовать функции сложения точек, например). То есть сокрытие есть, а ООП нет

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

Под абстракцией я понимаю более узкое определение - абстракция некое описание/представление объекта. Описание отдельно - операции с данными отдельно. Интерфейс - класс имплементирующий этот интерфейс.

Под сокрытием я тоже не про private/protected. А скорее про то что вызывая метод объекта, пользователь не видит что происходит в этом методе, есть набор параметров и есть ожидаемый результат, все что внутри - черный ящик, инкапсуляция

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

Я могу создать структуру Точка, у которой есть координаты. Так делали со времён Си. Это абстракция, в результате применения которой ООП не появляется


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

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества