Объясняем, что такое объектно-ориентированное программирование (ООП), почему оно основывается на объектах и классах и как понимать принципы ООП.
Объектно-ориентированное программирование — это подход к разработке программного обеспечения. Он пришел на смену процедурному подходу, где программа — это множество операций, которые выполняются одна за другой.
Первым языком с объектно-ориентированным подходом был язык Симула, который создали в 1967 году. В язык ввели новые сущности: объекты и классы. Но тогда этим идеям не уделили большого внимания. Алан Кэй, ученый в области компьютерных технологий, и программист Дэн Ингаллс развили эти подходы в языке Smalltalk, который стал первым популярным объектно-ориентированным языком программирования.
Объектно-ориентированный подход — это когда язык программирования использует объекты, чтобы описать машине, что нужно сделать. Объектно-ориентированными называют языки Java, JavaScript, Python, C++, Ruby, Swift, PHP и ряд других, хотя некоторые из них могут использовать несколько подходов, в том числе функциональный и процедурный.
Тип | Языки программирования |
Объектно-ориентированные |
|
Гибридные (ООП и другие подходы) |
|
Не объектно-ориентированные, но известные языки программирования |
|
Java — объектно-ориентированный язык программирования. Благодаря этому он очень структурированный и организованный, но непростой. Если вы хотите разобраться в нём — поступайте в Skypro на курс «Java-разработчик». Эксперты расскажут об основах Java и подробно объяснят, как выполнять принципы объектно-ориентированного программирования.
Суть объектно-ориентированного программирования
Программа в объектно-ориентированном подходе состоит из объектов и классов. Этот подход основывается на том, что человеку легко представить мир как систему категорий и их представителей.
Например, в реальном мире есть категория «обувь». К ней относят туфли на высоком каблуке и кроссовки. У них есть общие свойства — носок и платформа, а еще назначение — носить на ногах.
Кроссовки и туфли по отдельности составляют еще два отдельных класса объектов с новыми общими свойствами и назначением: например, кроссовки — спортивная обувь, а у туфель есть каблук определенной высоты. Класс-потомок тоже может быть родителем: например, «кроссовки» можно разделить на классы «кроссовки для бега», «кроссовки для тенниса» и так далее.
Класс — это и шаблон, и категория объектов. По шаблону «кроссовки» можно составить новую пару кроссовок, у которых будут типичные для этого класса свойства с какими-то новыми значениями.
Объект — это нечто конкретное, поэтому у каждого объекта есть или могут быть:
- Свойства, которые записаны в полях.
- Поведение, которое записано в методах.
В реальном мире объектами в классе «обувь» были бы конкретные пары обуви. Например, пара туфель от Chanel и пара кроссовок от Nike стали бы объектами в двух разных классах «туфли» и «кроссовки», а еще в общем классе «обувь». В программировании такое тоже возможно: классы могут быть вложены друг в друга.
Зачем пользуются ООП
У кода, который написан по принципам объектно-ориентированного программирования, есть три свойства:
- его можно использовать повторно;
- этот код гибкий и модульный: его части можно изменять, не затрагивая целую программу;
- он понятный и простой для чтения.
Код становится таким благодаря четырем основным принципам ООП.
Принципы ООП
В процедурном программировании данные и функции, которые их используют, не связаны напрямую. С таким кодом сложно работать:
- Любая часть программы может изменить любые данные. Ошибки трудно отслеживать.
- Разработчику нужно разобрать весь код, чтобы понять, как используют данные.
- Изменение одного элемента может вызвать ошибки в других частях кода.
- Код трудно разделить на независимые части. Любые изменения в одной части программы могут вызывать поломку программы в целом.
Объектно-ориентированное программирование появилось, чтобы решить эти проблемы, поэтому в его основе лежат четыре принципа.
Абстракция
Принцип абстракции указывает, что у объекта должны быть определенные характеристики, которые отличают его от объектов иного типа. Так объект будет работать только с теми данными, которые ему нужны. Эти черты показывают, что объект делает и как он себя ведет. Среди характеристик нет ничего лишнего.
Например, у объектов класса «кроссовки» нет свойства «каблук», только «подошва»; а у объектов класса «туфли» может не быть метода «занятие спортом».
Инкапсуляция
Инкапсуляция объединяет данные и методы в одном классе и скрывает детали от пользователя. Это упрощает работу с кодом и снижает риск ошибок. Пользователь видит только то, что разработчик хочет ему показать.
Например, пользователь меняет свойства объекта «кроссовки модель № ХХ» только через специальные функции, которые заранее определены. Он может изменить цвет с зеленого на красный, убрать или добавить танкетку, изменить тип шнурков. Но он не может убрать свойство «цвет» и заменить его на «тип подключения к мобильному устройству». Поэтому в программу невозможно внести неожиданные изменения, которые могут ее сломать.
Инкапсуляцию реализуют с помощью ключевых слов, которые разработчики пишут перед именем классов и интерфейсов:
- public: для открытых данных и методов, доступных пользователю;
- private: для закрытых данных и методов, недоступных пользователю;
- protected: для данных и методов, доступных только наследникам, — о них ниже;
- internal: для данных и методов, доступных только внутри одной версии приложения.
Наследование
Наследование позволяет классам брать свойства и методы у других классов. Благодаря этому код становится более лаконичным и его проще переиспользовать: ссылаться на уже существующие части функциональности, вместо того чтобы писать их заново.
Например, классы «кроссовки» и «туфли» в дополнение к своим уникальным характеристикам будут наследовать свойства и методы класса «обувь»: то, что все их носят на ногах, и то, что у всех есть подошва.
Наследование может быть множественным: один класс может считать своими родителями сразу несколько классов и наследовать все их свойства. Не все языки поддерживают эту возможность: только Эйфель, Python и C++. Другие языки — Java, Delphi и C# — позволяют классу наследоваться от одного класса-предка, но при этом реализовать методы нескольких интерфейсов, специальных сущностей с несколькими методами внутри. Этот механизм заменяет множественное наследование.
Python сочетает в себе несколько подходов, но считается одним из самых простых языков для новичков. Если вы хотите разобраться, как именно в нём работают объекты и классы, как хранится информация в свойствах и какие есть основные методы, — поступайте на курс «Python-разработчик».
Полиморфизм
Полиморфизм позволяет применять к разным объектам одни методы, которые при этом могут вести себя по-разному. Для этого полиморфизм предлагает инструмент «переопределение свойств и методов».
Представим, что у кроссовок и туфель в нашей программе есть один и тот же метод: «использовать по прямому назначению». Мы можем применить его к любой обуви: калошам, танцевальным туфлям или кроссовкам для бега. Но вот суть метода будет разной: у калош — «ходить по лужам», у танцевальных туфель — «танцевать», у кроссовок для бега — «бегать».
Такое изменение сущности метода еще называют перегрузкой метода, функции или операции.
Главное про ООП
- ООП заменило процедурное программирование. Первым популярным ОО-языком стал Smalltalk, который разработали Алан Кэй и Дэн Ингаллс. Затем появились и другие языки: Java, Python, C++, C#, Ruby.
- В ООП программа состоит из объектов и классов. Классы — это шаблоны объектов. Объекты наследуют от классов характеристики: свойства, которые описывают объекты, и методы, которые определяют их поведение.
- ОО-код переиспользуемый, гибкий и понятный благодаря четырем принципам ООП.
- Абстракция ограничивает объект необходимыми характеристиками. Так объект работает только с нужными данными.
- Инкапсуляция объединяет данные и методы в классе, но скрывает их детали и делает невозможными неожиданные и случайные изменения в коде.
- Наследование позволяет объектам забирать свойства у своего шаблона. Классы также могут наследоваться от других классов. В некоторых языках — например, Эйфель, Python и C++ — класс может наследоваться сразу от нескольких классов.
- Полиморфизм позволяет применять для разных объектов одни и те же методы, которые ведут себя по-разному.
Добавить комментарий