Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГАК-2026.docx
Скачиваний:
1
Добавлен:
16.06.2026
Размер:
2.66 Mб
Скачать

5. Основные принципы объектно-ориентированного программирования

Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на использовании объектов и классов для организации программного кода. Основной целью ООП является повышение удобства разработки, повторного использования кода и упрощение сопровождения программ.

ООП основано на четырёх основных принципах.

Инкапсуляция — это объединение данных и методов, которые работают с этими данными, в одной структуре — объекте. При этом внутренние детали реализации могут быть скрыты от пользователя.

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

Полиморфизм — это возможность использовать один и тот же интерфейс для работы с объектами разных типов. Это позволяет использовать общие методы для различных объектов.

Абстракция — это выделение только наиболее важных характеристик объекта и скрытие второстепенных деталей.

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

Вопрос 5: Основные принципы ооп: инкапсуляция, наследование, полиморфизм, абстракция

1. Что такое ооп?

Объектно-ориентированное программирование (ООП) — это парадигма программирования, в которой программа рассматривается как совокупность взаимодействующих объектов, каждый из которых является экземпляром определённого класса.

Если процедурное программирование отвечает на вопрос «Что нужно сделать?», то ООП отвечает на вопрос «С какими сущностями мы работаем и что они могут делать?».

Основная идея: объединить данные и методы их обработки в одной сущности — объекте.

2. Класс и объект — фундаментальные понятия

Прежде чем разбирать принципы, нужно чётко понимать разницу между классом и объектом.

Класс

Класс — это шаблон, чертёж, описание того, какие данные и методы будут у объектов этого типа. Класс существует только в коде, в памяти его нет.

Пример класса на Python:

Объект

Объект — это конкретный экземпляр класса, созданный по этому чертежу. Объект занимает память, имеет конкретные значения полей.

Пример создания объектов:

У каждого объекта свои значения полей, но методы общие (описаны в классе).

3. Четыре принципа ООП

Классические четыре принципа: абстракция, инкапсуляция, наследование, полиморфизм. Именно в таком порядке их часто называют, хотя логически абстракция — это первый шаг проектирования.

4. Абстракция (Abstraction)

Определение

Абстракция — это выделение существенных характеристик объекта и отбрасывание несущественных для решения конкретной задачи.

Проще говоря: мы смотрим на реальный объект и решаем, какие его свойства важны в нашей программе, а какие — нет.

Суть

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

Пример

Рассмотрим реального человека. У него есть:

  • Имя, возраст, пол, рост, вес.

  • Цвет глаз, цвет волос, размер обуви.

  • Номер паспорта, ИНН, СНИЛС.

  • Любимая еда, хобби, политические взгляды.

  • ДНК, группа крови, отпечатки пальцев.

Для информационной системы вуза важны: имя, возраст, номер студенческого билета, группа, оценки. Всё остальное — несущественно.

Для медицинской системы важны: рост, вес, группа крови, аллергии, хронические болезни. Имя может быть не важно (пациент №12345).

Для системы интернет-магазина важны: имя, адрес доставки, телефон, история покупок.

В каждом случае мы создаём абстракцию человека, соответствующую задаче.

Код

Мы абстрагировались от всего, что не связано с учебой.

Связь с другими принципами

Абстракция — это первый шаг. После того как мы выделили важные свойства, мы можем:

  • спрятать их реализацию (инкапсуляция);

  • создать иерархию (наследование);

  • работать с разными объектами единообразно (полиморфизм).

5. Инкапсуляция (Encapsulation)

Определение

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

В русском языке слово "капсула" — это как раз образ: объект — это капсула, внутри которой данные, а снаружи — только ручки (методы) для управления.

Две стороны инкапсуляции

  1. Объединение данных и методов в одной сущности (классе).

  2. Сокрытие внутренней реализации от внешнего кода.

Зачем это нужно?

  1. Защита данных от некорректного изменения. Объект сам контролирует свои данные.

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

  3. Возможность менять внутреннюю реализацию, не ломая внешний код.

Модификаторы доступа

В разных языках они называются по-разному, но суть общая:

  • private (закрытый) — доступ только внутри этого класса.

  • protected (защищённый) — доступ внутри класса и в классах-наследниках.

  • public (открытый) — доступ отовсюду.

  • (в Python нет строгих модификаторов, есть соглашения: _один_подчёркивание — "пожалуйста, не трогай", __два_подчёркивания — механизм name mangling для сильного сокрытия).

Пример (C++ с модификаторами)

Внешний код не может напрямую написать account.balance = 1000000 — компилятор не позволит. Только через методы deposit и withdraw, которые проверяют корректность операций.

Пример (Python — на соглашениях)

В Python инкапсуляция реализуется через свойства (property) и соглашения об именах:

Прямой доступ к __balance снаружи приведёт к ошибке (из-за name mangling).

6. Наследование (Inheritance)

Определение

Наследование — это механизм, позволяющий создать новый класс на основе существующего. Новый класс (дочерний, подкласс) получает все поля и методы родительского класса (суперкласса) и может:

  • добавить новые поля и методы;

  • переопределить существующие методы родителя.

Зачем нужно?

  1. Переиспользование кода. Общая функциональность выносится в родительский класс.

  2. Создание иерархий. Объекты реального мира часто образуют иерархии: "Животное -> Млекопитающее -> Собака".

  3. Полиморфизм. Наследование — основа для полиморфной работы.

Виды наследования

  • Простое (один родитель).

  • Множественное (несколько родителей) — есть в C++, Python, но нет в Java, C# (там только интерфейсы).

  • Многоуровневое (цепочка: дедушка -> отец -> сын).

Пример (Python)

Важные моменты

  • Конструктор родителя обычно нужно вызывать явно (в Python через super().__init__).

  • Можно переопределять методы полностью или дополнять (вызвав родительский метод через super()).

  • Наследование создаёт отношение "is-a" (является). Кошка — это Животное.

Проблемы наследования

  • Хрупкость базового класса. Изменения в родителе могут сломать потомков.

  • Тесная связь. Дочерний класс сильно зависит от родительского.

  • Проблема ромба при множественном наследовании (когда два родителя наследуют от одного общего).

Современная тенденция: предпочитать композицию наследованию (принцип "предпочитайте композицию, а не наследование").

7. Полиморфизм (Polymorphism)

Определение

Полиморфизм — это способность объектов с одинаковым интерфейсом иметь различную реализацию.

Буквально: "много форм". Один и тот же вызов метода приводит к разным действиям в зависимости от типа объекта.

Суть

Мы можем работать с разными объектами единообразно, не зная их точного типа. Каждый объект сам знает, как ему выполнить действие.

Виды полиморфизма

  1. Ad-hoc полиморфизм (перегрузка методов) — одно и то же имя метода, но разные параметры. Реализуется внутри одного класса. (В Python перегрузки нет в классическом виде, но есть параметры по умолчанию).

  2. Параметрический полиморфизм (дженерики, шаблоны) — код работает с разными типами данных. Например, список может хранить любые типы. В C++ это шаблоны, в Java/C# — дженерики, в Python — утиная типизация.

  3. Полиморфизм подтипов (наследование) — основной для ООП. Объекты разных классов, унаследованных от общего родителя, могут использоваться через ссылку на родительский тип.

Пример полиморфизма подтипов

Продолжим пример с животными

Функция заставить_подать_голос ожидает объект типа Животное (или любого потомка). Она вызывает метод подать_голос, и выполняется та версия метода, которая соответствует реальному типу объекта. Это и есть полиморфизм.

Как это работает внутри?

  • При наследовании и переопределении методов создаётся таблица виртуальных методов (vtable).

  • Во время выполнения программа смотрит в эту таблицу и вызывает нужный метод.

  • Это называется поздним связыванием (динамическая диспетчеризация).

Пример на C++ для понимания механизма

Утиная типизация (duck typing)

В языках с динамической типизацией (Python, JavaScript) полиморфизм работает ещё шире — через утиную типизацию.

Принцип: "Если это выглядит как утка, плавает как утка и крякает как утка, то это утка".

Не важно, от кого унаследован объект. Важно, есть ли у него нужный метод.

8. Взаимосвязь принципов

Четыре принципа работают вместе:

  1. Абстракция помогает выделить, какие классы нам нужны и какие методы у них будут.

  2. Инкапсуляция прячет детали реализации внутри классов.

  3. Наследование позволяет строить иерархии и переиспользовать код.

  4. Полиморфизм позволяет работать с объектами иерархии единообразно.

Пример из жизни:

  • Абстракция: мы поняли, что в программе нужны "Транспортные средства".

  • Инкапсуляция: каждый транспорт сам хранит свою скорость и знает, как ехать.

  • Наследование: создали классы "Автомобиль", "Мотоцикл", "Велосипед" от общего предка.

  • Полиморфизм: функция "проехать_до_цели" принимает любой транспорт и вызывает его метод "ехать", не задумываясь, автомобиль там или велосипед.

9. Частые вопросы на экзамене

Чем отличается абстракция от инкапсуляции?

Абстракция отвечает на вопрос "что делает объект?". Инкапсуляция — "как это реализовано?". Абстракция — про внешнее поведение, инкапсуляция — про внутреннее устройство.

Можно ли ООП без наследования?

Можно. Прототипное ООП (JavaScript) использует прототипы вместо классов. Композиция часто предпочтительнее наследования.

Что такое виртуальный метод?

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

Что такое интерфейс?

Абстрактный тип, который определяет набор методов, но не реализует их. Класс, реализующий интерфейс, обязан предоставить реализацию этих методов. В Java, C# интерфейсы используются для полиморфизма без наследования реализации.

6. Постановка задач управления, их структуризация и алгоритмизация

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

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

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

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