Основы ООП: принципы объектно-ориентированного программирования на простых примерах
Это упрощает написание гибких и расширяемых программ, где взаимодействие объектов может быть разнообразным и динамическим. Этот принцип гласит, что вся важная информация, необходимая для работы объекта, в нем же и хранится. И только определенные принцип ооп данные доступны для внешних функций и объектов. Все языки программирования предоставляют их пользователю определённые абстракции. В примере выше значение переменной name задаётся при создании объекта и не может быть изменено извне, так как сеттер для переменной отсутствует. В сеттере для переменной age реализована проверка на корректность передаваемого параметра и выброс исключения при неверном значении.
Курс Full Stack (JavaScript + Java)
Абстракция — очередной принцип объектно-ориентированного подхода. С ним разработчики могут представлять сложные системы с использованием абстракций, которые описывают только необходимые для решения задачи детали, скрывая сложность реализации. Для каждого класса должно быть определено единственное назначение. Все ресурсы, необходимые для его осуществления, должны быть инкапсулированы в этот класс и подчинены только этой задаче. Что-то в духе шаблона, на базе которого строятся другие элементы структуры кода.
Принцип разделения интерфейса (ISP) — I
При этом класс, который является наследником какого-либо класса, может быть суперклассом для одного или нескольких других классов. Также в отличие, например, от C++, в Java в строгом смысле отсутствует множественное наследование, то есть любой класс может иметь не более одного класса-родителя. А все классы, суперкласс у которых явно не указан, по умолчанию наследуются от класса Object. Инкапсуляция в программировании является объединением данных и кода, работающего с этими данными, в большинстве случае это сводится к тому, чтобы не давать доступа к важным данным напрямую. Вместо этого мы создаем ограниченный набор методов, с помощью которых можно работать с нашими данными.
Что такое объекты и классы: 1‑я часть гайда по ООП
Такие объекты могут вести себя как отдельные, абсолютно автономные вычислительные единицы. Данный подход реализован в языках программирования Smalltalk, Ruby, Objective-C, Python. Наследование является одним из важнейших принципов объектно-ориентированного программирования, поскольку оно позволяет создавать иерархические структуры объектов. Используя наследование, можно создать общий класс, который будет определять характеристики и поведение, свойственные какому-то набору связанных объектов. В дальнейшем этот класс может быть унаследован другими, более частными классами, каждый из которых будет добавлять уникальные, свойственные только ему характеристики и дополнять или изменять поведение базового класса.
- Объектно-ориентированное программирование определяют через четыре принципа, по которым можно понять основы работы.
- Людям проще воспринимать окружающий мир как объекты, которые поддаются определенной классификации (например, разделение на живую и неживую природу).
- Что-то в духе шаблона, на базе которого строятся другие элементы структуры кода.
- Наследование реализует отношение «является» (“is-a”) между суперклассом и подклассом.
- Можно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы.
Внутри они могут работать по-разному, но внешне всё будет выглядеть одинаково. Программисты договорились, что данные внутри объекта будут называться свойствами, а функции — методами. Но это просто слова, по сути это те же переменные и функции.
Несмотря на то, что кошки и попугаи спят по-разному (кошка сворачивается клубком, а попугай сидит на жёрдочке), для этих действий можно использовать одну команду. У нас есть методы для зарядки и показа текущего значения, однако мы не даем доступ к самой переменной _batteryLife, поэтому, например, пользователи класса не смогут убавить значение нашей переменной. Несмотря на отмеченные недостатки, Буч утверждает, что выгоды от использования ООП более весомы. Кроме того, повышение производительности за счёт лучшей организации ООП-кода, по его словам, в некоторых случаях компенсирует дополнительные накладные расходы на организацию функционирования программы. Можно также заметить, что многие эффекты снижения производительности могут сглаживаться или даже полностью устраняться за счёт качественной оптимизации кода компилятором. Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту.
Команда одинакова, но ее выполнение адаптируется в зависимости от контекста устройства. В базовом случае мы просто выводим сообщение о том, что команда выполняется, на экран (Show). У умных часов экран маленький, поэтому нам нужен особый способ вывода сообщения на экран (ShowOnSmallScreen), а у умной колонки вообще может не быть экрана, поэтому сообщение лучше озвучить голосом (Say).
Обратим внимание, что направление зависимостей совпадает с диаграммой, которую мы обозначили ранее. Это помогает следить за тем, что бизнес-логика не нарушается, а отношения между сущностями отражают действительность. Мы можем написать функцию, которая будет создавать такие объекты — фабрику.
Это плохо, потому что при высоком сцеплении изменение в одной части программы будет вызывать много изменений в других частях. Мы все так же можем использовать класс Record для пополнения истории записей, но теперь там могут содержаться уже не только траты, но и доходы. Если мы не вынесем эту функциональность в класс Истории, нам придётся заново писать, как считать это значение. Это плохо, потому что когда в нашем коде много одинаковой функциональности раскидано по разным модулям, мы легко можем забыть обновить какой-то из модулей при изменении.
Объектно-ориентированное программирование (сокращённо ООП) — это парадигма разработки программного обеспечения, согласно которой приложения состоят из объектов. Это первая статья из серии, посвящённой объектно-ориентированному программированию. Она предназначена для тех, кто хочет понять суть этой парадигмы разработки, а не просто научиться использовать классы и объекты. Дальнейшее уточнение приводит к выделению более мелких фрагментов описания.
Взаимодействие с объектами, а не логикой упрощает понимание кода. Для модификации не нужно погружаться в то, как построено ПО. Благодаря полиморфизму можно быстро адаптировать код под требования задачи, не описывая новые объекты и функции. Одинаковые методы разных объектов могут выполнять задачи разными способами. У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному».
Интерфейсы могли бы нам помочь обеспечить полиморфность. Так как интерфейс — это всего лишь «контракт на поведение», любая реализующая его сущность этот контракт выполняет. Это значит, что тот, кто пользуется реализацией этого интерфейса, может использовать любой реализующий его объект. Следующее, на что мы обратим внимание, это почему наши траты представляются классом Record, а не, например, Spending.
IT курсы онлайн от лучших специалистов в своей отросли https://deveducation.com/ .