Введение
В данной статье рассматривается один из общих вопросов, который вам могут задать на собеседовании на должность Software Engineer.
Сам вопрос звучит так: "Назовите основные принципы ООП и дайте их краткое определение".
Основные принципы ООП
Обычно выделяют 4 основных принципа ООП, однако, не будет ошибкой, если вы также упомяните композицию и агрегирование.
- Наследование
- Инкапсуляция
- Абстракция
- Полиморфизм
- Композиция*
- Агрегирование*
1. Наследование
Наследование – это многократное использование кода, как правило, реализуемое с помощью подклассов. Благодаря наследованию, один класс может унаследовать функциональность другого класса. Наследование реализует отношение is-a (является). Например, класс Employee может быть унаследован от Person, т.е. Employee является Person.
2. Инкапсуляция
Инкапсуляция - это свойство системы, позволяющее объединить данные и методы, работающие с этими данным, и скрыть детали реализации от пользователя. Это, в свою очередь, позволяет минимизировать число связей между классами или структурами и, соответственно, упростить независимую реализацию и модификацию таких классов или структур.
3. Абстракция
Абстракция - это передача основной идеи объекта и игнорирование его деталей или особенностей. Другими словами, под абстракцией понимается упрощенная модель реальной сущности, созданная для решения конкретной задачи, которая выражена в объекте.
Т.е. любой объект - это абстракция, т.к. он только частично описывает реальную сущность. Во время преобразования реальной сущности в объект, он лишается множества несущественных для данной модели характеристик, присущих реальной сущности, оставляя только наиболее важные, т.е. необходимые и достаточные признаки для работы данной модели в текущем приближении.
Например, можно составить упрощенный класс самолёта, который умеет летать, ездить по взлетно-посадочной полосе, взлетать и садиться, а от всего остального мы абстрагируемся (в данным случае несущественно то, что самолет имеет множество элементов управления, различные датчики для измерения температуры или давления, вертикальной скорости и т.п.)
4. Полиморфизм
Все то, что во время компиляции или исполнения программы может содержать или обрабатывать значения различных типов — является полиморфным, например:
- переменные, меняющие свое значение на значение другого типа;
- объекты, обладающие свойствами, которые могут менять значение текущего типа на значение другого типа;
- функции, принимающие аргументы различных типов.
Термин "полиморфизм" обозначает семейство различных механизмов, позволяющих использовать один и тот же участок программы с различными типами в различных контекстах. Author: Бенджамин Пирс "Типы в языках программирования"
Полиморфизм в программировании — это возможность использования одного и того же кода с разными типами аргументов и переменных.
Существует две основные категории полиморфизма:
- Универсальный полиморфизм
- Параметрический полиморфизм
Универсально полиморфные функции работают на неограниченном количестве типов, причем функция будет выполняться для любого типа аргументов.
Специально полиморфные функции работают с конечным набором конкретных типов, не связанных между собой, где для каждого типа аргументов реализуется свой способ вычислений.
Универсальный полиморфизм делится на
- параметрический (parametric) полиморфизм и
- полиморфизм включений (inclusion).
Специальный полиморфизм делится на
- перегрузку (overloading) и
- приведение типов (coercion)
Параметрический полиморфизм позволяет описывать вычисления в общем виде. Другими словами, существует возможность описывать функции, которые будут работать с любыми типами данных. Такие функции называют параметрически полиморфными.
Полиморфизм включений — в этом виде полиморфизма функции или операторы могут содержать один или множество аргументов типы которых имеют подтипы.
Перегрузка — такой вид полиморфизма позволяет объявлять функции с одним и тем же именем, но с разными типами аргументов и их количеством (арностью). Говоря другими словами, у функции может быть несколько сигнатур.
Полиморфизм включений — в этом виде полиморфизма функции или операторы могут содержать один или множество аргументов, типы которых имеют подтипы.
5. Композиция
Композиция — это то, из чего состоит объект. К примеру, автомобиль состоит из разных частей, таких как четыре колеса, несколько сидений, двигатель и т. д.
Композиция — это более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.
6. Агрегирование
Агрегирование касается всего, что может быть объединено с объектом. Например, человек, не будучи частью автомобиля, может сидеть на водительском сиденье, а затем стать водителем. Два отдельных объекта объединены, чтобы сформировать новый компонент.
В объектно-ориентированном программировании под агрегированием подразумевают методику создания нового класса из уже существующих классов путём их включения.
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.