xheirt
@xheirt
Java, Python

Какие основные понятия в ООП?

О основных понятиях вопросов нет, всем понятно, что это Наследование, полиморфизм и инкапсуляция, но вороша просторы гугла я понял что ничего не понял. Есть еще какие то композиция, и ассоциация. Причем что на разных сайтах пишут по разному, где то 3 основных это наследование, композиция и агрегация, а где то вообще какая то Абстракция. Подскажите пожалуйста в чём правда кроется, просто чем глубже я рыл, тем сильнее не понимал. Заранее спасибо за ответ)
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
Агрегация/Ассоциация/Композиция - это всё виды взаимоотношений между разными типами. Это не принципы
Абстракция - это просто сама возможность вводить какие-то новые абстракции, поверх уже существующих. Ради этого ООП и придумано.

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

И уже споров о глубинном смысле трёх волшебных слов была целая куча (а ведь если бы кто-то когда-то не решил всё уместить в одиночные слова - этой неразберихи бы не было)

Так что из всех принципов, которые объединяют все более-менее ООП-языки остаётся только:

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

В общем-то первый такой принцип можно назвать этой самой абстракцией и, отчасти, инкапсуляцией.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
  • Инкапсуляция - это самое простое. В объекте лежат данные и методы для работы с ними (причём данными могут быть и другие объекты. см. Композиция). Самое главное в инкапсуляции - не переборщить. Инкапсулировать только то, что относится одной конкретной задаче. Всё остальное делегировать другим объектам (см. Композиция).
  • Наследование - это тоже самое простое и самое опасное. Захотел добавить новый функционал к уже существующему классу - унаследовался, дописал методик - и в путь! А потом исходный класс поменяли, и он стал ломать поведение унаследованного. Лучше всего взять себе за правило наследоваться только от абстрактных классов. А поведение менять с помощью свойств-объектов других классов (см. Композиция).
  • Полиморфизм. Один метод - поведение разное. Проще всего достигается за счёт использования свойств-объектов других классов (см. Композиция).
  • Композиция - это самое интересное. Объект действует не сам по себе, а с помощью свойств-объектов, которые передаются в конструктор при создании объекта. Например, у нас есть класс Модели, который должен уметь делать КРУД. А точнее сам по себе он содержит только данные, а в качестве зависимости в него передаётся объект для работы с БД, имеющий собственно эти самые методы create(), read(), update() и delete(). И вот этот объект может быть как инстансом класса, работающего, например, с Mysql, а может быть - работающего с Редисом. И теперь, в зависимости от наших потребностей, одна и та же модель может сохраняться как в Редис, так и в РСУБД. Без изменения и единственной строчки кода!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы