Структура ООП
Объекты и классы
Для упрощения кода программа разбита на самостоятельные блоки - объекты. В реальной жизни это может быть стол, чашка, человек, книга, здание и многое другое. В программировании объекты — это структуры данных: пользователь, кнопка, сообщение. Они, как и настоящие объекты, могут иметь свойства: цвет, содержимое или имя пользователя. А для объединения объектов со схожими свойствами существуют классы.
Класс — это «шаблон» для объекта, который описывает его свойства. Несколько объектов, похожих друг на друга, например, профили разных пользователей, будут иметь одинаковую структуру и, следовательно, принадлежат к одному классу. Каждый объект является экземпляром некоторого класса.
Понять, что такое ООП, поможет аналогия.
Атрибуты и методы
Объект — это набор переменных и функций, как и в традиционном функциональном программировании. Переменные и функции являются его свойствами.
Принципы ООП
Объектно-ориентированное программирование определяется четырьмя принципами, с помощью которых можно понять основы работы. Иногда число сокращается до трех — опускается понятие абстракции.
Абстракция
Абстракция — это способ изолировать набор наиболее важных атрибутов и методов и исключить второстепенные. Соответственно, абстракция — это использование всех таких характеристик для описания объекта. Важно представить объект минимальным набором полей и методов без ущерба для решаемой задачи.
Пример: объекту класса "программист" вряд ли понадобятся свойства "кулинарные способности" или "любимый цвет". Они не влияют на его возможности как программиста. Но «основной язык программирования» и «рабочие навыки» — важные свойства, без которых нельзя описать программиста.
Доступный извне набор атрибутов и методов действует как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, и им не нужно знать, как именно устроен объект внутри.
Инкапсуляция
Каждый объект является независимой структурой. Все, что ему нужно для работы, уже есть внутри него. Если он использует какую-то переменную, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код будет переписан, логика работы не изменится.
Инкапсуляция упрощает управление кодом. Выше мы сказали, что для доступа к объекту не нужно понимать, как работают его методы. Руководителю разработчика Ивану не нужно точно знать, как он программирует: главное, чтобы поставленные задачи выполнялись.
Внутренняя структура одного объекта закрыта от других: снаружи «видны» только значения атрибутов и результаты выполнения методов.
Наследование
Вы можете создавать классы и объекты, похожие друг на друга, но немного отличающиеся — у них есть дополнительные атрибуты и методы. Более общее понятие в этом случае становится «родителем», а более конкретное и детальное – «наследником».
Упомянутый программист Иван — человек. Но «человек» — это более общее определение, не описывающее свойства, важные конкретно для программиста. Можно сказать, что класс «программист» наследуется от класса «человек»: программист тоже человек, но у него есть дополнительные свойства.
В этом случае разработчик Иван будет и человеком, и программистом одновременно. Он будет иметь наборы свойств из обоих классов.
У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно унаследовать не только «программист», но и «директор».
Наследование позволяет реализовать сложные схемы с четкой иерархией «от общего к частному». Это делает код более понятным и масштабируемым. Нет необходимости многократно переписывать одни и те же свойства в разных объектах. Достаточно наследовать эти объекты от одного «родителя», и свойства «родителя» будут применены автоматически.
Полиморфизм
Одни и те же методы разных объектов могут выполнять задачи по-разному. Например, у «человека» есть метод «работать». Для «программиста» реализация этого метода будет означать написание кода, а для «директора» — рассмотрение вопросов управления. Но глобально оба будут работать.
Здесь важен единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалить. Как именно — зависит от объекта, но такой метод должен заниматься удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не обязательно вызывать его remove для какого-то объекта или как-то иначе. Это путает код.
Преимущества ООП
Модульность
Объектно-ориентированный подход позволяет сделать код более структурированным, его легко понять постороннему. Инкапсуляция объектов уменьшает количество ошибок и ускоряет разработку несколькими программистами, поскольку каждый может работать независимо.
Гибкость
Код ООП легко разрабатывать, дополнять и изменять. Это обеспечивает независимую модульную структуру. Взаимодействие с объектами, а не с логикой, упрощает понимание кода. Модификация не требует от вас погружения в то, как построено программное обеспечение. Благодаря полиморфизму можно быстро адаптировать код под требования задачи без описания новых объектов и функций.
Сохранение времени
Благодаря абстракции, полиморфизму и наследованию вам не нужно снова и снова писать один и тот же код. Это ускоряет разработку нового программного обеспечения. Интерфейсы и классы в ООП можно легко преобразовать в библиотеки, которые можно повторно использовать в новых проектах. ООП также экономит время при обслуживании и доработке приложения.
Безопасность
Программу сложно взломать, потому что инкапсулированный код недоступен извне.
Недостатки ООП
Трудный старт
Чтобы использовать ООП, вы должны сначала изучить теорию и освоить процедурный подход, поэтому барьер для входа высок.
Снижение производительности
Объектно-ориентированный подход несколько снижает производительность кода в целом. Программы работают немного медленнее из-за особенностей доступа к данным и большого количества сущностей.
Большой размер программы
Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный» код. Происходит это потому, что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте.